net/mlx5: DR, Fix missing flow_source when creating multi-destination FW table
authorMaor Dickman <maord@nvidia.com>
Mon, 21 Mar 2022 08:07:44 +0000 (10:07 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 May 2022 07:57:32 +0000 (09:57 +0200)
[ Upstream commit 2c5fc6cd269ad3476da99dad02521d2af4a8e906 ]

In order to support multiple destination FTEs with SW steering
FW table is created with single FTE with multiple actions and
SW steering rule forward to it. When creating this table, flow
source isn't set according to the original FTE.

Fix this by passing the original FTE flow source to the created
FW table.

Fixes: 34583beea4b7 ("net/mlx5: DR, Create multi-destination table for SW-steering use")
Signed-off-by: Maor Dickman <maord@nvidia.com>
Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h

index a5b9f65db23c647d78b2e1e2db68b849f849f1ad..897c7f8521238e6f0e3c9dc2e965d57ab4ca5fda 100644 (file)
@@ -846,7 +846,8 @@ struct mlx5dr_action *
 mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
                                   struct mlx5dr_action_dest *dests,
                                   u32 num_of_dests,
-                                  bool ignore_flow_level)
+                                  bool ignore_flow_level,
+                                  u32 flow_source)
 {
        struct mlx5dr_cmd_flow_destination_hw_info *hw_dests;
        struct mlx5dr_action **ref_actions;
@@ -914,7 +915,8 @@ mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
                                      reformat_req,
                                      &action->dest_tbl->fw_tbl.id,
                                      &action->dest_tbl->fw_tbl.group_id,
-                                     ignore_flow_level);
+                                     ignore_flow_level,
+                                     flow_source);
        if (ret)
                goto free_action;
 
index 0d6f86eb248b9a76cceb94a919420b2ebe180881..c74083de1801bde32d1132758ef44004bc4aab2d 100644 (file)
@@ -104,7 +104,8 @@ int mlx5dr_fw_create_md_tbl(struct mlx5dr_domain *dmn,
                            bool reformat_req,
                            u32 *tbl_id,
                            u32 *group_id,
-                           bool ignore_flow_level)
+                           bool ignore_flow_level,
+                           u32 flow_source)
 {
        struct mlx5dr_cmd_create_flow_table_attr ft_attr = {};
        struct mlx5dr_cmd_fte_info fte_info = {};
@@ -139,6 +140,7 @@ int mlx5dr_fw_create_md_tbl(struct mlx5dr_domain *dmn,
        fte_info.val = val;
        fte_info.dest_arr = dest;
        fte_info.ignore_flow_level = ignore_flow_level;
+       fte_info.flow_context.flow_source = flow_source;
 
        ret = mlx5dr_cmd_set_fte(dmn->mdev, 0, 0, &ft_info, *group_id, &fte_info);
        if (ret) {
index 3d4e035698dd32d053cdd9d11d4154f1aa0dba06..bc206836af6ac75d6f13a732805c968d67f29261 100644 (file)
@@ -1394,7 +1394,8 @@ int mlx5dr_fw_create_md_tbl(struct mlx5dr_domain *dmn,
                            bool reformat_req,
                            u32 *tbl_id,
                            u32 *group_id,
-                           bool ignore_flow_level);
+                           bool ignore_flow_level,
+                           u32 flow_source);
 void mlx5dr_fw_destroy_md_tbl(struct mlx5dr_domain *dmn, u32 tbl_id,
                              u32 group_id);
 #endif  /* _DR_TYPES_H_ */
index 7e58f4e594b7480821c7492f07e6ed8ac32d2061..ae4597118f8b6f74ff8b89bbf9d9b5266defbc7c 100644 (file)
@@ -492,11 +492,13 @@ static int mlx5_cmd_dr_create_fte(struct mlx5_flow_root_namespace *ns,
        } else if (num_term_actions > 1) {
                bool ignore_flow_level =
                        !!(fte->action.flags & FLOW_ACT_IGNORE_FLOW_LEVEL);
+               u32 flow_source = fte->flow_context.flow_source;
 
                tmp_action = mlx5dr_action_create_mult_dest_tbl(domain,
                                                                term_actions,
                                                                num_term_actions,
-                                                               ignore_flow_level);
+                                                               ignore_flow_level,
+                                                               flow_source);
                if (!tmp_action) {
                        err = -EOPNOTSUPP;
                        goto free_actions;
index 5ef19954347942a824a432e3182fb359c37345c9..7806e5c05b6772108e2dafe196ab9b8ee7838e18 100644 (file)
@@ -96,7 +96,8 @@ struct mlx5dr_action *
 mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
                                   struct mlx5dr_action_dest *dests,
                                   u32 num_of_dests,
-                                  bool ignore_flow_level);
+                                  bool ignore_flow_level,
+                                  u32 flow_source);
 
 struct mlx5dr_action *mlx5dr_action_create_drop(void);