* [PATCH]: vxge: Fix checkstack warning in vxge_probe()
@ 2010-05-28 18:01 Prarit Bhargava
2010-06-02 3:03 ` Jon Mason
2010-06-02 12:51 ` David Miller
0 siblings, 2 replies; 3+ messages in thread
From: Prarit Bhargava @ 2010-05-28 18:01 UTC (permalink / raw)
To: netdev, mschmidt; +Cc: Prarit Bhargava
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>
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);
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH]: vxge: Fix checkstack warning in vxge_probe()
2010-05-28 18:01 [PATCH]: vxge: Fix checkstack warning in vxge_probe() Prarit Bhargava
@ 2010-06-02 3:03 ` Jon Mason
2010-06-02 12:51 ` David Miller
1 sibling, 0 replies; 3+ messages in thread
From: Jon Mason @ 2010-06-02 3:03 UTC (permalink / raw)
To: Prarit Bhargava; +Cc: netdev, mschmidt
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH]: vxge: Fix checkstack warning in vxge_probe()
2010-05-28 18:01 [PATCH]: vxge: Fix checkstack warning in vxge_probe() Prarit Bhargava
2010-06-02 3:03 ` Jon Mason
@ 2010-06-02 12:51 ` David Miller
1 sibling, 0 replies; 3+ messages in thread
From: David Miller @ 2010-06-02 12:51 UTC (permalink / raw)
To: prarit; +Cc: netdev, mschmidt
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.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-06-02 12:51 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-28 18:01 [PATCH]: vxge: Fix checkstack warning in vxge_probe() Prarit Bhargava
2010-06-02 3:03 ` Jon Mason
2010-06-02 12:51 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).