net/mlx5: E-Switch, Register representors for adjacent vports

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>
This commit is contained in:
Saeed Mahameed 2025-08-29 15:37:20 -07:00 committed by Paolo Abeni
parent 9984ec9f1f
commit a0a7002b94
3 changed files with 43 additions and 5 deletions

View 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,

View 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.
*

View 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;
}