| From 95460d412afc0e32069fa06cad1287134ff5a51b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Mar 2022 10:07:44 +0200 |
| Subject: net/mlx5: DR, Fix missing flow_source when creating multi-destination |
| FW table |
| |
| From: Maor Dickman <maord@nvidia.com> |
| |
| [ 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> |
| --- |
| .../net/ethernet/mellanox/mlx5/core/steering/dr_action.c | 6 ++++-- |
| drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c | 4 +++- |
| drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h | 3 ++- |
| drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c | 4 +++- |
| drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h | 3 ++- |
| 5 files changed, 14 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c |
| index a5b9f65db23c..897c7f852123 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c |
| @@ -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; |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c |
| index 0d6f86eb248b..c74083de1801 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_fw.c |
| @@ -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) { |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h |
| index 3d4e035698dd..bc206836af6a 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h |
| @@ -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_ */ |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c |
| index 7e58f4e594b7..ae4597118f8b 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c |
| @@ -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; |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h |
| index 5ef199543479..7806e5c05b67 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h |
| @@ -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); |
| |
| -- |
| 2.35.1 |
| |