linux/drivers/md/bcache
Coly Li f9c32a5a90 bcache: handle btree node memory allocation properly for bucket size > 8MB
Currently the bcache internal btree node occupies a whole bucket. When
loading the btree node from cache device into memory, mca_data_alloc()
will call bch_btree_keys_alloc() to allocate memory for the whole bucket
size, ilog2(b->c->btree_pages) is send to bch_btree_keys_alloc() as the
parameter 'page_order'.

c->btree_pages is set as bucket_pages() in bch_cache_set_alloc(), for
bucket size > 8MB, ilog2(b->c->btree_pages) is 12 for 4KB page size. By
default the maximum page order __get_free_pages() accepts is MAX_ORDER
(11), in this condition bch_btree_keys_alloc() will always fail.

Because of other over-page-order allocation failure fails the cache
device registration, such btree node allocation failure wasn't observed
during runtime. After other blocking page allocation failures for bucket
size > 8MB, this btree node allocation issue may trigger potentical risk
e.g. infinite dead-loop to retry btree node allocation after failure.

This patch fixes the potential problem by setting c->btree_pages to
meta_bucket_pages() in bch_cache_set_alloc(). In the condition that
bucket size > 8MB, meta_bucket_pages() will always return a number which
won't exceed the maximum page order of the buddy allocator.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2020-07-25 07:38:20 -06:00
..
alloc.c Revert "bcache: ignore pending signals when creating gc and allocator thread" 2020-03-02 20:01:32 -07:00
bcache.h bcache: handle cache prio_buckets and disk_buckets properly for bucket size > 8MB 2020-07-25 07:38:20 -06:00
bset.c bcache: allocate meta data pages as compound pages 2020-07-25 07:38:19 -06:00
bset.h bcache: explicity type cast in bset_bkey_last() 2020-02-01 07:55:39 -07:00
btree.c bcache: handle cache set verify_ondisk properly for bucket size > 8MB 2020-07-25 07:38:20 -06:00
btree.h bcache: remove dupplicated declaration from btree.h 2020-03-24 19:56:42 -06:00
closure.c bcache: don't export symbols 2019-11-13 15:42:51 -07:00
closure.h bcache: fix typo in code comments of closure_return_with_destructor() 2018-10-08 08:19:43 -06:00
debug.c bcache: Fix an error code in bch_dump_read() 2019-09-03 08:08:29 -06:00
debug.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
extents.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
extents.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
features.h bcache: increase super block version for cache device and backing device 2020-07-25 07:38:20 -06:00
io.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
journal.c bcache: journel: use for_each_clear_bit() to simplify the code 2020-07-25 07:38:19 -06:00
journal.h Revert "bcache: fix fifo index swapping condition in journal_pin_cmp()" 2019-11-18 08:35:47 -07:00
Kconfig bcache: Fix typo in Kconfig name 2020-07-25 07:38:19 -06:00
Makefile bcache: remove the extra cflags for request.o 2019-11-13 15:42:50 -07:00
movinggc.c bcache: movinggc: Use struct_size() helper in kzalloc() 2020-07-25 07:38:20 -06:00
request.c block: rename generic_make_request to submit_bio_noacct 2020-07-01 07:27:24 -06:00
request.h block: move ->make_request_fn to struct block_device_operations 2020-07-01 07:27:24 -06:00
stats.c bcache: fix memory corruption in bch_cache_accounting_clear() 2020-02-01 07:55:39 -07:00
stats.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
super.c bcache: handle btree node memory allocation properly for bucket size > 8MB 2020-07-25 07:38:20 -06:00
sysfs.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
sysfs.h bcache: add sysfs_strtoul_bool() for setting bit-field variables 2019-02-09 07:18:32 -07:00
trace.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
util.c bcache: avoid to use bio_for_each_segment_all() in bch_bio_alloc_pages() 2019-02-15 08:40:11 -07:00
util.h bcache: Revert "bcache: fix high CPU occupancy during journal" 2019-06-28 07:39:17 -06:00
writeback.c bcache: fix overflow in offset_to_stripe() 2020-07-25 07:38:20 -06:00
writeback.h bcache: fix overflow in offset_to_stripe() 2020-07-25 07:38:20 -06:00