net/mlx5e: E-Switch, Use metadata for vport matching in send-to-vport rules
authorRoi Dayan <roid@nvidia.com>
Sun, 2 Apr 2023 10:59:08 +0000 (13:59 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 19 May 2023 17:50:30 +0000 (10:50 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index ecd12a0..66a522d 100644 (file)
@@ -838,6 +838,7 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
        struct mlx5_flow_handle *flow_rule;
        struct mlx5_flow_spec *spec;
        void *misc;
+       u16 vport;
 
        spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
        if (!spec) {
@@ -847,20 +848,43 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
        MLX5_SET(fte_match_set_misc, misc, source_sqn, sqn);
-       /* source vport is the esw manager */
-       MLX5_SET(fte_match_set_misc, misc, source_port, from_esw->manager_vport);
-       if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
-               MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
-                        MLX5_CAP_GEN(from_esw->dev, vhca_id));
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
        MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_sqn);
-       MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
-       if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
-               MLX5_SET_TO_ONES(fte_match_set_misc, misc,
-                                source_eswitch_owner_vhca_id);
 
        spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
+
+       /* source vport is the esw manager */
+       vport = from_esw->manager_vport;
+
+       if (mlx5_eswitch_vport_match_metadata_enabled(on_esw)) {
+               misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters_2);
+               MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
+                        mlx5_eswitch_get_vport_metadata_for_match(from_esw, vport));
+
+               misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters_2);
+               MLX5_SET(fte_match_set_misc2, misc, metadata_reg_c_0,
+                        mlx5_eswitch_get_vport_metadata_mask());
+
+               spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2;
+       } else {
+               misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
+               MLX5_SET(fte_match_set_misc, misc, source_port, vport);
+
+               if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
+                       MLX5_SET(fte_match_set_misc, misc, source_eswitch_owner_vhca_id,
+                                MLX5_CAP_GEN(from_esw->dev, vhca_id));
+
+               misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
+               MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
+
+               if (MLX5_CAP_ESW(on_esw->dev, merged_eswitch))
+                       MLX5_SET_TO_ONES(fte_match_set_misc, misc,
+                                        source_eswitch_owner_vhca_id);
+
+               spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
+       }
+
        dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
        dest.vport.num = rep->vport;
        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)
 #define MAX_SQ_NVPORTS 32
 
 static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
-                                          u32 *flow_group_in)
+                                          u32 *flow_group_in,
+                                          int match_params)
 {
        void *match_criteria = MLX5_ADDR_OF(create_flow_group_in,
                                            flow_group_in,
@@ -1279,7 +1304,7 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
        if (mlx5_eswitch_vport_match_metadata_enabled(esw)) {
                MLX5_SET(create_flow_group_in, flow_group_in,
                         match_criteria_enable,
-                        MLX5_MATCH_MISC_PARAMETERS_2);
+                        MLX5_MATCH_MISC_PARAMETERS_2 | match_params);
 
                MLX5_SET(fte_match_param, match_criteria,
                         misc_parameters_2.metadata_reg_c_0,
@@ -1287,7 +1312,7 @@ static void esw_set_flow_group_source_port(struct mlx5_eswitch *esw,
        } else {
                MLX5_SET(create_flow_group_in, flow_group_in,
                         match_criteria_enable,
-                        MLX5_MATCH_MISC_PARAMETERS);
+                        MLX5_MATCH_MISC_PARAMETERS | match_params);
 
                MLX5_SET_TO_ONES(fte_match_param, match_criteria,
                                 misc_parameters.source_port);
@@ -1463,14 +1488,13 @@ esw_create_send_to_vport_group(struct mlx5_eswitch *esw,
 
        memset(flow_group_in, 0, inlen);
 
-       MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable,
-                MLX5_MATCH_MISC_PARAMETERS);
+       esw_set_flow_group_source_port(esw, flow_group_in, MLX5_MATCH_MISC_PARAMETERS);
 
        match_criteria = MLX5_ADDR_OF(create_flow_group_in, flow_group_in, match_criteria);
-
        MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_sqn);
-       MLX5_SET_TO_ONES(fte_match_param, match_criteria, misc_parameters.source_port);
-       if (MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
+
+       if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
+           MLX5_CAP_ESW(esw->dev, merged_eswitch)) {
                MLX5_SET_TO_ONES(fte_match_param, match_criteria,
                                 misc_parameters.source_eswitch_owner_vhca_id);
                MLX5_SET(create_flow_group_in, flow_group_in,
@@ -1558,7 +1582,7 @@ esw_create_peer_esw_miss_group(struct mlx5_eswitch *esw,
 
        memset(flow_group_in, 0, inlen);
 
-       esw_set_flow_group_source_port(esw, flow_group_in);
+       esw_set_flow_group_source_port(esw, flow_group_in, 0);
 
        if (!mlx5_eswitch_vport_match_metadata_enabled(esw)) {
                match_criteria = MLX5_ADDR_OF(create_flow_group_in,
@@ -1845,7 +1869,7 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
                return -ENOMEM;
 
        /* create vport rx group */
-       esw_set_flow_group_source_port(esw, flow_group_in);
+       esw_set_flow_group_source_port(esw, flow_group_in, 0);
 
        MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
        MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, nvports - 1);