Re: [PATCH net v2 2/3] net/mlx5: LAG, check if vport exists on br_offloads
From: Mark Bloch <mbloch@nvidia.com>
Date: 2026-09-15 19:52:14
On 14/09/2026 11:54, Bernardo Soares wrote:
mlx5_esw_bridge_lower_rep_vport_num_vhca_id_get() walks a LAG bond's lower devices and returns the first rep that's structurally eligible (same HCA, is a rep), without checking it's tracked by the calling instance's br_offloads. On a merged-eswitch HCA where a bond spans reps of more than one eswitch instance, this can return a sibling's rep instead of continuing to the one this instance actually owns - reached via mlx5_esw_bridge_port_obj_attr_set(), so a bridge attribute change on a bonded uplink can silently no-op on the right instance. Fix by checking mlx5_esw_bridge_port_exists() at the point each rep is picked, same as the previous commit did for the single-rep case. Signed-off-by: Bernardo Soares <redacted>
Please squash this into patch 1. Mark> ---
quoted hunk ↗ jump to hunk
v2: new patch, addresses review comment on v1 asking whether mlx5_esw_bridge_lower_rep_vport_num_vhca_id_get() should verify the rep it picks while walking a LAG bond's lower devices is actually tracked by the calling instance's br_offloads, since it otherwise returns on the first structurally-eligible rep found, which is not necessarily the one owned by this eswitch instance. --- .../net/ethernet/mellanox/mlx5/core/en/rep/bridge.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c index 56592e2e6b9b..4b7b0a0fc2b2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c@@ -85,9 +85,16 @@ mlx5_esw_bridge_lower_rep_vport_num_vhca_id_get(struct net_device *dev, struct m struct net_device *lower_dev; struct list_head *iter; - if (netif_is_lag_master(dev) || mlx5e_eswitch_rep(dev)) - return mlx5_esw_bridge_rep_vport_num_vhca_id_get(dev, esw, vport_num, - esw_owner_vhca_id); + if (netif_is_lag_master(dev) || mlx5e_eswitch_rep(dev)) { + struct net_device *rep; + + rep = mlx5_esw_bridge_rep_vport_num_vhca_id_get(dev, esw, vport_num, + esw_owner_vhca_id); + if (rep && !mlx5_esw_bridge_port_exists(*vport_num, *esw_owner_vhca_id, + esw->br_offloads)) + return NULL; + return rep; + } netdev_for_each_lower_dev(dev, lower_dev, iter) { struct net_device *rep;