]> www.infradead.org Git - users/hch/misc.git/commitdiff
net/mlx5: E-Switch, Register representors for adjacent vports
authorSaeed Mahameed <saeedm@nvidia.com>
Fri, 29 Aug 2025 22:37:20 +0000 (15:37 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 2 Sep 2025 13:18:16 +0000 (15:18 +0200)
Register representors for adjacent vports dynamically when they are
discovered. Dynamically added representors state will now be set to
'REGISTERED' when the representor type was already registered,
otherwise they won't be loaded.

Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250829223722.900629-6-saeed@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 1d104b3fe9e049c6ab20ef5a05c08e255df9c1d4..3380f85678bc13dcfeac4cdfb8e2531b9b8214a5 100644 (file)
@@ -85,10 +85,19 @@ static int mlx5_esw_adj_vport_create(struct mlx5_eswitch *esw, u16 vhca_id)
 
        mlx5_fs_vport_egress_acl_ns_add(esw->dev->priv.steering, vport->index);
        mlx5_fs_vport_ingress_acl_ns_add(esw->dev->priv.steering, vport->index);
+       err = mlx5_esw_offloads_rep_add(esw, vport);
+       if (err)
+               goto acl_ns_remove;
 
        mlx5_esw_adj_vport_modify(esw->dev, vport_num, MLX5_ADJ_VPORT_CONNECT);
        return 0;
 
+acl_ns_remove:
+       mlx5_fs_vport_ingress_acl_ns_remove(esw->dev->priv.steering,
+                                           vport->index);
+       mlx5_fs_vport_egress_acl_ns_remove(esw->dev->priv.steering,
+                                          vport->index);
+       mlx5_esw_vport_free(esw, vport);
 destroy_esw_vport:
        mlx5_esw_destroy_esw_vport(esw->dev, vport_num);
        return err;
@@ -103,6 +112,7 @@ static void mlx5_esw_adj_vport_destroy(struct mlx5_eswitch *esw,
                  vport_num, vport->vhca_id);
        mlx5_esw_adj_vport_modify(esw->dev, vport_num,
                                  MLX5_ADJ_VPORT_DISCONNECT);
+       mlx5_esw_offloads_rep_remove(esw, vport);
        mlx5_fs_vport_egress_acl_ns_remove(esw->dev->priv.steering,
                                           vport->index);
        mlx5_fs_vport_ingress_acl_ns_remove(esw->dev->priv.steering,
index 2c0e5ca73f3d1b7048f270593be61beff497ba25..6d36d8bbb9799c11c6277b1f6ef18195837e0209 100644 (file)
@@ -838,6 +838,11 @@ void mlx5_esw_vport_vhca_id_unmap(struct mlx5_eswitch *esw,
 int mlx5_eswitch_vhca_id_to_vport(struct mlx5_eswitch *esw, u16 vhca_id, u16 *vport_num);
 bool mlx5_esw_vport_vhca_id(struct mlx5_eswitch *esw, u16 vportn, u16 *vhca_id);
 
+void mlx5_esw_offloads_rep_remove(struct mlx5_eswitch *esw,
+                                 const struct mlx5_vport *vport);
+int mlx5_esw_offloads_rep_add(struct mlx5_eswitch *esw,
+                             const struct mlx5_vport *vport);
+
 /**
  * struct mlx5_esw_event_info - Indicates eswitch mode changed/changing.
  *
index fb03981d50365fa4a6335920422f7ca6583a3595..d57f86d297abf3dcd0e1c06cf994fafff8753b31 100644 (file)
@@ -2378,7 +2378,20 @@ static int esw_offloads_start(struct mlx5_eswitch *esw,
        return 0;
 }
 
-static int mlx5_esw_offloads_rep_init(struct mlx5_eswitch *esw, const struct mlx5_vport *vport)
+void mlx5_esw_offloads_rep_remove(struct mlx5_eswitch *esw,
+                                 const struct mlx5_vport *vport)
+{
+       struct mlx5_eswitch_rep *rep = xa_load(&esw->offloads.vport_reps,
+                                              vport->vport);
+
+       if (!rep)
+               return;
+       xa_erase(&esw->offloads.vport_reps, vport->vport);
+       kfree(rep);
+}
+
+int mlx5_esw_offloads_rep_add(struct mlx5_eswitch *esw,
+                             const struct mlx5_vport *vport)
 {
        struct mlx5_eswitch_rep *rep;
        int rep_type;
@@ -2390,9 +2403,19 @@ static int mlx5_esw_offloads_rep_init(struct mlx5_eswitch *esw, const struct mlx
 
        rep->vport = vport->vport;
        rep->vport_index = vport->index;
-       for (rep_type = 0; rep_type < NUM_REP_TYPES; rep_type++)
-               atomic_set(&rep->rep_data[rep_type].state, REP_UNREGISTERED);
-
+       for (rep_type = 0; rep_type < NUM_REP_TYPES; rep_type++) {
+               if (!esw->offloads.rep_ops[rep_type]) {
+                       atomic_set(&rep->rep_data[rep_type].state,
+                                  REP_UNREGISTERED);
+                       continue;
+               }
+               /* Dynamic/delegated vports add their representors after
+                * mlx5_eswitch_register_vport_reps, so mark them as registered
+                * for them to be loaded later with the others.
+                */
+               rep->esw = esw;
+               atomic_set(&rep->rep_data[rep_type].state, REP_REGISTERED);
+       }
        err = xa_insert(&esw->offloads.vport_reps, rep->vport, rep, GFP_KERNEL);
        if (err)
                goto insert_err;
@@ -2430,7 +2453,7 @@ static int esw_offloads_init_reps(struct mlx5_eswitch *esw)
        xa_init(&esw->offloads.vport_reps);
 
        mlx5_esw_for_each_vport(esw, i, vport) {
-               err = mlx5_esw_offloads_rep_init(esw, vport);
+               err = mlx5_esw_offloads_rep_add(esw, vport);
                if (err)
                        goto err;
        }