Message ID | 20230915153518.464595-2-marcin.szycik@linux.intel.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [iwl-net] ice: block default rule setting on LAG interface | expand |
On Fri, Sep 15, 2023 at 05:35:19PM +0200, Marcin Szycik wrote: > From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > > When one of the LAG interfaces is in switchdev mode, setting default rule > can't be done. > > The interface on which switchdev is running has ice_set_rx_mode() blocked > to avoid default rule adding (and other rules). The other interfaces > (without switchdev running but connected via bond with interface that > runs switchdev) can't follow the same scheme, because rx filtering needs > to be disabled when failover happens. Notification for bridge to set > promisc mode seems like good place to do that. > > Fixes: bb52f42acef6 ("ice: Add driver support for firmware changes for LAG") > Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com> > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> Reviewed-by: Simon Horman <horms@kernel.org>
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Marcin Szycik > Sent: Friday, September 15, 2023 9:05 PM > To: intel-wired-lan@lists.osuosl.org > Cc: netdev@vger.kernel.org; Marcin Szycik <marcin.szycik@linux.intel.com>; > Kitszel, Przemyslaw <przemyslaw.kitszel@intel.com>; Michal Swiatkowski > <michal.swiatkowski@linux.intel.com> > Subject: [Intel-wired-lan] [PATCH iwl-net] ice: block default rule setting on > LAG interface > > From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > > When one of the LAG interfaces is in switchdev mode, setting default rule > can't be done. > > The interface on which switchdev is running has ice_set_rx_mode() blocked > to avoid default rule adding (and other rules). The other interfaces (without > switchdev running but connected via bond with interface that runs > switchdev) can't follow the same scheme, because rx filtering needs to be > disabled when failover happens. Notification for bridge to set promisc mode > seems like good place to do that. > > Fixes: bb52f42acef6 ("ice: Add driver support for firmware changes for LAG") > Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com> > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_lag.c | 32 ++++++++++++++++++++++++ > drivers/net/ethernet/intel/ice/ice_lag.h | 1 + > drivers/net/ethernet/intel/ice/ice_lib.c | 6 +++++ > 3 files changed, 39 insertions(+) > Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_lag.c b/drivers/net/ethernet/intel/ice/ice_lag.c index 4f39863b5537..7b1256992dcf 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.c +++ b/drivers/net/ethernet/intel/ice/ice_lag.c @@ -2093,3 +2093,35 @@ void ice_lag_rebuild(struct ice_pf *pf) } mutex_unlock(&pf->lag_mutex); } + +/** + * ice_lag_is_switchdev_running + * @pf: pointer to PF structure + * + * Check if switchdev is running on any of the interfaces connected to lag. + */ +bool ice_lag_is_switchdev_running(struct ice_pf *pf) +{ + struct ice_lag *lag = pf->lag; + struct net_device *tmp_nd; + + if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || !lag) + return false; + + rcu_read_lock(); + for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { + struct ice_netdev_priv *priv = netdev_priv(tmp_nd); + + if (!netif_is_ice(tmp_nd) || !priv || !priv->vsi || + !priv->vsi->back) + continue; + + if (ice_is_switchdev_running(priv->vsi->back)) { + rcu_read_unlock(); + return true; + } + } + rcu_read_unlock(); + + return false; +} diff --git a/drivers/net/ethernet/intel/ice/ice_lag.h b/drivers/net/ethernet/intel/ice/ice_lag.h index 18075b82485a..facb6c894b6d 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.h +++ b/drivers/net/ethernet/intel/ice/ice_lag.h @@ -62,4 +62,5 @@ void ice_lag_move_new_vf_nodes(struct ice_vf *vf); int ice_init_lag(struct ice_pf *pf); void ice_deinit_lag(struct ice_pf *pf); void ice_lag_rebuild(struct ice_pf *pf); +bool ice_lag_is_switchdev_running(struct ice_pf *pf); #endif /* _ICE_LAG_H_ */ diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 201570cd2e0b..7bf9b7069754 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -3575,6 +3575,12 @@ int ice_set_dflt_vsi(struct ice_vsi *vsi) dev = ice_pf_to_dev(vsi->back); + if (ice_lag_is_switchdev_running(vsi->back)) { + dev_dbg(dev, "VSI %d passed is a part of LAG containing interfaces in switchdev mode, nothing to do\n", + vsi->vsi_num); + return 0; + } + /* the VSI passed in is already the default VSI */ if (ice_is_vsi_dflt_vsi(vsi)) { dev_dbg(dev, "VSI %d passed in is already the default forwarding VSI, nothing to do\n",