Commit 636a2d00 authored by Li Nan's avatar Li Nan
Browse files

block: fix WARNING in init_blk_queue_async_dispatch

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IA5AEP


CVE: NA

--------------------------------

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:

  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

Fix it by removing flag GFP_NOFAIL and panic kernel if allocation fails.

Fixes: 204f600c ("block: support to dispatch bio asynchronously")
Signed-off-by: default avatarLi Nan <linan122@huawei.com>
parent d0d5bb1b
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -285,7 +285,9 @@ 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);
		if (!ctl->bios)
			panic("Failed to alloc async bio array\n");
		for (i = 0; i < nr_cpu_ids; ++i) {
			bio_list_init(&ctl->bios[i].list);
			spin_lock_init(&ctl->bios[i].lock);