qlcnic: using too much stack
qlcnic_pci_info structs are 128 bytes so an array of 8 uses 1024 bytes. That's a lot if you run with 4K stacks. I allocated them with kcalloc() instead. Signed-off-by: Dan Carpenter <error27@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ca315ac22c
commit
e88db3bd46
|
@ -473,14 +473,20 @@ qlcnic_cleanup_pci_map(struct qlcnic_adapter *adapter)
|
|||
static int
|
||||
qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_pci_info pci_info[QLCNIC_MAX_PCI_FUNC];
|
||||
struct qlcnic_pci_info *pci_info;
|
||||
int i, ret = 0, err;
|
||||
u8 pfn;
|
||||
|
||||
pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
|
||||
if (!pci_info)
|
||||
return -ENOMEM;
|
||||
|
||||
adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) *
|
||||
QLCNIC_MAX_PCI_FUNC, GFP_KERNEL);
|
||||
if (!adapter->npars)
|
||||
return -ENOMEM;
|
||||
if (!adapter->npars) {
|
||||
err = -ENOMEM;
|
||||
goto err_pci_info;
|
||||
}
|
||||
|
||||
adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) *
|
||||
QLCNIC_NIU_MAX_XG_PORTS, GFP_KERNEL);
|
||||
|
@ -508,6 +514,7 @@ qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
|
|||
for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
|
||||
adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE;
|
||||
|
||||
kfree(pci_info);
|
||||
return 0;
|
||||
|
||||
err_eswitch:
|
||||
|
@ -516,6 +523,8 @@ err_eswitch:
|
|||
err_npars:
|
||||
kfree(adapter->npars);
|
||||
adapter->npars = NULL;
|
||||
err_pci_info:
|
||||
kfree(pci_info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -3362,15 +3371,21 @@ qlcnic_sysfs_read_pci_config(struct file *file, struct kobject *kobj,
|
|||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
||||
struct qlcnic_pci_func_cfg pci_cfg[QLCNIC_MAX_PCI_FUNC];
|
||||
struct qlcnic_pci_info pci_info[QLCNIC_MAX_PCI_FUNC];
|
||||
struct qlcnic_pci_info *pci_info;
|
||||
int i, ret;
|
||||
|
||||
if (size != sizeof(pci_cfg))
|
||||
return QL_STATUS_INVALID_PARAM;
|
||||
|
||||
pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
|
||||
if (!pci_info)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = qlcnic_get_pci_info(adapter, pci_info);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(pci_info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < QLCNIC_MAX_PCI_FUNC ; i++) {
|
||||
pci_cfg[i].pci_func = pci_info[i].id;
|
||||
|
@ -3381,8 +3396,8 @@ qlcnic_sysfs_read_pci_config(struct file *file, struct kobject *kobj,
|
|||
memcpy(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN);
|
||||
}
|
||||
memcpy(buf, &pci_cfg, size);
|
||||
kfree(pci_info);
|
||||
return size;
|
||||
|
||||
}
|
||||
static struct bin_attribute bin_attr_npar_config = {
|
||||
.attr = {.name = "npar_config", .mode = (S_IRUGO | S_IWUSR)},
|
||||
|
|
Loading…
Reference in New Issue