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:
Dan Carpenter 2010-08-09 21:49:36 +00:00 committed by David S. Miller
parent ca315ac22c
commit e88db3bd46
1 changed files with 21 additions and 6 deletions

View File

@ -473,14 +473,20 @@ qlcnic_cleanup_pci_map(struct qlcnic_adapter *adapter)
static int static int
qlcnic_init_pci_info(struct qlcnic_adapter *adapter) 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; int i, ret = 0, err;
u8 pfn; 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) * adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) *
QLCNIC_MAX_PCI_FUNC, GFP_KERNEL); QLCNIC_MAX_PCI_FUNC, GFP_KERNEL);
if (!adapter->npars) if (!adapter->npars) {
return -ENOMEM; err = -ENOMEM;
goto err_pci_info;
}
adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) * adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) *
QLCNIC_NIU_MAX_XG_PORTS, GFP_KERNEL); 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++) for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE; adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE;
kfree(pci_info);
return 0; return 0;
err_eswitch: err_eswitch:
@ -516,6 +523,8 @@ err_eswitch:
err_npars: err_npars:
kfree(adapter->npars); kfree(adapter->npars);
adapter->npars = NULL; adapter->npars = NULL;
err_pci_info:
kfree(pci_info);
return ret; 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 device *dev = container_of(kobj, struct device, kobj);
struct qlcnic_adapter *adapter = dev_get_drvdata(dev); struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
struct qlcnic_pci_func_cfg pci_cfg[QLCNIC_MAX_PCI_FUNC]; 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; int i, ret;
if (size != sizeof(pci_cfg)) if (size != sizeof(pci_cfg))
return QL_STATUS_INVALID_PARAM; 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); ret = qlcnic_get_pci_info(adapter, pci_info);
if (ret) if (ret) {
kfree(pci_info);
return ret; return ret;
}
for (i = 0; i < QLCNIC_MAX_PCI_FUNC ; i++) { for (i = 0; i < QLCNIC_MAX_PCI_FUNC ; i++) {
pci_cfg[i].pci_func = pci_info[i].id; 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(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN);
} }
memcpy(buf, &pci_cfg, size); memcpy(buf, &pci_cfg, size);
kfree(pci_info);
return size; return size;
} }
static struct bin_attribute bin_attr_npar_config = { static struct bin_attribute bin_attr_npar_config = {
.attr = {.name = "npar_config", .mode = (S_IRUGO | S_IWUSR)}, .attr = {.name = "npar_config", .mode = (S_IRUGO | S_IWUSR)},