ice: move VSI delete outside deconfig
authorMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Wed, 21 Dec 2022 11:38:20 +0000 (12:38 +0100)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 3 Feb 2023 17:54:18 +0000 (09:54 -0800)
In deconfig VSI shouldn't be deleted from hw.

Rewrite VSI delete function to reflect that sometimes it is only needed
to remove VSI from hw without freeing the memory:
ice_vsi_delete() -> delete from HW and free memory
ice_vsi_delete_from_hw() -> delete only from HW

Value returned from ice_vsi_free() is never used. Change return type to
void.

Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_lib.h
drivers/net/ethernet/intel/ice/ice_main.c

index 528783d..1b83f67 100644 (file)
@@ -282,10 +282,10 @@ static int ice_get_free_slot(void *array, int size, int curr)
 }
 
 /**
- * ice_vsi_delete - delete a VSI from the switch
+ * ice_vsi_delete_from_hw - delete a VSI from the switch
  * @vsi: pointer to VSI being removed
  */
-void ice_vsi_delete(struct ice_vsi *vsi)
+static void ice_vsi_delete_from_hw(struct ice_vsi *vsi)
 {
        struct ice_pf *pf = vsi->back;
        struct ice_vsi_ctx *ctxt;
@@ -453,26 +453,21 @@ err_out:
  *
  * This deallocates the VSI's queue resources, removes it from the PF's
  * VSI array if necessary, and deallocates the VSI
- *
- * Returns 0 on success, negative on failure
  */
-int ice_vsi_free(struct ice_vsi *vsi)
+static void ice_vsi_free(struct ice_vsi *vsi)
 {
        struct ice_pf *pf = NULL;
        struct device *dev;
 
-       if (!vsi)
-               return 0;
-
-       if (!vsi->back)
-               return -EINVAL;
+       if (!vsi || !vsi->back)
+               return;
 
        pf = vsi->back;
        dev = ice_pf_to_dev(pf);
 
        if (!pf->vsi[vsi->idx] || pf->vsi[vsi->idx] != vsi) {
                dev_dbg(dev, "vsi does not exist at pf->vsi[%d]\n", vsi->idx);
-               return -EINVAL;
+               return;
        }
 
        mutex_lock(&pf->sw_mutex);
@@ -485,8 +480,12 @@ int ice_vsi_free(struct ice_vsi *vsi)
        ice_vsi_free_arrays(vsi);
        mutex_unlock(&pf->sw_mutex);
        devm_kfree(dev, vsi);
+}
 
-       return 0;
+void ice_vsi_delete(struct ice_vsi *vsi)
+{
+       ice_vsi_delete_from_hw(vsi);
+       ice_vsi_free(vsi);
 }
 
 /**
@@ -2851,7 +2850,7 @@ unroll_vector_base:
 unroll_alloc_q_vector:
        ice_vsi_free_q_vectors(vsi);
 unroll_vsi_init:
-       ice_vsi_delete(vsi);
+       ice_vsi_delete_from_hw(vsi);
 unroll_get_qs:
        ice_vsi_put_qs(vsi);
 unroll_vsi_alloc_stat:
@@ -2914,7 +2913,6 @@ void ice_vsi_decfg(struct ice_vsi *vsi)
 
        ice_vsi_clear_rings(vsi);
        ice_vsi_free_q_vectors(vsi);
-       ice_vsi_delete(vsi);
        ice_vsi_put_qs(vsi);
        ice_vsi_free_arrays(vsi);
 
@@ -3312,7 +3310,7 @@ int ice_vsi_release(struct ice_vsi *vsi)
         * for ex: during rmmod.
         */
        if (!ice_is_reset_in_progress(pf->state))
-               ice_vsi_free(vsi);
+               ice_vsi_delete(vsi);
 
        return 0;
 }
index ad4d531..8905f87 100644 (file)
@@ -42,7 +42,6 @@ void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create);
 int ice_set_link(struct ice_vsi *vsi, bool ena);
 
 void ice_vsi_delete(struct ice_vsi *vsi);
-int ice_vsi_free(struct ice_vsi *vsi);
 
 int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc);
 
index 77296db..a8920bc 100644 (file)
@@ -8573,12 +8573,9 @@ static void ice_remove_q_channels(struct ice_vsi *vsi, bool rem_fltr)
                /* clear the VSI from scheduler tree */
                ice_rm_vsi_lan_cfg(ch->ch_vsi->port_info, ch->ch_vsi->idx);
 
-               /* Delete VSI from FW */
+               /* Delete VSI from FW, PF and HW VSI arrays */
                ice_vsi_delete(ch->ch_vsi);
 
-               /* Delete VSI from PF and HW VSI arrays */
-               ice_vsi_free(ch->ch_vsi);
-
                /* free the channel */
                kfree(ch);
        }