From: Pandi Kumar Maharajan <pandi.mahara...@intel.com>

Advanced filter operations (apply/remove GENEVE/VXLAN filters) trigger
the call chain: ice_add_adv_rule()/ice_rem_adv_rule() -> ice_find_recp()
-> ice_get_recp_frm_fw(). Each call to ice_get_recp_frm_fw() creates new
linked list entries for SW recipe tracking without cleaning up previous
entries for the same recipe ID. The linked list then continuously grows
with each filter add/remove operation, leading to excessive heap usage
over time.

Fix the memory leak by adding logic to remove the duplicate entries
before adding new ones for the same recipe ID.

Fixes: fed0c5ca5f19 ("net/ice/base: support programming a new switch recipe")
Cc: sta...@dpdk.org

Signed-off-by: Pandi Kumar Maharajan <pandi.mahara...@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---
 drivers/net/intel/ice/base/ice_switch.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/intel/ice/base/ice_switch.c 
b/drivers/net/intel/ice/base/ice_switch.c
index f16bec044c..628473f100 100644
--- a/drivers/net/intel/ice/base/ice_switch.c
+++ b/drivers/net/intel/ice/base/ice_switch.c
@@ -2435,6 +2435,7 @@ ice_get_recp_frm_fw(struct ice_hw *hw, struct 
ice_sw_recipe *recps, u8 rid,
                    bool *refresh_required)
 {
        ice_declare_bitmap(result_bm, ICE_MAX_FV_WORDS);
+       struct ice_recp_grp_entry *rg, *tmprg_entry;
        struct ice_aqc_recipe_data_elem *tmp;
        u16 num_recps = ICE_MAX_NUM_RECIPES;
        struct ice_prot_lkup_ext *lkup_exts;
@@ -2481,6 +2482,15 @@ ice_get_recp_frm_fw(struct ice_hw *hw, struct 
ice_sw_recipe *recps, u8 rid,
         */
        lkup_exts = &recps[rid].lkup_exts;
 
+       /* Remove duplicate entries */
+       LIST_FOR_EACH_ENTRY_SAFE(rg, tmprg_entry, &recps[rid].rg_list,
+                                ice_recp_grp_entry, l_entry) {
+               if (rg->rid == rid) {
+                       LIST_DEL(&rg->l_entry);
+                       ice_free(hw, rg);
+               }
+       }
+
        for (sub_recps = 0; sub_recps < num_recps; sub_recps++) {
                struct ice_aqc_recipe_data_elem root_bufs = tmp[sub_recps];
                struct ice_recp_grp_entry *rg_entry;
-- 
2.47.3

Reply via email to