]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: E-Switch, skip uplink IB rep load for SD secondary devices
authorShay Drory <shayd@nvidia.com>
Fri, 12 Jun 2026 11:38:50 +0000 (14:38 +0300)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jun 2026 18:40:49 +0000 (11:40 -0700)
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@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260612113904.537595-2-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 830fc910a0801eeb334bbb7021c428ff74355602..12805e80ce57d9db4f03fd6b73d13f0061b02baf 100644 (file)
@@ -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)