Skip to content

Commit 29bcb6e

Browse files
roidayanSaeed Mahameed
authored andcommitted
net/mlx5e: E-Switch, Use metadata for vport matching in send-to-vport rules
Like other rules use metadata matching if supported instead of source_port. Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Maor Dickman <maord@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
1 parent 99db566 commit 29bcb6e

File tree

1 file changed

+43
-19
lines changed

1 file changed

+43
-19
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,7 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
838838
struct mlx5_flow_handle *flow_rule;
839839
struct mlx5_flow_spec *spec;
840840
void *misc;
841+
u16 vport;
841842

842843
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
843844
if (!spec) {
@@ -847,20 +848,43 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
847848

848849
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
849850
MLX5_SET(fte_match_set_misc, misc, source_sqn, sqn);
850-
/* source vport is the esw manager */
851-
MLX5_SET(fte_match_set_misc, misc, source_port, from_esw->manager_vport);
852-
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
853-
MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
854-
MLX5_CAP_GEN(from_esw->dev, vhca_id));
855851

856852
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
857853
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_sqn);
858-
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
859-
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
860-
MLX5_SET_TO_ONES(fte_match_set_misc, misc,
861-
source_eswitch_owner_vhca_id);
862854

863855
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
856+
857+
/* source vport is the esw manager */
858+
vport = from_esw->manager_vport;
859+
860+
if (mlx5_eswitch_vport_match_metadata_enabled(on_esw)) {
861+
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters_2);
862+
MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
863+
mlx5_eswitch_get_vport_metadata_for_match(from_esw, vport));
864+
865+
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters_2);
866+
MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
867+
mlx5_eswitch_get_vport_metadata_mask());
868+
869+
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2;
870+
} else {
871+
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
872+
MLX5_SET(fte_match_set_misc, misc, source_port, vport);
873+
874+
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
875+
MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
876+
MLX5_CAP_GEN(from_esw->dev, vhca_id));
877+
878+
misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
879+
MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
880+
881+
if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
882+
MLX5_SET_TO_ONES(fte_match_set_misc, misc,
883+
source_eswitch_owner_vhca_id);
884+
885+
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
886+
}
887+
864888
dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
865889
dest.vport.num = rep->vport;
866890
dest.vport.vhca_id = MLX5_CAP_GEN(rep->esw->dev, vhca_id);
@@ -1270,7 +1294,8 @@ esw_add_restore_rule(struct mlx5_eswitch *esw, u32 tag)
12701294
#define MAX_SQ_NVPORTS 32
12711295

12721296
static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
1273-
u32 *flow_group_in)
1297+
u32 *flow_group_in,
1298+
int match_params)
12741299
{
12751300
void *match_criteria = MLX5_ADDR_OF(create_flow_group_in,
12761301
flow_group_in,
@@ -1279,15 +1304,15 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
12791304
if (mlx5_eswitch_vport_match_metadata_enabled(esw)) {
12801305
MLX5_SET(create_flow_group_in, flow_group_in,
12811306
match_criteria_enable,
1282-
MLX5_MATCH_MISC_PARAMETERS_2);
1307+
MLX5_MATCH_MISC_PARAMETERS_2 | match_params);
12831308

12841309
MLX5_SET(fte_match_param, match_criteria,
12851310
misc_parameters_2.metadata_reg_c_0,
12861311
mlx5_eswitch_get_vport_metadata_mask());
12871312
} else {
12881313
MLX5_SET(create_flow_group_in, flow_group_in,
12891314
match_criteria_enable,
1290-
MLX5_MATCH_MISC_PARAMETERS);
1315+
MLX5_MATCH_MISC_PARAMETERS | match_params);
12911316

12921317
MLX5_SET_TO_ONES(fte_match_param, match_criteria,
12931318
misc_parameters.source_port);
@@ -1463,14 +1488,13 @@ esw_create_send_to_vport_group(struct mlx5_eswitch *esw,
14631488

14641489
memset(flow_group_in, 0, inlen);
14651490

1466-
MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable,
1467-
MLX5_MATCH_MISC_PARAMETERS);
1491+
esw_set_flow_group_source_port(esw, flow_group_in, MLX5_MATCH_MISC_PARAMETERS);
14681492

14691493
match_criteria = MLX5_ADDR_OF(create_flow_group_in, flow_group_in, match_criteria);
1470-
14711494
MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_sqn);
1472-
MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_port);
1473-
if (MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
1495+
1496+
if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
1497+
MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
14741498
MLX5_SET_TO_ONES(fte_match_param, match_criteria,
14751499
misc_parameters.source_eswitch_owner_vhca_id);
14761500
MLX5_SET(create_flow_group_in, flow_group_in,
@@ -1558,7 +1582,7 @@ esw_create_peer_esw_miss_group(struct mlx5_eswitch *esw,
15581582

15591583
memset(flow_group_in, 0, inlen);
15601584

1561-
esw_set_flow_group_source_port(esw, flow_group_in);
1585+
esw_set_flow_group_source_port(esw, flow_group_in, 0);
15621586

15631587
if (!mlx5_eswitch_vport_match_metadata_enabled(esw)) {
15641588
match_criteria = MLX5_ADDR_OF(create_flow_group_in,
@@ -1845,7 +1869,7 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
18451869
return -ENOMEM;
18461870

18471871
/* create vport rx group */
1848-
esw_set_flow_group_source_port(esw, flow_group_in);
1872+
esw_set_flow_group_source_port(esw, flow_group_in, 0);
18491873

18501874
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
18511875
MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, nvports - 1);

0 commit comments

Comments
 (0)