Message ID | 20250428193339.1692360-1-david.m.ertman@intel.com |
---|---|
State | Under Review |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [iwl-net] ice: Fix LACP bonds without SRIOV environment | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Dave Ertman > Sent: Tuesday, April 29, 2025 1:04 AM > To: intel-wired-lan@lists.osuosl.org > Cc: Loktionov, Aleksandr <aleksandr.loktionov@intel.com> > Subject: [Intel-wired-lan] [PATCH iwl-net] ice: Fix LACP bonds without SRIOV > environment > > If an aggregate has the following conditions: > - The SRIOV LAG DDP package has been enabled > - The bond is in 802.3ad LACP mode > - The bond is disqualified from supporting SRIOV VF LAG > - Both interfaces were added simultaneously to the bond (same command) > > Then there is a chance that the two interfaces will be assigned different LACP > Aggregator ID's. This will cause a failure of the LACP control over the bond. > > To fix this, we can detect if the primary interface for the bond (as defined by > the driver) is not in switchdev mode, and exit the setup flow if so. > > Reproduction steps: > > %> ip link add bond0 type bond mode 802.3ad miimon 100 %> ip link set > bond0 up %> ifenslave bond0 eth0 eth1 %> cat /proc/net/bonding/bond0 | > grep Agg > > Check for Aggregator IDs that differ. > > Fixes: ec5a6c5f79ed ("ice: process events created by lag netdev event > handler") > Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > Signed-off-by: Dave Ertman <david.m.ertman@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_lag.c | 6 ++++++ > 1 file changed, 6 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 22371011c249..2410aee59fb2 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.c +++ b/drivers/net/ethernet/intel/ice/ice_lag.c @@ -1321,12 +1321,18 @@ static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr) */ if (!primary_lag) { lag->primary = true; + if (!ice_is_switchdev_running(lag->pf)) + return; + /* Configure primary's SWID to be shared */ ice_lag_primary_swid(lag, true); primary_lag = lag; } else { u16 swid; + if (!ice_is_switchdev_running(primary_lag->pf)) + return; + swid = primary_lag->pf->hw.port_info->sw_id; ice_lag_set_swid(swid, lag, true); ice_lag_add_prune_list(primary_lag, lag->pf);