bnx2x: Fix memory leak
authorYuval Mintz <yuvalmin@broadcom.com>
Wed, 24 Apr 2013 01:45:01 +0000 (01:45 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2013 20:33:53 +0000 (16:33 -0400)
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>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index e8ed78f6400728a19df05705d309458138fe41ca..fd20a4ff015054fe875a8f6709bf7c11c884027f 100644 (file)
@@ -2934,9 +2934,9 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
                bnx2x_free_fp_mem_cnic(bp);
 
        if (IS_PF(bp)) {
-               bnx2x_free_mem(bp);
                if (CNIC_LOADED(bp))
                        bnx2x_free_mem_cnic(bp);
+               bnx2x_free_mem(bp);
        }
        bp->state = BNX2X_STATE_CLOSED;
        bp->cnic_loaded = false;
index a46bc720b992740573e9bb075bb9bbce4b5f3b13..dedf68377e74939ca8c7d49ee760d6fc19a6a2f5 100644 (file)
@@ -7786,7 +7786,7 @@ int bnx2x_alloc_mem_cnic(struct bnx2x *bp)
                                sizeof(struct
                                       host_hc_status_block_e1x));
 
-       if (CONFIGURE_NIC_MODE(bp))
+       if (CONFIGURE_NIC_MODE(bp) && !bp->t2)
                /* allocate searcher T2 table, as it wan't allocated before */
                BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);
 
@@ -7809,7 +7809,7 @@ int bnx2x_alloc_mem(struct bnx2x *bp)
 {
        int i, allocated, context_size;
 
-       if (!CONFIGURE_NIC_MODE(bp))
+       if (!CONFIGURE_NIC_MODE(bp) && !bp->t2)
                /* allocate searcher T2 table */
                BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);