WARNING will be triggered when __kmalloc greater than 1 page with
GFP_NOFAIL. On system with a large number of cpus,
init_blk_queue_async_dispatch() may attempt to allocate memory larger
than 1 page, causing the WARING:
------------[ cut here ]------------
WARNING: CPU: 4 PID: 1 at mm/page_alloc.c:3485 get_page_from_freelist+0x115c/0x1224
Modules linked in:
CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.10.0-212.0.0.112.oe2203sp4.aarch64 #1
Call trace:
get_page_from_freelist+0x115c/0x1224
__alloc_pages+0x254/0x11f0
alloc_page_interleave+0x24/0xb0
alloc_pages+0xf0/0x16c
kmalloc_order+0x38/0x1c0
kmalloc_order_trace+0x34/0x130
__kmalloc+0x524/0x680
init_blk_queue_async_dispatch+0xe8/0x160
blk_dev_init+0xa8/0xd0
genhd_device_init+0x64/0xb4
do_one_initcall+0x50/0x2a0
do_initcall_level+0xe4/0x110
do_initcalls+0x80/0xb8
kernel_init_freeable+0x1c8/0x254
kernel_init+0x1c/0x144
ret_from_fork+0x10/0x18
---[ end trace 5fed5af9086c724c ]---
Fix it by removing flag GFP_NOFAIL and panic kernel if allocation fails.
Signed-off-by: Li Nan <linan122(a)huawei.com>
---
block/blk-core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index e3e2659d0673..95f7d796482b 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -285,7 +285,8 @@ static void init_blk_queue_async_dispatch(void)
init_waitqueue_head(&ctl->wait);
ctl->bios = kmalloc_array(nr_cpu_ids, sizeof(struct async_bio),
- GFP_KERNEL | __GFP_NOFAIL);
+ GFP_KERNEL);
+ BUG_ON(!ctl->bios);
for (i = 0; i < nr_cpu_ids; ++i) {
bio_list_init(&ctl->bios[i].list);
spin_lock_init(&ctl->bios[i].lock);
--
2.39.2