[PATCH net-next 01/15] net/mlx5: E-Switch, skip uplink IB rep load for SD secondary devices
From: Tariq Toukan
Date: Thu Jun 04 2026 - 07:52:22 EST
From: Shay Drory <shayd@xxxxxxxxxx>
SD secondary devices share the primary's uplink and do not have
their own uplink representor. When reloading IB reps on secondary
devices, skip the uplink and only load VF/SF vport IB reps.
Signed-off-by: Shay Drory <shayd@xxxxxxxxxx>
Reviewed-by: Mark Bloch <mbloch@xxxxxxxxxx>
Signed-off-by: Tariq Toukan <tariqt@xxxxxxxxxx>
---
.../mellanox/mlx5/core/eswitch_offloads.c | 25 ++++++++++++++++---
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 830fc910a080..12805e80ce57 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -3643,11 +3643,19 @@ int mlx5_eswitch_reload_ib_reps(struct mlx5_eswitch *esw)
if (atomic_read(&rep->rep_data[REP_ETH].state) != REP_LOADED)
return 0;
- ret = __esw_offloads_load_rep(esw, rep, REP_IB, NULL);
- if (ret)
- return ret;
+ /* SD secondary devices share the primary's uplink and do not
+ * have their own uplink representor. Only load VF/SF vports.
+ */
+ if (mlx5_sd_is_primary(esw->dev)) {
+ ret = __esw_offloads_load_rep(esw, rep, REP_IB, NULL);
+ if (ret)
+ return ret;
+ }
mlx5_esw_for_each_rep(esw, i, rep) {
+ if (!mlx5_sd_is_primary(esw->dev) &&
+ rep->vport == MLX5_VPORT_UPLINK)
+ continue;
if (atomic_read(&rep->rep_data[REP_ETH].state) == REP_LOADED)
__esw_offloads_load_rep(esw, rep, REP_IB, NULL);
}
@@ -4586,14 +4594,23 @@ mlx5_eswitch_register_vport_reps_blocked(struct mlx5_eswitch *esw,
static void mlx5_eswitch_reload_reps_blocked(struct mlx5_eswitch *esw)
{
+ struct mlx5_eswitch_rep *uplink;
struct mlx5_vport *vport;
+ bool newly_loaded;
unsigned long i;
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
return;
- if (mlx5_esw_offloads_rep_load(esw, MLX5_VPORT_UPLINK))
+ uplink = mlx5_eswitch_get_rep(esw, MLX5_VPORT_UPLINK);
+ if (__esw_offloads_load_rep(esw, uplink, REP_ETH, &newly_loaded))
+ return;
+ if (mlx5_sd_is_primary(esw->dev) &&
+ __esw_offloads_load_rep(esw, uplink, REP_IB, NULL)) {
+ if (newly_loaded)
+ __esw_offloads_unload_rep(esw, uplink, REP_ETH);
return;
+ }
mlx5_esw_for_each_vport(esw, i, vport) {
if (!vport)
--
2.44.0