13 #include <linux/slab.h>
16 #include <linux/module.h>
18 #define DM_MSG_PREFIX "bufio"
28 #define DM_BUFIO_MIN_BUFFERS 8
30 #define DM_BUFIO_MEMORY_PERCENT 2
31 #define DM_BUFIO_VMALLOC_PERCENT 25
32 #define DM_BUFIO_WRITEBACK_PERCENT 75
37 #define DM_BUFIO_WORK_TIMER_SECS 10
42 #define DM_BUFIO_DEFAULT_AGE_SECS 60
48 #define DM_BUFIO_INLINE_VECS 16
53 #define DM_BUFIO_HASH_BITS 20
54 #define DM_BUFIO_HASH(block) \
55 ((((block) >> DM_BUFIO_HASH_BITS) ^ (block)) & \
56 ((1 << DM_BUFIO_HASH_BITS) - 1))
62 #define DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT (PAGE_SIZE >> 1)
63 #define DM_BUFIO_BLOCK_SIZE_GFP_LIMIT (PAGE_SIZE << (MAX_ORDER - 1))
166 #define DM_BUFIO_CACHE(c) (dm_bufio_caches[dm_bufio_cache_index(c)])
167 #define DM_BUFIO_CACHE_NAME(c) (dm_bufio_cache_names[dm_bufio_cache_index(c)])
169 #define dm_bufio_in_request() (!!current->bio_list)
189 #ifdef CONFIG_PREEMPT_VOLUNTARY
190 # define dm_bufio_cond_resched() \
192 if (unlikely(need_resched())) \
196 # define dm_bufio_cond_resched() do { } while (0)
204 static unsigned long dm_bufio_default_cache_size;
209 static unsigned long dm_bufio_cache_size;
215 static unsigned long dm_bufio_cache_size_latch;
224 static unsigned long dm_bufio_peak_allocated;
225 static unsigned long dm_bufio_allocated_kmem_cache;
226 static unsigned long dm_bufio_allocated_get_free_pages;
227 static unsigned long dm_bufio_allocated_vmalloc;
228 static unsigned long dm_bufio_current_allocated;
235 static unsigned long dm_bufio_cache_size_per_client;
240 static int dm_bufio_client_count;
258 &dm_bufio_allocated_kmem_cache,
259 &dm_bufio_allocated_get_free_pages,
260 &dm_bufio_allocated_vmalloc,
263 spin_lock(¶m_spinlock);
267 dm_bufio_current_allocated += diff;
269 if (dm_bufio_current_allocated > dm_bufio_peak_allocated)
270 dm_bufio_peak_allocated = dm_bufio_current_allocated;
272 spin_unlock(¶m_spinlock);
278 static void __cache_size_refresh(
void)
280 BUG_ON(!mutex_is_locked(&dm_bufio_clients_lock));
281 BUG_ON(dm_bufio_client_count < 0);
283 dm_bufio_cache_size_latch =
ACCESS_ONCE(dm_bufio_cache_size);
288 if (!dm_bufio_cache_size_latch) {
290 dm_bufio_default_cache_size);
291 dm_bufio_cache_size_latch = dm_bufio_default_cache_size;
294 dm_bufio_cache_size_per_client = dm_bufio_cache_size_latch /
295 (dm_bufio_client_count ? : 1);
320 enum data_mode *data_mode)
342 void *
data,
enum data_mode data_mode)
358 DMCRIT(
"dm_bufio_free_buffer_data: bad data mode: %d",
419 static void __unlink_buffer(
struct dm_buffer *b)
433 static void __relink_lru(
struct dm_buffer *b,
int dirty)
471 static void dmio_complete(
unsigned long error,
void *
context)
475 b->
bio.bi_end_io(&b->
bio, error ? -
EIO : 0);
479 bio_end_io_t *end_io)
482 struct dm_io_request
io_req = {
484 .notify.fn = dmio_complete,
486 .client = b->
c->dm_io,
488 struct dm_io_region
region = {
490 .sector = block << b->
c->sectors_per_block_bits,
495 io_req.mem.type = DM_IO_KMEM;
496 io_req.mem.ptr.addr = b->
data;
498 io_req.mem.type = DM_IO_VMA;
499 io_req.mem.ptr.vma = b->
data;
502 b->
bio.bi_end_io = end_io;
510 bio_end_io_t *end_io)
518 b->
bio.bi_sector = block << b->
c->sectors_per_block_bits;
519 b->
bio.bi_bdev = b->
c->bdev;
520 b->
bio.bi_end_io = end_io;
527 len = b->
c->block_size;
532 BUG_ON((
unsigned long)ptr & (len - 1));
538 BUG_ON(b->
c->block_size <= PAGE_SIZE);
539 use_dmio(b, rw, block, end_io);
551 bio_end_io_t *end_io)
553 if (rw ==
WRITE && b->
c->write_callback)
554 b->
c->write_callback(b);
558 use_inline_bio(b, rw, block, end_io);
560 use_dmio(b, rw, block, end_io);
573 static void write_endio(
struct bio *bio,
int error)
595 static int do_io_schedule(
void *
word)
611 static void __write_dirty_buffer(
struct dm_buffer *b)
628 static void __make_buffer_clean(
struct dm_buffer *b)
636 __write_dirty_buffer(b);
653 __make_buffer_clean(b);
664 __make_buffer_clean(b);
727 if (dm_bufio_cache_size_latch != 1) {
745 b = __get_unclaimed_buffer(c);
749 __wait_for_free_buffer(c);
755 struct dm_buffer *b = __alloc_buffer_wait_no_callback(c, nf);
769 static void __free_buffer_wake(
struct dm_buffer *b)
783 static void __write_dirty_buffers_async(
struct dm_bufio_client *c,
int no_wait)
799 __write_dirty_buffer(b);
808 unsigned long *threshold_buffers,
809 unsigned long *limit_buffers)
811 unsigned long buffers;
813 if (
ACCESS_ONCE(dm_bufio_cache_size) != dm_bufio_cache_size_latch) {
815 __cache_size_refresh();
819 buffers = dm_bufio_cache_size_per_client >>
825 *limit_buffers = buffers;
836 unsigned long threshold_buffers, limit_buffers;
838 __get_memory_limit(c, &threshold_buffers, &limit_buffers);
843 struct dm_buffer *b = __get_unclaimed_buffer(c);
848 __free_buffer_wake(b);
853 __write_dirty_buffers_async(c, 1);
867 if (b->
block == block)
885 b = __find(c, block);
892 new_b = __alloc_buffer_wait(c, nf);
900 b = __find(c, block);
902 __free_buffer_wake(new_b);
906 __check_watermark(c);
947 static void read_endio(
struct bio *bio,
int error)
975 b = __bufio_new(c, block, nf, &need_submit);
982 submit_io(b,
READ, b->
block, read_endio);
991 return ERR_PTR(error);
1002 return new_read(c, block,
NF_GET, bp);
1011 return new_read(c, block,
NF_READ, bp);
1020 return new_read(c, block,
NF_FRESH, bp);
1032 for (; n_blocks--; block++) {
1035 b = __bufio_new(c, block,
NF_PREFETCH, &need_submit);
1040 submit_io(b,
READ, b->
block, read_endio);
1081 __free_buffer_wake(b);
1109 __write_dirty_buffers_async(c, 0);
1124 unsigned long buffers_processed = 0;
1128 __write_dirty_buffers_async(c, 0);
1132 int dropped_lock = 0;
1134 if (buffers_processed < c->n_buffers[
LIST_DIRTY])
1135 buffers_processed++;
1140 if (buffers_processed < c->n_buffers[LIST_DIRTY]) {
1195 struct dm_io_request io_req = {
1197 .mem.type = DM_IO_KMEM,
1198 .mem.ptr.addr =
NULL,
1201 struct dm_io_region io_reg = {
1209 return dm_io(&io_req, 1, &io_reg,
NULL);
1235 new = __find(c, new_block);
1237 if (new->hold_count) {
1238 __wait_for_free_buffer(c);
1246 __make_buffer_clean(
new);
1247 __unlink_buffer(
new);
1248 __free_buffer_wake(
new);
1254 __write_dirty_buffer(b);
1272 old_block = b->
block;
1274 __link_buffer(b, new_block, b->
list_mode);
1275 submit_io(b,
WRITE, new_block, write_endio);
1279 __link_buffer(b, old_block, b->
list_mode);
1295 return i_size_read(c->
bdev->bd_inode) >>
1338 while ((b = __get_unclaimed_buffer(c)))
1339 __free_buffer_wake(b);
1343 DMERR(
"leaked buffer %llx, hold count %u, list %d",
1359 unsigned long max_jiffies)
1374 __make_buffer_clean(b);
1376 __free_buffer_wake(b);
1381 static void __scan(
struct dm_bufio_client *c,
unsigned long nr_to_scan,
1389 if (!__cleanup_old_buffer(b, sc->gfp_mask, 0) &&
1401 unsigned long nr_to_scan = sc->nr_to_scan;
1403 if (sc->gfp_mask & __GFP_IO)
1405 else if (!dm_bufio_trylock(c))
1406 return !nr_to_scan ? 0 : -1;
1409 __scan(c, nr_to_scan, sc);
1433 (block_size & (block_size - 1)));
1459 INIT_LIST_HEAD(&c->
lru[i]);
1474 if (IS_ERR(c->
dm_io)) {
1475 r = PTR_ERR(c->
dm_io);
1510 __free_buffer_wake(b);
1514 dm_bufio_client_count++;
1516 __cache_size_refresh();
1559 dm_bufio_client_count--;
1560 __cache_size_refresh();
1589 static void cleanup_old_buffers(
void)
1591 unsigned long max_age =
ACCESS_ONCE(dm_bufio_max_age);
1599 if (!dm_bufio_trylock(c))
1606 if (__cleanup_old_buffer(b, 0, max_age *
HZ))
1622 cleanup_old_buffers();
1636 static int __init dm_bufio_init(
void)
1640 memset(&dm_bufio_caches, 0,
sizeof dm_bufio_caches);
1641 memset(&dm_bufio_cache_names, 0,
sizeof dm_bufio_cache_names);
1658 dm_bufio_default_cache_size =
mem;
1661 __cache_size_refresh();
1678 static void __exit dm_bufio_exit(
void)
1686 for (i = 0; i <
ARRAY_SIZE(dm_bufio_caches); i++) {
1693 for (i = 0; i <
ARRAY_SIZE(dm_bufio_cache_names); i++)
1694 kfree(dm_bufio_cache_names[i]);
1696 if (dm_bufio_client_count) {
1697 DMCRIT(
"%s: dm_bufio_client_count leaked: %d",
1698 __func__, dm_bufio_client_count);
1702 if (dm_bufio_current_allocated) {
1703 DMCRIT(
"%s: dm_bufio_current_allocated leaked: %lu",
1704 __func__, dm_bufio_current_allocated);
1708 if (dm_bufio_allocated_get_free_pages) {
1709 DMCRIT(
"%s: dm_bufio_allocated_get_free_pages leaked: %lu",
1710 __func__, dm_bufio_allocated_get_free_pages);
1714 if (dm_bufio_allocated_vmalloc) {
1715 DMCRIT(
"%s: dm_bufio_vmalloc leaked: %lu",
1716 __func__, dm_bufio_allocated_vmalloc);
1739 module_param_named(allocated_get_free_pages_bytes, dm_bufio_allocated_get_free_pages, ulong, S_IRUGO);
1742 module_param_named(allocated_vmalloc_bytes, dm_bufio_allocated_vmalloc, ulong, S_IRUGO);
1745 module_param_named(current_allocated_bytes, dm_bufio_current_allocated, ulong, S_IRUGO);