mirror of
https://github.com/torvalds/linux.git
synced 2026-07-29 02:31:27 +02:00
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:
parent
9984ec9f1f
commit
a0a7002b94
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user