From b8e609e8e266b497503231d8fc9b0d9c609db272 Mon Sep 17 00:00:00 2001 From: Shougang Wang Date: Wed, 13 Nov 2019 01:37:55 +0000 Subject: [PATCH] net/ice: fix memzone reserve and release in flow director To avoid memzone reserve failure and memory leak, following resources management should be added. - Check if the FDIR Memzone already exists before reserving. - Free FDIR memzone when teardown and other failure scenarios. Fixes: 84dc7a95a2d3 ("net/ice: enable flow director engine") Signed-off-by: Shougang Wang Acked-by: Qi Zhang Acked-by: Xiaolong Ye --- drivers/net/ice/ice_ethdev.h | 1 + drivers/net/ice/ice_fdir_filter.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index e2a0f6bfe7..4a0d37b32e 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -334,6 +334,7 @@ struct ice_fdir_info { struct ice_rx_queue *rxq; void *prg_pkt; /* memory for fdir program packet */ uint64_t dma_addr; /* physic address of packet memory*/ + const struct rte_memzone *mz; struct ice_fdir_filter_conf conf; struct ice_fdir_filter_conf **hash_map; diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index afab5af7fe..a89c506c0d 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -127,6 +127,12 @@ static struct ice_flow_parser ice_fdir_parser_comms; static const struct rte_memzone * ice_memzone_reserve(const char *name, uint32_t len, int socket_id) { + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(name); + if (mz) + return mz; + return rte_memzone_reserve_aligned(name, len, socket_id, RTE_MEMZONE_IOVA_CONTIG, ICE_RING_BASE_ALIGN); @@ -481,19 +487,23 @@ ice_fdir_setup(struct ice_pf *pf) } pf->fdir.prg_pkt = mz->addr; pf->fdir.dma_addr = mz->iova; + pf->fdir.mz = mz; err = ice_fdir_prof_alloc(hw); if (err) { PMD_DRV_LOG(ERR, "Cannot allocate memory for " "flow director profile."); err = -ENOMEM; - goto fail_mem; + goto fail_prof; } PMD_DRV_LOG(INFO, "FDIR setup successfully, with programming queue %u.", vsi->base_queue); return ICE_SUCCESS; +fail_prof: + rte_memzone_free(pf->fdir.mz); + pf->fdir.mz = NULL; fail_mem: ice_rx_queue_release(pf->fdir.rxq); pf->fdir.rxq = NULL; @@ -607,6 +617,13 @@ ice_fdir_teardown(struct ice_pf *pf) ice_fdir_prof_free(hw); ice_release_vsi(vsi); pf->fdir.fdir_vsi = NULL; + + if (pf->fdir.mz) { + err = rte_memzone_free(pf->fdir.mz); + pf->fdir.mz = NULL; + if (err) + PMD_DRV_LOG(ERR, "Failed to free FDIR memezone."); + } } static int -- 2.20.1