ice: cleanup rules info
authorVictor Raj <victor.raj@intel.com>
Fri, 6 Aug 2021 08:49:03 +0000 (10:49 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 11 Oct 2021 15:49:55 +0000 (08:49 -0700)
Change ICE_SW_LKUP_LAST to ICE_MAX_NUM_RECIPES as for now there also can
be recipes other than the default.

Free all structures created for advanced recipes in cleanup function.
Write a function to clean allocated structures on advanced rule info.

Signed-off-by: Victor Raj <victor.raj@intel.com>
Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com>
Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_common.c
drivers/net/ethernet/intel/ice/ice_switch.c

index bff4c09..152a140 100644 (file)
@@ -595,17 +595,42 @@ static void ice_cleanup_fltr_mgmt_struct(struct ice_hw *hw)
                list_del(&v_pos_map->list_entry);
                devm_kfree(ice_hw_to_dev(hw), v_pos_map);
        }
-       recps = hw->switch_info->recp_list;
-       for (i = 0; i < ICE_SW_LKUP_LAST; i++) {
-               struct ice_fltr_mgmt_list_entry *lst_itr, *tmp_entry;
+       recps = sw->recp_list;
+       for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) {
+               struct ice_recp_grp_entry *rg_entry, *tmprg_entry;
 
                recps[i].root_rid = i;
-               mutex_destroy(&recps[i].filt_rule_lock);
-               list_for_each_entry_safe(lst_itr, tmp_entry,
-                                        &recps[i].filt_rules, list_entry) {
-                       list_del(&lst_itr->list_entry);
-                       devm_kfree(ice_hw_to_dev(hw), lst_itr);
+               list_for_each_entry_safe(rg_entry, tmprg_entry,
+                                        &recps[i].rg_list, l_entry) {
+                       list_del(&rg_entry->l_entry);
+                       devm_kfree(ice_hw_to_dev(hw), rg_entry);
                }
+
+               if (recps[i].adv_rule) {
+                       struct ice_adv_fltr_mgmt_list_entry *tmp_entry;
+                       struct ice_adv_fltr_mgmt_list_entry *lst_itr;
+
+                       mutex_destroy(&recps[i].filt_rule_lock);
+                       list_for_each_entry_safe(lst_itr, tmp_entry,
+                                                &recps[i].filt_rules,
+                                                list_entry) {
+                               list_del(&lst_itr->list_entry);
+                               devm_kfree(ice_hw_to_dev(hw), lst_itr->lkups);
+                               devm_kfree(ice_hw_to_dev(hw), lst_itr);
+                       }
+               } else {
+                       struct ice_fltr_mgmt_list_entry *lst_itr, *tmp_entry;
+
+                       mutex_destroy(&recps[i].filt_rule_lock);
+                       list_for_each_entry_safe(lst_itr, tmp_entry,
+                                                &recps[i].filt_rules,
+                                                list_entry) {
+                               list_del(&lst_itr->list_entry);
+                               devm_kfree(ice_hw_to_dev(hw), lst_itr);
+                       }
+               }
+               if (recps[i].root_buf)
+                       devm_kfree(ice_hw_to_dev(hw), recps[i].root_buf);
        }
        ice_rm_all_sw_replay_rule_info(hw);
        devm_kfree(ice_hw_to_dev(hw), sw->recp_list);
index 81dee4b..0d07547 100644 (file)
@@ -2683,6 +2683,27 @@ ice_rem_sw_rule_info(struct ice_hw *hw, struct list_head *rule_head)
 }
 
 /**
+ * ice_rem_adv_rule_info
+ * @hw: pointer to the hardware structure
+ * @rule_head: pointer to the switch list structure that we want to delete
+ */
+static void
+ice_rem_adv_rule_info(struct ice_hw *hw, struct list_head *rule_head)
+{
+       struct ice_adv_fltr_mgmt_list_entry *tmp_entry;
+       struct ice_adv_fltr_mgmt_list_entry *lst_itr;
+
+       if (list_empty(rule_head))
+               return;
+
+       list_for_each_entry_safe(lst_itr, tmp_entry, rule_head, list_entry) {
+               list_del(&lst_itr->list_entry);
+               devm_kfree(ice_hw_to_dev(hw), lst_itr->lkups);
+               devm_kfree(ice_hw_to_dev(hw), lst_itr);
+       }
+}
+
+/**
  * ice_cfg_dflt_vsi - change state of VSI to set/clear default
  * @hw: pointer to the hardware structure
  * @vsi_handle: VSI handle to set as default
@@ -5183,12 +5204,15 @@ void ice_rm_all_sw_replay_rule_info(struct ice_hw *hw)
        if (!sw)
                return;
 
-       for (i = 0; i < ICE_SW_LKUP_LAST; i++) {
+       for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) {
                if (!list_empty(&sw->recp_list[i].filt_replay_rules)) {
                        struct list_head *l_head;
 
                        l_head = &sw->recp_list[i].filt_replay_rules;
-                       ice_rem_sw_rule_info(hw, l_head);
+                       if (!sw->recp_list[i].adv_rule)
+                               ice_rem_sw_rule_info(hw, l_head);
+                       else
+                               ice_rem_adv_rule_info(hw, l_head);
                }
        }
 }