It was removed in commit ad667d626825 ("ice: remove null checks before devm_kfree() calls"). Now it's useful again. Signed-off-by: Marcin Szycik Reviewed-by: Aleksandr Loktionov Reviewed-by: Przemek Kitszel --- 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