Commit e3ed4eae authored by Dmitry Kravkov's avatar Dmitry Kravkov Committed by David S. Miller

bnx2x: prevent FW assert on low mem during unload

Buffers for FW statistics were allocated at an inappropriate time; In a machine
where the driver encounters problems allocating all of its queues, the driver
would still create FW requests for the statistics of the non-existing queues.
The wrong order of memory allocation could lead to zeroed statistics messages
being sent, leading to fw assert in case function 0 was down.

This changes the order of allocations, guaranteeing that statistic requests will
only be generated for actual queues.
Signed-off-by: default avatarDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: default avatarAriel Elior <ariele@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d08c42c
...@@ -2545,10 +2545,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ...@@ -2545,10 +2545,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
} }
} }
/* Allocated memory for FW statistics */
if (bnx2x_alloc_fw_stats_mem(bp))
LOAD_ERROR_EXIT(bp, load_error0);
/* need to be done after alloc mem, since it's self adjusting to amount /* need to be done after alloc mem, since it's self adjusting to amount
* of memory available for RSS queues * of memory available for RSS queues
*/ */
...@@ -2558,6 +2554,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ...@@ -2558,6 +2554,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
LOAD_ERROR_EXIT(bp, load_error0); LOAD_ERROR_EXIT(bp, load_error0);
} }
/* Allocated memory for FW statistics */
if (bnx2x_alloc_fw_stats_mem(bp))
LOAD_ERROR_EXIT(bp, load_error0);
/* request pf to initialize status blocks */ /* request pf to initialize status blocks */
if (IS_VF(bp)) { if (IS_VF(bp)) {
rc = bnx2x_vfpf_init(bp); rc = bnx2x_vfpf_init(bp);
...@@ -2812,8 +2812,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ...@@ -2812,8 +2812,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
if (IS_PF(bp)) if (IS_PF(bp))
bnx2x_clear_pf_load(bp); bnx2x_clear_pf_load(bp);
load_error0: load_error0:
bnx2x_free_fp_mem(bp);
bnx2x_free_fw_stats_mem(bp); bnx2x_free_fw_stats_mem(bp);
bnx2x_free_fp_mem(bp);
bnx2x_free_mem(bp); bnx2x_free_mem(bp);
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment