mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
net/mlx5: E-Switch, Setup all vports' metadata to support peer miss rule
In merged eswitch configuration, peer miss rule is setup for all
vports. If metadata is enabled, peer miss rule with metadata matching
will be configured instead of source port matching; however, some
vports that have not yet been enabled don't have default_metadata
setup and their default_metadata will be zero.
Hence, setup/cleanup default metadata for all vports when eswitch moves
in/out of offloads mode.
Fixes: 133dcfc577
("net/mlx5: E-Switch, Alloc and free unique metadata for match")
Signed-off-by: Vu Pham <vuhuong@mellanox.com>
Reviewed-by: Bodong Wang <bodong@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
406493a52f
commit
fc99c3d637
@ -1923,19 +1923,49 @@ static void esw_offloads_vport_metadata_cleanup(struct mlx5_eswitch *esw,
|
||||
mlx5_esw_match_metadata_free(esw, vport->default_metadata);
|
||||
}
|
||||
|
||||
static void esw_offloads_metadata_uninit(struct mlx5_eswitch *esw)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
int i;
|
||||
|
||||
if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
|
||||
return;
|
||||
|
||||
mlx5_esw_for_all_vports_reverse(esw, i, vport)
|
||||
esw_offloads_vport_metadata_cleanup(esw, vport);
|
||||
}
|
||||
|
||||
static int esw_offloads_metadata_init(struct mlx5_eswitch *esw)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
|
||||
return 0;
|
||||
|
||||
mlx5_esw_for_all_vports(esw, i, vport) {
|
||||
err = esw_offloads_vport_metadata_setup(esw, vport);
|
||||
if (err)
|
||||
goto metadata_err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
metadata_err:
|
||||
esw_offloads_metadata_uninit(esw);
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
|
||||
struct mlx5_vport *vport)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = esw_offloads_vport_metadata_setup(esw, vport);
|
||||
if (err)
|
||||
goto metadata_err;
|
||||
|
||||
err = esw_acl_ingress_ofld_setup(esw, vport);
|
||||
if (err)
|
||||
goto ingress_err;
|
||||
return err;
|
||||
|
||||
if (mlx5_eswitch_is_vf_vport(esw, vport->vport)) {
|
||||
err = esw_acl_egress_ofld_setup(esw, vport);
|
||||
@ -1947,9 +1977,6 @@ esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
|
||||
|
||||
egress_err:
|
||||
esw_acl_ingress_ofld_cleanup(esw, vport);
|
||||
ingress_err:
|
||||
esw_offloads_vport_metadata_cleanup(esw, vport);
|
||||
metadata_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1959,7 +1986,6 @@ esw_vport_destroy_offloads_acl_tables(struct mlx5_eswitch *esw,
|
||||
{
|
||||
esw_acl_egress_ofld_cleanup(vport);
|
||||
esw_acl_ingress_ofld_cleanup(esw, vport);
|
||||
esw_offloads_vport_metadata_cleanup(esw, vport);
|
||||
}
|
||||
|
||||
static int esw_create_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
|
||||
@ -2138,6 +2164,10 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
|
||||
if (esw_use_vport_metadata(esw))
|
||||
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
|
||||
err = esw_offloads_metadata_init(esw);
|
||||
if (err)
|
||||
goto err_metadata;
|
||||
|
||||
err = esw_set_passing_vport_metadata(esw, true);
|
||||
if (err)
|
||||
goto err_vport_metadata;
|
||||
@ -2170,6 +2200,8 @@ err_uplink:
|
||||
err_steering_init:
|
||||
esw_set_passing_vport_metadata(esw, false);
|
||||
err_vport_metadata:
|
||||
esw_offloads_metadata_uninit(esw);
|
||||
err_metadata:
|
||||
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
mlx5_rdma_disable_roce(esw->dev);
|
||||
mutex_destroy(&esw->offloads.termtbl_mutex);
|
||||
@ -2204,6 +2236,7 @@ void esw_offloads_disable(struct mlx5_eswitch *esw)
|
||||
esw_offloads_unload_rep(esw, MLX5_VPORT_UPLINK);
|
||||
esw_set_passing_vport_metadata(esw, false);
|
||||
esw_offloads_steering_cleanup(esw);
|
||||
esw_offloads_metadata_uninit(esw);
|
||||
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
mlx5_rdma_disable_roce(esw->dev);
|
||||
mutex_destroy(&esw->offloads.termtbl_mutex);
|
||||
|
Loading…
Reference in New Issue
Block a user