net/bnx2x: fix memory leak

We allocate DMA memory but never free after using it.
Add function to free DMA memory.

Fixes: b5bf7719221d ("bnx2x: driver support routines")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
This commit is contained in:
Shahed Shaikh 2019-04-11 18:47:38 -07:00 committed by Ferruh Yigit
parent ed55533e98
commit 68ed074225
3 changed files with 26 additions and 9 deletions

View File

@ -185,6 +185,7 @@ bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size, struct bnx2x_dma *dma,
}
dma->paddr = (uint64_t) z->iova;
dma->vaddr = z->addr;
dma->mzone = (const void *)z;
PMD_DRV_LOG(DEBUG, sc,
"%s: virt=%p phys=%" PRIx64, msg, dma->vaddr, dma->paddr);
@ -192,6 +193,19 @@ bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size, struct bnx2x_dma *dma,
return 0;
}
void bnx2x_dma_free(struct bnx2x_dma *dma)
{
if (dma->mzone == NULL)
return;
rte_memzone_free((const struct rte_memzone *)dma->mzone);
dma->sc = NULL;
dma->paddr = 0;
dma->vaddr = NULL;
dma->nseg = 0;
dma->mzone = NULL;
}
static int bnx2x_acquire_hw_lock(struct bnx2x_softc *sc, uint32_t resource)
{
uint32_t lock_status;
@ -2436,6 +2450,7 @@ static int bnx2x_alloc_mem(struct bnx2x_softc *sc)
static void bnx2x_free_fw_stats_mem(struct bnx2x_softc *sc)
{
bnx2x_dma_free(&sc->fw_stats_dma);
sc->fw_stats_num = 0;
sc->fw_stats_req_size = 0;

View File

@ -319,6 +319,7 @@ struct bnx2x_dma {
rte_iova_t paddr;
void *vaddr;
int nseg;
const void *mzone;
char msg[RTE_MEMZONE_NAMESIZE - 6];
};
@ -1753,7 +1754,7 @@ int bnx2x_cmpxchg(volatile int *addr, int old, int new);
int bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size,
struct bnx2x_dma *dma, const char *msg, uint32_t align);
void bnx2x_dma_free(struct bnx2x_dma *dma);
uint32_t bnx2x_dmae_opcode_add_comp(uint32_t opcode, uint8_t comp_type);
uint32_t bnx2x_dmae_opcode_clr_src_reset(uint32_t opcode);
uint32_t bnx2x_dmae_opcode(struct bnx2x_softc *sc, uint8_t src_type,

View File

@ -151,14 +151,15 @@ typedef rte_spinlock_t ECORE_MUTEX_SPIN;
} \
} while (0)
#define ECORE_ILT_FREE(x, y, size) \
do { \
if (x) { \
rte_free(x); \
x = NULL; \
y = 0; \
} \
} while (0)
#define ECORE_ILT_FREE(x, y, size) \
do { \
if (x) { \
bnx2x_dma_free((struct bnx2x_dma *)x); \
rte_free(x); \
x = NULL; \
y = 0; \
} \
} while (0)
#define ECORE_IS_VALID_ETHER_ADDR(_mac) TRUE