Commit dac8dea4 authored by Coly Li's avatar Coly Li Committed by Kelsey Skunberg

bcache: allocate meta data pages as compound pages

BugLink: https://bugs.launchpad.net/bugs/1892822

commit 5fe48867 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: default avatarColy Li <colyli@suse.de>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: default avatarIan May <ian.may@canonical.com>
Signed-off-by: default avatarKelsey Skunberg <kelsey.skunberg@canonical.com>
parent f66041f6
...@@ -317,7 +317,7 @@ int bch_btree_keys_alloc(struct btree_keys *b, unsigned page_order, gfp_t gfp) ...@@ -317,7 +317,7 @@ int bch_btree_keys_alloc(struct btree_keys *b, unsigned page_order, gfp_t gfp)
b->page_order = page_order; 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) if (!t->data)
goto err; goto err;
......
...@@ -798,7 +798,7 @@ int bch_btree_cache_alloc(struct cache_set *c) ...@@ -798,7 +798,7 @@ int bch_btree_cache_alloc(struct cache_set *c)
mutex_init(&c->verify_lock); mutex_init(&c->verify_lock);
c->verify_ondisk = (void *) 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); c->verify_data = mca_bucket_alloc(c, &ZERO_KEY, GFP_KERNEL);
......
...@@ -862,8 +862,8 @@ int bch_journal_alloc(struct cache_set *c) ...@@ -862,8 +862,8 @@ int bch_journal_alloc(struct cache_set *c)
if (!(init_heap(&c->flush_btree, 128, GFP_KERNEL)) || if (!(init_heap(&c->flush_btree, 128, GFP_KERNEL)) ||
!(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) || !(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) ||
!(j->w[0].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, JSET_BITS))) !(j->w[1].data = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP, JSET_BITS)))
return -ENOMEM; return -ENOMEM;
return 0; return 0;
......
...@@ -1506,7 +1506,7 @@ void bch_cache_set_unregister(struct cache_set *c) ...@@ -1506,7 +1506,7 @@ void bch_cache_set_unregister(struct cache_set *c)
} }
#define alloc_bucket_pages(gfp, 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) struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment