net/ice/base: remove local VSIG allocations
authorQi Zhang <qi.z.zhang@intel.com>
Mon, 25 Mar 2019 05:44:38 +0000 (13:44 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Mar 2019 16:25:31 +0000 (17:25 +0100)
If allocating a VSI to a VSIG fails the local allocations made for VSIG
profiles and change-lists will not be removed. Adding calls to free
these entries on error in VSIG management calls.

Signed-off-by: Vignesh Sridhar <vignesh.sridhar@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Reviewed-by: Qiming Yang <qiming.yang@intel.com>
Reviewed-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
drivers/net/ice/base/ice_flex_pipe.c

index 900a193..8876092 100644 (file)
@@ -4523,8 +4523,10 @@ ice_add_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, u16 vsig, u64 hdl,
 
                /* allocate the TCAM entry index */
                status = ice_alloc_tcam_ent(hw, blk, &tcam_idx);
-               if (status)
+               if (status) {
+                       ice_free(hw, p);
                        goto err_ice_add_prof_id_vsig;
+               }
 
                t->tcam[i].ptg = ptg;
                t->tcam[i].prof_id = map->prof_id;
@@ -4563,6 +4565,7 @@ ice_add_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, u16 vsig, u64 hdl,
 
 err_ice_add_prof_id_vsig:
        /* let caller clean up the change list */
+       ice_free(hw, t);
        return ICE_ERR_NO_MEMORY;
 }
 
@@ -4587,16 +4590,18 @@ ice_create_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl,
                return ICE_ERR_NO_MEMORY;
 
        new_vsig = ice_vsig_alloc(hw, blk);
-       if (!new_vsig)
-               return ICE_ERR_HW_TABLE;
+       if (!new_vsig) {
+               status = ICE_ERR_HW_TABLE;
+               goto err_ice_create_prof_id_vsig;
+       }
 
        status = ice_move_vsi(hw, blk, vsi, new_vsig, chg);
        if (status)
-               return status;
+               goto err_ice_create_prof_id_vsig;
 
        status = ice_add_prof_id_vsig(hw, blk, new_vsig, hdl, chg);
        if (status)
-               return status;
+               goto err_ice_create_prof_id_vsig;
 
        p->type = ICE_VSIG_ADD;
        p->vsi = vsi;
@@ -4606,6 +4611,11 @@ ice_create_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl,
        LIST_ADD(&p->list_entry, chg);
 
        return ICE_SUCCESS;
+
+err_ice_create_prof_id_vsig:
+       /* let caller clean up the change list */
+       ice_free(hw, p);
+       return status;
 }
 
 /**