mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
scsi: megaraid_mbox: Reduce stack usage in megaraid_cmm_register()
The megaraid_cmm_register() function has a local copy of mraid_mmadp_t on the stack that gets copied into the actual structure used at runtime. When -fsanitize=thread is enabled, this causes the per-function stack frame to grow beyond the warning limit: megaraid_mbox.c: In function 'megaraid_cmm_register': megaraid_mbox.c:3472:1: error: the frame size of 1312 bytes is larger than 1280 bytes [-Werror=frame-larger-than=] Refactor this by moving the allocation into the caller to save the extra on-stack copy of the structure. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Link: https://patch.msgid.link/20260519202143.1305850-1-arnd@kernel.org Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
f199cee401
commit
c1f7275b61
|
|
@ -3396,7 +3396,7 @@ static int
|
||||||
megaraid_cmm_register(adapter_t *adapter)
|
megaraid_cmm_register(adapter_t *adapter)
|
||||||
{
|
{
|
||||||
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
|
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
|
||||||
mraid_mmadp_t adp;
|
mraid_mmadp_t *adp;
|
||||||
scb_t *scb;
|
scb_t *scb;
|
||||||
mbox_ccb_t *ccb;
|
mbox_ccb_t *ccb;
|
||||||
int rval;
|
int rval;
|
||||||
|
|
@ -3404,11 +3404,16 @@ megaraid_cmm_register(adapter_t *adapter)
|
||||||
|
|
||||||
// Allocate memory for the base list of scb for management module.
|
// Allocate memory for the base list of scb for management module.
|
||||||
adapter->uscb_list = kzalloc_objs(scb_t, MBOX_MAX_USER_CMDS);
|
adapter->uscb_list = kzalloc_objs(scb_t, MBOX_MAX_USER_CMDS);
|
||||||
|
adp = kzalloc_obj(*adp);
|
||||||
|
|
||||||
if (adapter->uscb_list == NULL) {
|
if (!adapter->uscb_list || !adp) {
|
||||||
con_log(CL_ANN, (KERN_WARNING
|
con_log(CL_ANN, (KERN_WARNING
|
||||||
"megaraid: out of memory, %s %d\n", __func__,
|
"megaraid: out of memory, %s %d\n", __func__,
|
||||||
__LINE__));
|
__LINE__));
|
||||||
|
|
||||||
|
kfree(adapter->uscb_list);
|
||||||
|
kfree(adp);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3452,20 +3457,21 @@ megaraid_cmm_register(adapter_t *adapter)
|
||||||
list_add_tail(&scb->list, &adapter->uscb_pool);
|
list_add_tail(&scb->list, &adapter->uscb_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
adp.unique_id = adapter->unique_id;
|
adp->unique_id = adapter->unique_id;
|
||||||
adp.drvr_type = DRVRTYPE_MBOX;
|
adp->drvr_type = DRVRTYPE_MBOX;
|
||||||
adp.drvr_data = (unsigned long)adapter;
|
adp->drvr_data = (unsigned long)adapter;
|
||||||
adp.pdev = adapter->pdev;
|
adp->pdev = adapter->pdev;
|
||||||
adp.issue_uioc = megaraid_mbox_mm_handler;
|
adp->issue_uioc = megaraid_mbox_mm_handler;
|
||||||
adp.timeout = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
|
adp->timeout = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
|
||||||
adp.max_kioc = MBOX_MAX_USER_CMDS;
|
adp->max_kioc = MBOX_MAX_USER_CMDS;
|
||||||
|
|
||||||
if ((rval = mraid_mm_register_adp(&adp)) != 0) {
|
if ((rval = mraid_mm_register_adp(adp)) != 0) {
|
||||||
|
|
||||||
con_log(CL_ANN, (KERN_WARNING
|
con_log(CL_ANN, (KERN_WARNING
|
||||||
"megaraid mbox: did not register with CMM\n"));
|
"megaraid mbox: did not register with CMM\n"));
|
||||||
|
|
||||||
kfree(adapter->uscb_list);
|
kfree(adapter->uscb_list);
|
||||||
|
kfree(adp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
|
|
|
||||||
|
|
@ -898,42 +898,28 @@ hinfo_to_cinfo(mraid_hba_info_t *hinfo, mcontroller_t *cinfo)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mraid_mm_register_adp - Registration routine for low level drivers
|
* mraid_mm_register_adp - Registration routine for low level drivers
|
||||||
* @lld_adp : Adapter object
|
* @adapter : Adapter object
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
|
mraid_mm_register_adp(mraid_mmadp_t *adapter)
|
||||||
{
|
{
|
||||||
mraid_mmadp_t *adapter;
|
|
||||||
mbox64_t *mbox_list;
|
mbox64_t *mbox_list;
|
||||||
uioc_t *kioc;
|
uioc_t *kioc;
|
||||||
uint32_t rval;
|
uint32_t rval;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
||||||
if (lld_adp->drvr_type != DRVRTYPE_MBOX)
|
if (adapter->drvr_type != DRVRTYPE_MBOX)
|
||||||
return (-EINVAL);
|
return (-EINVAL);
|
||||||
|
|
||||||
adapter = kzalloc_obj(mraid_mmadp_t);
|
|
||||||
|
|
||||||
if (!adapter)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
|
|
||||||
adapter->unique_id = lld_adp->unique_id;
|
|
||||||
adapter->drvr_type = lld_adp->drvr_type;
|
|
||||||
adapter->drvr_data = lld_adp->drvr_data;
|
|
||||||
adapter->pdev = lld_adp->pdev;
|
|
||||||
adapter->issue_uioc = lld_adp->issue_uioc;
|
|
||||||
adapter->timeout = lld_adp->timeout;
|
|
||||||
adapter->max_kioc = lld_adp->max_kioc;
|
|
||||||
adapter->quiescent = 1;
|
adapter->quiescent = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate single blocks of memory for all required kiocs,
|
* Allocate single blocks of memory for all required kiocs,
|
||||||
* mailboxes and passthru structures.
|
* mailboxes and passthru structures.
|
||||||
*/
|
*/
|
||||||
adapter->kioc_list = kmalloc_objs(uioc_t, lld_adp->max_kioc);
|
adapter->kioc_list = kmalloc_objs(uioc_t, adapter->max_kioc);
|
||||||
adapter->mbox_list = kmalloc_objs(mbox64_t, lld_adp->max_kioc);
|
adapter->mbox_list = kmalloc_objs(mbox64_t, adapter->max_kioc);
|
||||||
adapter->pthru_dma_pool = dma_pool_create("megaraid mm pthru pool",
|
adapter->pthru_dma_pool = dma_pool_create("megaraid mm pthru pool",
|
||||||
&adapter->pdev->dev,
|
&adapter->pdev->dev,
|
||||||
sizeof(mraid_passthru_t),
|
sizeof(mraid_passthru_t),
|
||||||
|
|
@ -956,11 +942,11 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
|
||||||
*/
|
*/
|
||||||
INIT_LIST_HEAD(&adapter->kioc_pool);
|
INIT_LIST_HEAD(&adapter->kioc_pool);
|
||||||
spin_lock_init(&adapter->kioc_pool_lock);
|
spin_lock_init(&adapter->kioc_pool_lock);
|
||||||
sema_init(&adapter->kioc_semaphore, lld_adp->max_kioc);
|
sema_init(&adapter->kioc_semaphore, adapter->max_kioc);
|
||||||
|
|
||||||
mbox_list = (mbox64_t *)adapter->mbox_list;
|
mbox_list = (mbox64_t *)adapter->mbox_list;
|
||||||
|
|
||||||
for (i = 0; i < lld_adp->max_kioc; i++) {
|
for (i = 0; i < adapter->max_kioc; i++) {
|
||||||
|
|
||||||
kioc = adapter->kioc_list + i;
|
kioc = adapter->kioc_list + i;
|
||||||
kioc->cmdbuf = (uint64_t)(unsigned long)(mbox_list + i);
|
kioc->cmdbuf = (uint64_t)(unsigned long)(mbox_list + i);
|
||||||
|
|
@ -997,7 +983,7 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
|
||||||
|
|
||||||
pthru_dma_pool_error:
|
pthru_dma_pool_error:
|
||||||
|
|
||||||
for (i = 0; i < lld_adp->max_kioc; i++) {
|
for (i = 0; i < adapter->max_kioc; i++) {
|
||||||
kioc = adapter->kioc_list + i;
|
kioc = adapter->kioc_list + i;
|
||||||
if (kioc->pthru32) {
|
if (kioc->pthru32) {
|
||||||
dma_pool_free(adapter->pthru_dma_pool, kioc->pthru32,
|
dma_pool_free(adapter->pthru_dma_pool, kioc->pthru32,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user