It was removed in commit ad667d626825 ("ice: remove null checks before
devm_kfree() calls"). Now it's useful again.

Signed-off-by: Marcin Szycik <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
Reviewed-by: Przemek Kitszel <[email protected]>
---
v3:
* ice_flow_acl_add_scen_entry_sync(), ice_flow_add_entry(): call
  ice_flow_acl_free_act_cntr() in unroll
v2:
* Add this patch
---
 drivers/net/ethernet/intel/ice/ice_flow.c | 61 +++++++++++++++--------
 1 file changed, 39 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_flow.c 
b/drivers/net/ethernet/intel/ice/ice_flow.c
index df82cb36a58b..d3e8e7d1ec89 100644
--- a/drivers/net/ethernet/intel/ice/ice_flow.c
+++ b/drivers/net/ethernet/intel/ice/ice_flow.c
@@ -1589,6 +1589,23 @@ ice_flow_find_prof_id(struct ice_hw *hw, enum ice_block 
blk, u64 prof_id)
        return NULL;
 }
 
+/**
+ * ice_dealloc_flow_entry - Deallocate flow entry memory
+ * @hw: pointer to the HW struct
+ * @entry: flow entry to be removed
+ */
+static void
+ice_dealloc_flow_entry(struct ice_hw *hw, struct ice_flow_entry *entry)
+{
+       if (!entry)
+               return;
+
+       kfree(entry->entry);
+       kfree(entry->range_buf);
+       kfree(entry->acts);
+       devm_kfree(ice_hw_to_dev(hw), entry);
+}
+
 /**
  * ice_flow_get_hw_prof - return the HW profile for a specific profile ID 
handle
  * @hw: pointer to the HW struct
@@ -1759,11 +1776,7 @@ static int ice_flow_rem_entry_sync(struct ice_hw *hw, 
enum ice_block blk,
        }
 
        list_del(&entry->l_entry);
-
-       kfree(entry->entry);
-       kfree(entry->range_buf);
-       kfree(entry->acts);
-       devm_kfree(ice_hw_to_dev(hw), entry);
+       ice_dealloc_flow_entry(hw, entry);
 
        return 0;
 }
@@ -2877,6 +2890,9 @@ static int ice_flow_acl_add_scen_entry_sync(struct ice_hw 
*hw,
                        /* For the action memory info, update the SW's copy of
                         * exist entry with e's action memory info
                         */
+                       if (exist->acts_cnt && exist->acts)
+                               ice_flow_acl_free_act_cntr(hw, exist->acts,
+                                                          exist->acts_cnt);
                        kfree(exist->acts);
                        exist->acts = kzalloc_objs(*exist->acts, e->acts_cnt);
                        if (!exist->acts) {
@@ -2906,13 +2922,13 @@ static int ice_flow_acl_add_scen_entry_sync(struct 
ice_hw *hw,
                                goto out;
                }
 
-               /* As we don't add the new entry to our SW DB, deallocate its
-                * memories, and return the exist entry to the caller
+               /* As we don't add the new entry to our SW DB, free its HW
+                * counter resources and deallocate its memory, then return
+                * the exist entry to the caller
                 */
-               kfree(e->entry);
-               kfree(e->range_buf);
-               kfree(e->acts);
-               devm_kfree(ice_hw_to_dev(hw), e);
+               if (e->acts_cnt && e->acts)
+                       ice_flow_acl_free_act_cntr(hw, e->acts, e->acts_cnt);
+               ice_dealloc_flow_entry(hw, e);
                *entry = exist;
        }
 out:
@@ -2993,7 +3009,7 @@ int ice_flow_add_entry(struct ice_hw *hw, enum ice_block 
blk, u64 prof_id,
 
        mutex_unlock(&hw->fl_profs_locks[blk]);
        if (status)
-               goto out;
+               goto dealloc_entry;
 
        e->id = entry_id;
        e->vsi_handle = vsi_handle;
@@ -3009,15 +3025,15 @@ int ice_flow_add_entry(struct ice_hw *hw, enum 
ice_block blk, u64 prof_id,
                status = ice_flow_acl_frmt_entry(hw, prof, e, (u8 *)data, acts,
                                                 acts_cnt);
                if (status)
-                       goto out;
+                       goto dealloc_entry;
 
                status = ice_flow_acl_add_scen_entry(hw, prof, &e);
                if (status)
-                       goto out;
+                       goto free_cntrs;
                break;
        default:
                status = -EOPNOTSUPP;
-               goto out;
+               goto dealloc_entry;
        }
 
        if (blk != ICE_BLK_ACL) {
@@ -3029,13 +3045,14 @@ int ice_flow_add_entry(struct ice_hw *hw, enum 
ice_block blk, u64 prof_id,
 
        *entry_h = ICE_FLOW_ENTRY_HNDL(e);
 
-out:
-       if (status && e) {
-               kfree(e->entry);
-               kfree(e->range_buf);
-               kfree(e->acts);
-               devm_kfree(ice_hw_to_dev(hw), e);
-       }
+       return 0;
+
+free_cntrs:
+       if (blk == ICE_BLK_ACL && e->acts_cnt && e->acts)
+               ice_flow_acl_free_act_cntr(hw, e->acts, e->acts_cnt);
+dealloc_entry:
+       if (e)
+               ice_dealloc_flow_entry(hw, e);
 
        return status;
 }
-- 
2.49.0

Reply via email to