qla2x00t: Avoid using higher order page allocations

Avoid that qla2x00_get_node_name_list() fails as follows:

kworker/0:2: page allocation failure: order:4, mode:0x240c0c0(GFP_KERNEL|__GFP_COMP|__GFP_ZERO)
CPU: 0 PID: 101 Comm: kworker/0:2 Not tainted 4.9.124-scst #3
Hardware name: Supermicro SYS-1028U-E1CR4+/X10DRU-i+, BIOS 3.1 06/08/2018
Workqueue: events q2t_del_sess_work_fn [qla2x00tgt]
 ffffa0954357f9e8 ffffffff9c2c2fd8 ffffffff9c721178 0000000000000001
 ffffa0954357fa70 ffffffff9c13eb7a 0240c0c00240c0c0 ffffffff9c721178
 ffffa0954357fa10 ffff9e6700000010 ffffa0954357fa80 ffffa0954357fa30
Call Trace:
 dump_stack+0x4d/0x65
 warn_alloc+0x13a/0x170
 __alloc_pages_nodemask+0x486/0xd70
 alloc_pages_current+0x6f/0x100
 kmalloc_order+0x18/0x40
 kmalloc_order_trace+0x24/0xa0
 __kmalloc+0x163/0x190
 qla2x00_get_node_name_list+0x249/0x3e0 [qla2xxx]
 q2t_del_sess_work_fn+0xd8/0x4a0 [qla2x00tgt]
 process_one_work+0x14f/0x440
 worker_thread+0x48/0x4e0
 kthread+0xd9/0xf0
 ret_from_fork+0x22/0x30

This is a slightly modified version of a patch from Pascal de Bruijn
<p.debruijn@unilogic.nl>.



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@7475 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Bart Van Assche
2018-09-23 03:03:38 +00:00
parent 6619a1a6ae
commit b1df825bbe
3 changed files with 5 additions and 5 deletions

View File

@@ -1256,7 +1256,7 @@ retry:
}
}
kfree(pmap);
vfree(pmap);
if (!found) {
res = false;

View File

@@ -411,7 +411,7 @@ qla2x00_show_port_database(struct device *dev,
}
}
kfree(pmap);
vfree(pmap);
}
next:

View File

@@ -1315,8 +1315,8 @@ out:
#ifdef CONFIG_SCSI_QLA2XXX_TARGET
/*
* qla2x00_get_node_name_list
* Issue get node name list mailbox command, kmalloc()
* and return the resulting list. Caller must kfree() it!
* Issue get node name list mailbox command, vmalloc()
* and return the resulting list. Caller must vfree() it!
*
* Input:
* ha = adapter state pointer.
@@ -1388,7 +1388,7 @@ qla2x00_get_node_name_list(scsi_qla_host_t *vha, bool include_initiators,
left = 0;
list = kzalloc(dma_size, GFP_KERNEL);
list = vmalloc(dma_size);
if (list == NULL) {
printk(KERN_ERR "%s(%ld): failed to allocate node names"
" list structure.\n", __func__, vha->host_no);