]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bcache: allocate meta data pages as compound pages
authorColy Li <colyli@suse.de>
Sat, 25 Jul 2020 12:00:16 +0000 (20:00 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Aug 2020 11:05:25 +0000 (13:05 +0200)
commit 5fe48867856367142d91a82f2cbf7a57a24cbb70 upstream.

There are some meta data of bcache are allocated by multiple pages,
and they are used as bio bv_page for I/Os to the cache device. for
example cache_set->uuids, cache->disk_buckets, journal_write->data,
bset_tree->data.

For such meta data memory, all the allocated pages should be treated
as a single memory block. Then the memory management and underlying I/O
code can treat them more clearly.

This patch adds __GFP_COMP flag to all the location allocating >0 order
pages for the above mentioned meta data. Then their pages are treated
as compound pages now.

Signed-off-by: Coly Li <colyli@suse.de>
Cc: stable@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/bcache/bset.c
drivers/md/bcache/btree.c
drivers/md/bcache/journal.c
drivers/md/bcache/super.c

index 08768796b54397f7abd4ca8eb1ccb2f528e9b700..fda68c00ddd53f54934e773fafd21515708f402d 100644 (file)
@@ -321,7 +321,7 @@ int bch_btree_keys_alloc(struct btree_keys *b,
 
        b->page_order = page_order;
 
-       t->data = (void *) __get_free_pages(gfp, b->page_order);
+       t->data = (void *) __get_free_pages(__GFP_COMP|gfp, b->page_order);
        if (!t->data)
                goto err;
 
index 3c1109fceb2fb5aa74cee1edaffee4cd9b988b85..46556bde032e29b88768eee3bd227a3e5f24534d 100644 (file)
@@ -840,7 +840,7 @@ int bch_btree_cache_alloc(struct cache_set *c)
        mutex_init(&c->verify_lock);
 
        c->verify_ondisk = (void *)
-               __get_free_pages(GFP_KERNEL, ilog2(bucket_pages(c)));
+               __get_free_pages(GFP_KERNEL|__GFP_COMP, ilog2(bucket_pages(c)));
 
        c->verify_data = mca_bucket_alloc(c, &ZERO_KEY, GFP_KERNEL);
 
index 6730820780b067c918e15e63ee9086c3c8cbd008..8250d2d1d780c1a08a206040c2198f9a47b3a0bb 100644 (file)
@@ -1002,8 +1002,8 @@ int bch_journal_alloc(struct cache_set *c)
        j->w[1].c = c;
 
        if (!(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) ||
-           !(j->w[0].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS)) ||
-           !(j->w[1].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS)))
+           !(j->w[0].data = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP, JSET_BITS)) ||
+           !(j->w[1].data = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP, JSET_BITS)))
                return -ENOMEM;
 
        return 0;
index 168d6470785917c4b4fe063e61f5e92ad3f9e36c..25ad64a3919f61c2a4d6b5665c75eee8a55fa1d1 100644 (file)
@@ -1754,7 +1754,7 @@ void bch_cache_set_unregister(struct cache_set *c)
 }
 
 #define alloc_bucket_pages(gfp, c)                     \
-       ((void *) __get_free_pages(__GFP_ZERO|gfp, ilog2(bucket_pages(c))))
+       ((void *) __get_free_pages(__GFP_ZERO|__GFP_COMP|gfp, ilog2(bucket_pages(c))))
 
 struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
 {