| From 7ebeb8341f13ec52cb536c1ceb2ab75112564725 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 31 Mar 2022 09:20:06 -0700 |
| Subject: ice: Clear default forwarding VSI during VSI release |
| |
| From: Ivan Vecera <ivecera@redhat.com> |
| |
| [ Upstream commit bd8c624c0cd59de0032752ba3001c107bba97f7b ] |
| |
| VSI is set as default forwarding one when promisc mode is set for |
| PF interface, when PF is switched to switchdev mode or when VF |
| driver asks to enable allmulticast or promisc mode for the VF |
| interface (when vf-true-promisc-support priv flag is off). |
| The third case is buggy because in that case VSI associated with |
| VF remains as default one after VF removal. |
| |
| Reproducer: |
| 1. Create VF |
| echo 1 > sys/class/net/ens7f0/device/sriov_numvfs |
| 2. Enable allmulticast or promisc mode on VF |
| ip link set ens7f0v0 allmulticast on |
| ip link set ens7f0v0 promisc on |
| 3. Delete VF |
| echo 0 > sys/class/net/ens7f0/device/sriov_numvfs |
| 4. Try to enable promisc mode on PF |
| ip link set ens7f0 promisc on |
| |
| Although it looks that promisc mode on PF is enabled the opposite |
| is true because ice_vsi_sync_fltr() responsible for IFF_PROMISC |
| handling first checks if any other VSI is set as default forwarding |
| one and if so the function does not do anything. At this point |
| it is not possible to enable promisc mode on PF without re-probe |
| device. |
| |
| To resolve the issue this patch clear default forwarding VSI |
| during ice_vsi_release() when the VSI to be released is the default |
| one. |
| |
| Fixes: 01b5e89aab49 ("ice: Add VF promiscuous support") |
| Signed-off-by: Ivan Vecera <ivecera@redhat.com> |
| Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> |
| Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> |
| Signed-off-by: Alice Michael <alice.michael@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/ice/ice_lib.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c |
| index edba96845baf..e39e299e79a4 100644 |
| --- a/drivers/net/ethernet/intel/ice/ice_lib.c |
| +++ b/drivers/net/ethernet/intel/ice/ice_lib.c |
| @@ -3113,6 +3113,8 @@ int ice_vsi_release(struct ice_vsi *vsi) |
| } |
| } |
| |
| + if (ice_is_vsi_dflt_vsi(pf->first_sw, vsi)) |
| + ice_clear_dflt_vsi(pf->first_sw); |
| ice_fltr_remove_all(vsi); |
| ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx); |
| err = ice_rm_vsi_rdma_cfg(vsi->port_info, vsi->idx); |
| -- |
| 2.35.1 |
| |