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: Wang ShougangX <shougangx.w...@intel.com>
Acked-by: Qi Zhang <qi.z.zh...@intel.com>
---
 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 c55713cc1..d4ab18436 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 afab5af7f..a89c506c0 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.17.1

Reply via email to