Add locking mechanism around profile map list.

Signed-off-by: Dan Nowlin <dan.now...@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell...@intel.com>
Signed-off-by: Leyi Rong <leyi.r...@intel.com>
---
 drivers/net/ice/base/ice_flex_pipe.c | 31 +++++++++++++++++-----------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ice/base/ice_flex_pipe.c 
b/drivers/net/ice/base/ice_flex_pipe.c
index fdbf893a8..5864cbf3e 100644
--- a/drivers/net/ice/base/ice_flex_pipe.c
+++ b/drivers/net/ice/base/ice_flex_pipe.c
@@ -3973,6 +3973,8 @@ ice_add_prof(struct ice_hw *hw, enum ice_block blk, u64 
id, u8 ptypes[],
        u32 byte = 0;
        u8 prof_id;
 
+       ice_acquire_lock(&hw->blk[blk].es.prof_map_lock);
+
        /* search for existing profile */
        status = ice_find_prof_id(hw, blk, es, &prof_id);
        if (status) {
@@ -4044,11 +4046,12 @@ ice_add_prof(struct ice_hw *hw, enum ice_block blk, u64 
id, u8 ptypes[],
                bytes--;
                byte++;
        }
-       LIST_ADD(&prof->list, &hw->blk[blk].es.prof_map);
 
-       return ICE_SUCCESS;
+       LIST_ADD(&prof->list, &hw->blk[blk].es.prof_map);
+       status = ICE_SUCCESS;
 
 err_ice_add_prof:
+       ice_release_lock(&hw->blk[blk].es.prof_map_lock);
        return status;
 }
 
@@ -4350,29 +4353,33 @@ ice_rem_flow_all(struct ice_hw *hw, enum ice_block blk, 
u64 id)
  */
 enum ice_status ice_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 id)
 {
-       enum ice_status status;
        struct ice_prof_map *pmap;
+       enum ice_status status;
 
-       pmap = ice_search_prof_id(hw, blk, id);
-       if (!pmap)
-               return ICE_ERR_DOES_NOT_EXIST;
+       ice_acquire_lock(&hw->blk[blk].es.prof_map_lock);
+
+       pmap = ice_search_prof_id_low(hw, blk, id);
+       if (!pmap) {
+               status = ICE_ERR_DOES_NOT_EXIST;
+               goto err_ice_rem_prof;
+       }
 
        /* remove all flows with this profile */
        status = ice_rem_flow_all(hw, blk, pmap->profile_cookie);
        if (status)
-               return status;
+               goto err_ice_rem_prof;
 
-       /* remove profile */
-       status = ice_free_prof_id(hw, blk, pmap->prof_id);
-       if (status)
-               return status;
        /* dereference profile, and possibly remove */
        ice_prof_dec_ref(hw, blk, pmap->prof_id);
 
        LIST_DEL(&pmap->list);
        ice_free(hw, pmap);
 
-       return ICE_SUCCESS;
+       status = ICE_SUCCESS;
+
+err_ice_rem_prof:
+       ice_release_lock(&hw->blk[blk].es.prof_map_lock);
+       return status;
 }
 
 /**
-- 
2.17.1

Reply via email to