diff options
author | Yuval Mintz <yuvalmin@broadcom.com> | 2013-04-23 21:45:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-24 16:33:53 -0400 |
commit | 2f7a312230e0d24e8913e7eff7b24d34b7092fcd (patch) | |
tree | 36f7fba230c61646158a3277d27957b2184903df /drivers/net | |
parent | f8f4f61a5a358841c5acf144f6fa13a6b475ec2c (diff) |
bnx2x: Fix memory leak
There exists an `allocation race' between the CNIC and bnx2x drivers,
in which both drivers allocate the same t2 memory while disregarding a possible
previous allocation.
Additionally, due to the current order of memory releases, some of the
ILT memory in the driver is not released correctly when unloading the driver.
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index e8ed78f64007..fd20a4ff0150 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -2934,9 +2934,9 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) | |||
2934 | bnx2x_free_fp_mem_cnic(bp); | 2934 | bnx2x_free_fp_mem_cnic(bp); |
2935 | 2935 | ||
2936 | if (IS_PF(bp)) { | 2936 | if (IS_PF(bp)) { |
2937 | bnx2x_free_mem(bp); | ||
2938 | if (CNIC_LOADED(bp)) | 2937 | if (CNIC_LOADED(bp)) |
2939 | bnx2x_free_mem_cnic(bp); | 2938 | bnx2x_free_mem_cnic(bp); |
2939 | bnx2x_free_mem(bp); | ||
2940 | } | 2940 | } |
2941 | bp->state = BNX2X_STATE_CLOSED; | 2941 | bp->state = BNX2X_STATE_CLOSED; |
2942 | bp->cnic_loaded = false; | 2942 | bp->cnic_loaded = false; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index a46bc720b992..dedf68377e74 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -7786,7 +7786,7 @@ int bnx2x_alloc_mem_cnic(struct bnx2x *bp) | |||
7786 | sizeof(struct | 7786 | sizeof(struct |
7787 | host_hc_status_block_e1x)); | 7787 | host_hc_status_block_e1x)); |
7788 | 7788 | ||
7789 | if (CONFIGURE_NIC_MODE(bp)) | 7789 | if (CONFIGURE_NIC_MODE(bp) && !bp->t2) |
7790 | /* allocate searcher T2 table, as it wan't allocated before */ | 7790 | /* allocate searcher T2 table, as it wan't allocated before */ |
7791 | BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); | 7791 | BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); |
7792 | 7792 | ||
@@ -7809,7 +7809,7 @@ int bnx2x_alloc_mem(struct bnx2x *bp) | |||
7809 | { | 7809 | { |
7810 | int i, allocated, context_size; | 7810 | int i, allocated, context_size; |
7811 | 7811 | ||
7812 | if (!CONFIGURE_NIC_MODE(bp)) | 7812 | if (!CONFIGURE_NIC_MODE(bp) && !bp->t2) |
7813 | /* allocate searcher T2 table */ | 7813 | /* allocate searcher T2 table */ |
7814 | BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); | 7814 | BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); |
7815 | 7815 | ||