bnx2fc: reduce stack usage in __bnx2fc_enable
Subsystems (4)
PATCH 1/1 bnx2fc: reduce stack usage in __bnx2fc_enable
When the bnx2fc driver was changed to read the npiv table from nvram, the stack of the __bnx2fc_enable function gained an additional 1028 byte structure that gcc rightfully warns about:
drivers/scsi/bnx2fc/bnx2fc_fcoe.c: In function '__bnx2fc_enable':drivers/scsi/bnx2fc/bnx2fc_fcoe.c:2134:1: warning: the frame size of 1128 bytes is larger than 1024 bytes [-Wframe-larger-than=]
In order to avoid a possible kernel stack overflow and to get rid of the warning, this changes the function to use a dynamic allocation of the structure using kzalloc.
---
The original patch was merged through netdev along with the respective ethernet driver changes, but this should probably go through the scsi tree, as no ethernet changes are involved.
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +9 -4
@@ -2092,7 +2092,7 @@ static int __bnx2fc_enable(struct fcoe_ctlr *ctlr) {struct bnx2fc_interface *interface =fcoe_ctlr_priv (ctlr);struct bnx2fc_hba *hba; -struct cnic_fc_npiv_tbl npiv_tbl; +struct cnic_fc_npiv_tbl *npiv_tbl;struct fc_lport *lport;if (interface->enabled == false) {
@@ -2124,11 +2124,16 @@ static int __bnx2fc_enable(struct fcoe_ctlr *ctlr)if (!hba->cnic->get_fc_npiv_tbl) goto done; -memset (&npiv_tbl,0 ,sizeof (npiv_tbl)); -if (hba->cnic->get_fc_npiv_tbl (hba->cnic, &npiv_tbl)) + npiv_tbl =kzalloc (sizeof (struct cnic_fc_npiv_tbl ),GFP_KERNEL ); +if (!npiv_tbl) goto done; -bnx2fc_npiv_create_vports (lport, &npiv_tbl); +if (hba->cnic->get_fc_npiv_tbl (hba->cnic, npiv_tbl)) + goto done_free; + +bnx2fc_npiv_create_vports (lport, npiv_tbl); +done_free: +kfree (npiv_tbl); done:return 0 ; }
Hi,
drivers/scsi/bnx2fc/bnx2fc_fcoe.c static int __bnx2fc_enable(struct fcoe_ctlr *ctlr) · line 2129
Quoted 6 lines · Arnd Bergmann
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +2
-2-memset (&npiv_tbl,0 ,sizeof (npiv_tbl)); -if (hba->cnic->get_fc_npiv_tbl (hba->cnic, &npiv_tbl)) + npiv_tbl =kzalloc (sizeof (struct cnic_fc_npiv_tbl ),GFP_KERNEL ); +if (!npiv_tbl) goto done;
If kzalloc() fails perhaps the function should return -ENOMEM, not zero.
Regards,
Maurizio Lombardi
Quoted 12 lines · Maurizio Lombardi
Hi,
drivers/scsi/bnx2fc/bnx2fc_fcoe.c static int __bnx2fc_enable(struct fcoe_ctlr *ctlr) · line 2129
Quoted 6 lines · Arnd Bergmann
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +2
-2-memset (&npiv_tbl,0 ,sizeof (npiv_tbl)); -if (hba->cnic->get_fc_npiv_tbl (hba->cnic, &npiv_tbl)) + npiv_tbl =kzalloc (sizeof (struct cnic_fc_npiv_tbl ),GFP_KERNEL ); +if (!npiv_tbl) goto done;If
kzalloc()fails perhaps the function should return-ENOMEM, not zero.
The enablement of the fcoe interface can still proceed if this particular allocation fails so returning 0 would be appropriate here.
This patch looks good to me.
Quoted 4 lines
Regards,
Maurizio Lombardi