ice: block default rule setting on LAG interface
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: bb52f42ace
("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>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
66cf7435a2
commit
776fe19953
|
@ -2093,3 +2093,35 @@ lag_rebuild_out:
|
|||
}
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue