| From ff60f3f938363419a27d87f6d4739a6b5ee365ef Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 Nov 2025 09:58:26 -0800 |
| Subject: ice: Avoid detrimental cleanup for bond during interface stop |
| |
| From: Dave Ertman <david.m.ertman@intel.com> |
| |
| [ Upstream commit a9d45c22ed120cdd15ff56d0a6e4700c46451901 ] |
| |
| When the user issues an administrative down to an interface that is the |
| primary for an aggregate bond, the prune lists are being purged. This |
| breaks communication to the secondary interface, which shares a prune |
| list on the main switch block while bonded together. |
| |
| For the primary interface of an aggregate, avoid deleting these prune |
| lists during stop, and since they are hardcoded to specific values for |
| the default vlan and QinQ vlans, the attempt to re-add them during the |
| up phase will quietly fail without any additional problem. |
| |
| Fixes: 1e0f9881ef79 ("ice: Flesh out implementation of support for SRIOV on bonded interface") |
| Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> |
| Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com> |
| Signed-off-by: Dave Ertman <david.m.ertman@intel.com> |
| Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel) |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/ice/ice_lib.c | 25 ++++++++++++++++-------- |
| 1 file changed, 17 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c |
| index 8f8bdc3072ccc..4e022de9e4bbd 100644 |
| --- a/drivers/net/ethernet/intel/ice/ice_lib.c |
| +++ b/drivers/net/ethernet/intel/ice/ice_lib.c |
| @@ -3746,22 +3746,31 @@ int ice_vsi_add_vlan_zero(struct ice_vsi *vsi) |
| int ice_vsi_del_vlan_zero(struct ice_vsi *vsi) |
| { |
| struct ice_vsi_vlan_ops *vlan_ops = ice_get_compat_vsi_vlan_ops(vsi); |
| + struct ice_pf *pf = vsi->back; |
| struct ice_vlan vlan; |
| int err; |
| |
| - vlan = ICE_VLAN(0, 0, 0); |
| - err = vlan_ops->del_vlan(vsi, &vlan); |
| - if (err && err != -EEXIST) |
| - return err; |
| + if (pf->lag && pf->lag->primary) { |
| + dev_dbg(ice_pf_to_dev(pf), "Interface is primary in aggregate - not deleting prune list\n"); |
| + } else { |
| + vlan = ICE_VLAN(0, 0, 0); |
| + err = vlan_ops->del_vlan(vsi, &vlan); |
| + if (err && err != -EEXIST) |
| + return err; |
| + } |
| |
| /* in SVM both VLAN 0 filters are identical */ |
| if (!ice_is_dvm_ena(&vsi->back->hw)) |
| return 0; |
| |
| - vlan = ICE_VLAN(ETH_P_8021Q, 0, 0); |
| - err = vlan_ops->del_vlan(vsi, &vlan); |
| - if (err && err != -EEXIST) |
| - return err; |
| + if (pf->lag && pf->lag->primary) { |
| + dev_dbg(ice_pf_to_dev(pf), "Interface is primary in aggregate - not deleting QinQ prune list\n"); |
| + } else { |
| + vlan = ICE_VLAN(ETH_P_8021Q, 0, 0); |
| + err = vlan_ops->del_vlan(vsi, &vlan); |
| + if (err && err != -EEXIST) |
| + return err; |
| + } |
| |
| /* when deleting the last VLAN filter, make sure to disable the VLAN |
| * promisc mode so the filter isn't left by accident |
| -- |
| 2.51.0 |
| |