| From 38fde51131c5cb12f9fd4e0e13812d26e3b4d77e Mon Sep 17 00:00:00 2001 |
| From: Coly Li <colyli@suse.de> |
| Date: Sat, 25 Jul 2020 20:00:16 +0800 |
| Subject: [PATCH] bcache: allocate meta data pages as compound pages |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c |
| index 268f1b685084..ec48cf86cab6 100644 |
| --- a/drivers/md/bcache/bset.c |
| +++ b/drivers/md/bcache/bset.c |
| @@ -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; |
| |
| diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c |
| index b6a50e5e818e..b60cb7a99b18 100644 |
| --- a/drivers/md/bcache/btree.c |
| +++ b/drivers/md/bcache/btree.c |
| @@ -836,7 +836,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); |
| |
| diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c |
| index 33556acdcf9c..e145c2b1e2c9 100644 |
| --- a/drivers/md/bcache/journal.c |
| +++ b/drivers/md/bcache/journal.c |
| @@ -865,8 +865,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; |
| diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c |
| index de6d60ca1bd2..5248bca5e2ed 100644 |
| --- a/drivers/md/bcache/super.c |
| +++ b/drivers/md/bcache/super.c |
| @@ -1703,7 +1703,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) |
| { |
| -- |
| 2.27.0 |
| |