Message ID | 20100528175735.30903.21134.sendpatchset@prarit.bos.redhat.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, 2010-05-28 at 14:01 -0400, Prarit Bhargava wrote: > Linux 2.6.33 reports this checkstack warning: > > drivers/net/vxge/vxge-main.c: In function 'vxge_probe': > drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes > > This warning does not occur in the latest linux-2.6 or linux-next, however, > when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see > > drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’: > drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes > > This patch moves the large vxge_config struct off the stack. The patch is sufficient, but I think it doesn't go far enough. The struct vxge_config in struct vxgedev should be malloc'd as well. struct vxgedev is entirely too big and needs to be smaller, for cache perf and other reasons. Thanks, Jon > > Signed-off-by: Prarit Bhargava <prarit@redhat.com> > > diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c > index 2bab364..b955802 100644 > --- a/drivers/net/vxge/vxge-main.c > +++ b/drivers/net/vxge/vxge-main.c > @@ -4016,7 +4016,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > int high_dma = 0; > u64 vpath_mask = 0; > struct vxgedev *vdev; > - struct vxge_config ll_config; > + struct vxge_config *ll_config = NULL; > struct vxge_hw_device_config *device_config = NULL; > struct vxge_hw_device_attr attr; > int i, j, no_of_vpath = 0, max_vpath_supported = 0; > @@ -4075,17 +4075,24 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > goto _exit0; > } > > - memset(&ll_config, 0, sizeof(struct vxge_config)); > - ll_config.tx_steering_type = TX_MULTIQ_STEERING; > - ll_config.intr_type = MSI_X; > - ll_config.napi_weight = NEW_NAPI_WEIGHT; > - ll_config.rth_steering = RTH_STEERING; > + ll_config = kzalloc(sizeof(*ll_config), GFP_KERNEL); > + if (!ll_config) { > + ret = -ENOMEM; > + vxge_debug_init(VXGE_ERR, > + "ll_config : malloc failed %s %d", > + __FILE__, __LINE__); > + goto _exit0; > + } > + ll_config->tx_steering_type = TX_MULTIQ_STEERING; > + ll_config->intr_type = MSI_X; > + ll_config->napi_weight = NEW_NAPI_WEIGHT; > + ll_config->rth_steering = RTH_STEERING; > > /* get the default configuration parameters */ > vxge_hw_device_config_default_get(device_config); > > /* initialize configuration parameters */ > - vxge_device_config_init(device_config, &ll_config.intr_type); > + vxge_device_config_init(device_config, &ll_config->intr_type); > > ret = pci_enable_device(pdev); > if (ret) { > @@ -4138,7 +4145,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > (unsigned long long)pci_resource_start(pdev, 0)); > > status = vxge_hw_device_hw_info_get(attr.bar0, > - &ll_config.device_hw_info); > + &ll_config->device_hw_info); > if (status != VXGE_HW_OK) { > vxge_debug_init(VXGE_ERR, > "%s: Reading of hardware info failed." > @@ -4147,7 +4154,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > goto _exit3; > } > > - if (ll_config.device_hw_info.fw_version.major != > + if (ll_config->device_hw_info.fw_version.major != > VXGE_DRIVER_FW_VERSION_MAJOR) { > vxge_debug_init(VXGE_ERR, > "%s: Incorrect firmware version." > @@ -4157,7 +4164,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > goto _exit3; > } > > - vpath_mask = ll_config.device_hw_info.vpath_mask; > + vpath_mask = ll_config->device_hw_info.vpath_mask; > if (vpath_mask == 0) { > vxge_debug_ll_config(VXGE_TRACE, > "%s: No vpaths available in device", VXGE_DRIVER_NAME); > @@ -4169,10 +4176,10 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > "%s:%d Vpath mask = %llx", __func__, __LINE__, > (unsigned long long)vpath_mask); > > - function_mode = ll_config.device_hw_info.function_mode; > - host_type = ll_config.device_hw_info.host_type; > + function_mode = ll_config->device_hw_info.function_mode; > + host_type = ll_config->device_hw_info.host_type; > is_privileged = __vxge_hw_device_is_privilaged(host_type, > - ll_config.device_hw_info.func_id); > + ll_config->device_hw_info.func_id); > > /* Check how many vpaths are available */ > for (i = 0; i < VXGE_HW_MAX_VIRTUAL_PATHS; i++) { > @@ -4186,7 +4193,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > > /* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */ > if (is_sriov(function_mode) && (max_config_dev > 1) && > - (ll_config.intr_type != INTA) && > + (ll_config->intr_type != INTA) && > (is_privileged == VXGE_HW_OK)) { > ret = pci_enable_sriov(pdev, ((max_config_dev - 1) < num_vfs) > ? (max_config_dev - 1) : num_vfs); > @@ -4199,7 +4206,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > * Configure vpaths and get driver configured number of vpaths > * which is less than or equal to the maximum vpaths per function. > */ > - no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, &ll_config); > + no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, ll_config); > if (!no_of_vpath) { > vxge_debug_ll_config(VXGE_ERR, > "%s: No more vpaths to configure", VXGE_DRIVER_NAME); > @@ -4234,21 +4241,21 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > /* set private device info */ > pci_set_drvdata(pdev, hldev); > > - ll_config.gro_enable = VXGE_GRO_ALWAYS_AGGREGATE; > - ll_config.fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS; > - ll_config.addr_learn_en = addr_learn_en; > - ll_config.rth_algorithm = RTH_ALG_JENKINS; > - ll_config.rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4; > - ll_config.rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE; > - ll_config.rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE; > - ll_config.rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE; > - ll_config.rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; > - ll_config.rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; > - ll_config.rth_bkt_sz = RTH_BUCKET_SIZE; > - ll_config.tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; > - ll_config.rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; > - > - if (vxge_device_register(hldev, &ll_config, high_dma, no_of_vpath, > + ll_config->gro_enable = VXGE_GRO_ALWAYS_AGGREGATE; > + ll_config->fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS; > + ll_config->addr_learn_en = addr_learn_en; > + ll_config->rth_algorithm = RTH_ALG_JENKINS; > + ll_config->rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4; > + ll_config->rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE; > + ll_config->rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE; > + ll_config->rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE; > + ll_config->rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; > + ll_config->rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; > + ll_config->rth_bkt_sz = RTH_BUCKET_SIZE; > + ll_config->tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; > + ll_config->rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; > + > + if (vxge_device_register(hldev, ll_config, high_dma, no_of_vpath, > &vdev)) { > ret = -EINVAL; > goto _exit4; > @@ -4279,7 +4286,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > vdev->vpaths[j].vdev = vdev; > vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath; > memcpy((u8 *)vdev->vpaths[j].macaddr, > - (u8 *)ll_config.device_hw_info.mac_addrs[i], > + ll_config->device_hw_info.mac_addrs[i], > ETH_ALEN); > > /* Initialize the mac address list header */ > @@ -4300,18 +4307,18 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > > macaddr = (u8 *)vdev->vpaths[0].macaddr; > > - ll_config.device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0'; > - ll_config.device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0'; > - ll_config.device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0'; > + ll_config->device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0'; > + ll_config->device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0'; > + ll_config->device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0'; > > vxge_debug_init(VXGE_TRACE, "%s: SERIAL NUMBER: %s", > - vdev->ndev->name, ll_config.device_hw_info.serial_number); > + vdev->ndev->name, ll_config->device_hw_info.serial_number); > > vxge_debug_init(VXGE_TRACE, "%s: PART NUMBER: %s", > - vdev->ndev->name, ll_config.device_hw_info.part_number); > + vdev->ndev->name, ll_config->device_hw_info.part_number); > > vxge_debug_init(VXGE_TRACE, "%s: Neterion %s Server Adapter", > - vdev->ndev->name, ll_config.device_hw_info.product_desc); > + vdev->ndev->name, ll_config->device_hw_info.product_desc); > > vxge_debug_init(VXGE_TRACE, "%s: MAC ADDR: %pM", > vdev->ndev->name, macaddr); > @@ -4321,11 +4328,11 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > > vxge_debug_init(VXGE_TRACE, > "%s: Firmware version : %s Date : %s", vdev->ndev->name, > - ll_config.device_hw_info.fw_version.version, > - ll_config.device_hw_info.fw_date.date); > + ll_config->device_hw_info.fw_version.version, > + ll_config->device_hw_info.fw_date.date); > > if (new_device) { > - switch (ll_config.device_hw_info.function_mode) { > + switch (ll_config->device_hw_info.function_mode) { > case VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION: > vxge_debug_init(VXGE_TRACE, > "%s: Single Function Mode Enabled", vdev->ndev->name); > @@ -4348,7 +4355,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > vxge_print_parm(vdev, vpath_mask); > > /* Store the fw version for ethttool option */ > - strcpy(vdev->fw_version, ll_config.device_hw_info.fw_version.version); > + strcpy(vdev->fw_version, ll_config->device_hw_info.fw_version.version); > memcpy(vdev->ndev->dev_addr, (u8 *)vdev->vpaths[0].macaddr, ETH_ALEN); > memcpy(vdev->ndev->perm_addr, vdev->ndev->dev_addr, ETH_ALEN); > > @@ -4387,7 +4394,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > * present to prevent such a failure. > */ > > - if (ll_config.device_hw_info.function_mode == > + if (ll_config->device_hw_info.function_mode == > VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION) > if (vdev->config.intr_type == INTA) > vxge_hw_device_unmask_all(hldev); > @@ -4399,6 +4406,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) > VXGE_COPY_DEBUG_INFO_TO_LL(vdev, vxge_hw_device_error_level_get(hldev), > vxge_hw_device_trace_level_get(hldev)); > > + kfree(ll_config); > return 0; > > _exit5: > @@ -4416,6 +4424,7 @@ _exit2: > _exit1: > pci_disable_device(pdev); > _exit0: > + kfree(ll_config); > kfree(device_config); > driver_config->config_dev_cnt--; > pci_set_drvdata(pdev, NULL); > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Prarit Bhargava <prarit@redhat.com> Date: Fri, 28 May 2010 14:01:49 -0400 > Linux 2.6.33 reports this checkstack warning: > > drivers/net/vxge/vxge-main.c: In function 'vxge_probe': > drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes > > This warning does not occur in the latest linux-2.6 or linux-next, however, > when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see > > drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’: > drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes > > This patch moves the large vxge_config struct off the stack. > > Signed-off-by: Prarit Bhargava <prarit@redhat.com> Applied to net-next-2.6, thanks.
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index 2bab364..b955802 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c @@ -4016,7 +4016,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) int high_dma = 0; u64 vpath_mask = 0; struct vxgedev *vdev; - struct vxge_config ll_config; + struct vxge_config *ll_config = NULL; struct vxge_hw_device_config *device_config = NULL; struct vxge_hw_device_attr attr; int i, j, no_of_vpath = 0, max_vpath_supported = 0; @@ -4075,17 +4075,24 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) goto _exit0; } - memset(&ll_config, 0, sizeof(struct vxge_config)); - ll_config.tx_steering_type = TX_MULTIQ_STEERING; - ll_config.intr_type = MSI_X; - ll_config.napi_weight = NEW_NAPI_WEIGHT; - ll_config.rth_steering = RTH_STEERING; + ll_config = kzalloc(sizeof(*ll_config), GFP_KERNEL); + if (!ll_config) { + ret = -ENOMEM; + vxge_debug_init(VXGE_ERR, + "ll_config : malloc failed %s %d", + __FILE__, __LINE__); + goto _exit0; + } + ll_config->tx_steering_type = TX_MULTIQ_STEERING; + ll_config->intr_type = MSI_X; + ll_config->napi_weight = NEW_NAPI_WEIGHT; + ll_config->rth_steering = RTH_STEERING; /* get the default configuration parameters */ vxge_hw_device_config_default_get(device_config); /* initialize configuration parameters */ - vxge_device_config_init(device_config, &ll_config.intr_type); + vxge_device_config_init(device_config, &ll_config->intr_type); ret = pci_enable_device(pdev); if (ret) { @@ -4138,7 +4145,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) (unsigned long long)pci_resource_start(pdev, 0)); status = vxge_hw_device_hw_info_get(attr.bar0, - &ll_config.device_hw_info); + &ll_config->device_hw_info); if (status != VXGE_HW_OK) { vxge_debug_init(VXGE_ERR, "%s: Reading of hardware info failed." @@ -4147,7 +4154,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) goto _exit3; } - if (ll_config.device_hw_info.fw_version.major != + if (ll_config->device_hw_info.fw_version.major != VXGE_DRIVER_FW_VERSION_MAJOR) { vxge_debug_init(VXGE_ERR, "%s: Incorrect firmware version." @@ -4157,7 +4164,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) goto _exit3; } - vpath_mask = ll_config.device_hw_info.vpath_mask; + vpath_mask = ll_config->device_hw_info.vpath_mask; if (vpath_mask == 0) { vxge_debug_ll_config(VXGE_TRACE, "%s: No vpaths available in device", VXGE_DRIVER_NAME); @@ -4169,10 +4176,10 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) "%s:%d Vpath mask = %llx", __func__, __LINE__, (unsigned long long)vpath_mask); - function_mode = ll_config.device_hw_info.function_mode; - host_type = ll_config.device_hw_info.host_type; + function_mode = ll_config->device_hw_info.function_mode; + host_type = ll_config->device_hw_info.host_type; is_privileged = __vxge_hw_device_is_privilaged(host_type, - ll_config.device_hw_info.func_id); + ll_config->device_hw_info.func_id); /* Check how many vpaths are available */ for (i = 0; i < VXGE_HW_MAX_VIRTUAL_PATHS; i++) { @@ -4186,7 +4193,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) /* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */ if (is_sriov(function_mode) && (max_config_dev > 1) && - (ll_config.intr_type != INTA) && + (ll_config->intr_type != INTA) && (is_privileged == VXGE_HW_OK)) { ret = pci_enable_sriov(pdev, ((max_config_dev - 1) < num_vfs) ? (max_config_dev - 1) : num_vfs); @@ -4199,7 +4206,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) * Configure vpaths and get driver configured number of vpaths * which is less than or equal to the maximum vpaths per function. */ - no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, &ll_config); + no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, ll_config); if (!no_of_vpath) { vxge_debug_ll_config(VXGE_ERR, "%s: No more vpaths to configure", VXGE_DRIVER_NAME); @@ -4234,21 +4241,21 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) /* set private device info */ pci_set_drvdata(pdev, hldev); - ll_config.gro_enable = VXGE_GRO_ALWAYS_AGGREGATE; - ll_config.fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS; - ll_config.addr_learn_en = addr_learn_en; - ll_config.rth_algorithm = RTH_ALG_JENKINS; - ll_config.rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4; - ll_config.rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE; - ll_config.rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE; - ll_config.rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE; - ll_config.rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; - ll_config.rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; - ll_config.rth_bkt_sz = RTH_BUCKET_SIZE; - ll_config.tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; - ll_config.rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; - - if (vxge_device_register(hldev, &ll_config, high_dma, no_of_vpath, + ll_config->gro_enable = VXGE_GRO_ALWAYS_AGGREGATE; + ll_config->fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS; + ll_config->addr_learn_en = addr_learn_en; + ll_config->rth_algorithm = RTH_ALG_JENKINS; + ll_config->rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4; + ll_config->rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE; + ll_config->rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE; + ll_config->rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE; + ll_config->rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; + ll_config->rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE; + ll_config->rth_bkt_sz = RTH_BUCKET_SIZE; + ll_config->tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; + ll_config->rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE; + + if (vxge_device_register(hldev, ll_config, high_dma, no_of_vpath, &vdev)) { ret = -EINVAL; goto _exit4; @@ -4279,7 +4286,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) vdev->vpaths[j].vdev = vdev; vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath; memcpy((u8 *)vdev->vpaths[j].macaddr, - (u8 *)ll_config.device_hw_info.mac_addrs[i], + ll_config->device_hw_info.mac_addrs[i], ETH_ALEN); /* Initialize the mac address list header */ @@ -4300,18 +4307,18 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) macaddr = (u8 *)vdev->vpaths[0].macaddr; - ll_config.device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0'; - ll_config.device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0'; - ll_config.device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0'; + ll_config->device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0'; + ll_config->device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0'; + ll_config->device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0'; vxge_debug_init(VXGE_TRACE, "%s: SERIAL NUMBER: %s", - vdev->ndev->name, ll_config.device_hw_info.serial_number); + vdev->ndev->name, ll_config->device_hw_info.serial_number); vxge_debug_init(VXGE_TRACE, "%s: PART NUMBER: %s", - vdev->ndev->name, ll_config.device_hw_info.part_number); + vdev->ndev->name, ll_config->device_hw_info.part_number); vxge_debug_init(VXGE_TRACE, "%s: Neterion %s Server Adapter", - vdev->ndev->name, ll_config.device_hw_info.product_desc); + vdev->ndev->name, ll_config->device_hw_info.product_desc); vxge_debug_init(VXGE_TRACE, "%s: MAC ADDR: %pM", vdev->ndev->name, macaddr); @@ -4321,11 +4328,11 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) vxge_debug_init(VXGE_TRACE, "%s: Firmware version : %s Date : %s", vdev->ndev->name, - ll_config.device_hw_info.fw_version.version, - ll_config.device_hw_info.fw_date.date); + ll_config->device_hw_info.fw_version.version, + ll_config->device_hw_info.fw_date.date); if (new_device) { - switch (ll_config.device_hw_info.function_mode) { + switch (ll_config->device_hw_info.function_mode) { case VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION: vxge_debug_init(VXGE_TRACE, "%s: Single Function Mode Enabled", vdev->ndev->name); @@ -4348,7 +4355,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) vxge_print_parm(vdev, vpath_mask); /* Store the fw version for ethttool option */ - strcpy(vdev->fw_version, ll_config.device_hw_info.fw_version.version); + strcpy(vdev->fw_version, ll_config->device_hw_info.fw_version.version); memcpy(vdev->ndev->dev_addr, (u8 *)vdev->vpaths[0].macaddr, ETH_ALEN); memcpy(vdev->ndev->perm_addr, vdev->ndev->dev_addr, ETH_ALEN); @@ -4387,7 +4394,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) * present to prevent such a failure. */ - if (ll_config.device_hw_info.function_mode == + if (ll_config->device_hw_info.function_mode == VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION) if (vdev->config.intr_type == INTA) vxge_hw_device_unmask_all(hldev); @@ -4399,6 +4406,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) VXGE_COPY_DEBUG_INFO_TO_LL(vdev, vxge_hw_device_error_level_get(hldev), vxge_hw_device_trace_level_get(hldev)); + kfree(ll_config); return 0; _exit5: @@ -4416,6 +4424,7 @@ _exit2: _exit1: pci_disable_device(pdev); _exit0: + kfree(ll_config); kfree(device_config); driver_config->config_dev_cnt--; pci_set_drvdata(pdev, NULL);
Linux 2.6.33 reports this checkstack warning: drivers/net/vxge/vxge-main.c: In function 'vxge_probe': drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes This warning does not occur in the latest linux-2.6 or linux-next, however, when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’: drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes This patch moves the large vxge_config struct off the stack. Signed-off-by: Prarit Bhargava <prarit@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html