Thanks, patch queued as 23.11.4 release candidate. ________________________________ From: Dariusz Sosnowski Sent: Wednesday, April 9, 2025 6:37 PM To: stable@dpdk.org ; Xueming Li Cc: Alex Vesker ; Slava Ovsiienko ; Ori Kam ; Suanming Mou ; Matan Azrad ; Erez Shitrit Subject: [PATCH 23.11] net/mlx5/hws: fix DV FT type convert From: Alex Vesker [ upstream commit 16ac8f980042da5c88860f1931789f3060caa38c ] When creating a root modify/reformat action it is created for a single specific table type, current code ignored this and used the first ft_type found in if, else. Also added missing translation for non-root FDB action root dest. Fixes: f8c8a6d8440d ("net/mlx5/hws: add action object") Cc: stable@dpdk.org Signed-off-by: Alex Vesker Acked-by: Dariusz Sosnowski --- drivers/net/mlx5/hws/mlx5dr_action.c | 65 +++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c b/drivers/net/mlx5/hws/mlx5dr_action.c index a068f100c5..6ffb79c254 100644 --- a/drivers/net/mlx5/hws/mlx5dr_action.c +++ b/drivers/net/mlx5/hws/mlx5dr_action.c @@ -1247,19 +1247,64 @@ mlx5dr_action_conv_reformat_to_verbs(uint32_t action_type, } static int -mlx5dr_action_conv_flags_to_ft_type(uint32_t flags, enum mlx5dv_flow_table_type *ft_type) +mlx5dr_action_conv_root_flags_to_dv_ft(uint32_t flags, + enum mlx5dv_flow_table_type *ft_type) { - if (flags & (MLX5DR_ACTION_FLAG_ROOT_RX | MLX5DR_ACTION_FLAG_HWS_RX)) { + uint8_t is_rx, is_tx, is_fdb; + + is_rx = !!(flags & MLX5DR_ACTION_FLAG_ROOT_RX); + is_tx = !!(flags & MLX5DR_ACTION_FLAG_ROOT_TX); + is_fdb = !!(flags & MLX5DR_ACTION_FLAG_ROOT_FDB); + + if (is_rx + is_tx + is_fdb != 1) { + DR_LOG(ERR, "Root action flags must be converted to a single ft type"); + rte_errno = ENOTSUP; + return -rte_errno; + } + + if (is_rx) { + *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_RX; + } else if (is_tx) { + *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_TX; +#ifdef HAVE_MLX5DV_FLOW_MATCHER_FT_TYPE + } else if (is_fdb) { + *ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB; +#endif + } else { + rte_errno = ENOTSUP; + return -rte_errno; + } + + return 0; +} + +static int +mlx5dr_action_conv_hws_flags_to_dv_ft(uint32_t flags, + enum mlx5dv_flow_table_type *ft_type) +{ + uint8_t is_rx, is_tx, is_fdb; + + is_rx = !!(flags & MLX5DR_ACTION_FLAG_HWS_RX); + is_tx = !!(flags & MLX5DR_ACTION_FLAG_HWS_TX); + is_fdb = !!(flags & MLX5DR_ACTION_FLAG_HWS_FDB); + + if (is_rx + is_tx + is_fdb != 1) { + DR_LOG(ERR, "Action flags must be converted to a single ft type"); + rte_errno = ENOTSUP; + return -rte_errno; + } + + if (is_rx) { *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_RX; - } else if (flags & (MLX5DR_ACTION_FLAG_ROOT_TX | MLX5DR_ACTION_FLAG_HWS_TX)) { + } else if (is_tx) { *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_TX; #ifdef HAVE_MLX5DV_FLOW_MATCHER_FT_TYPE - } else if (flags & (MLX5DR_ACTION_FLAG_ROOT_FDB | MLX5DR_ACTION_FLAG_HWS_FDB)) { + } else if (is_fdb) { *ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB; #endif } else { rte_errno = ENOTSUP; - return 1; + return -rte_errno; } return 0; @@ -1276,9 +1321,9 @@ mlx5dr_action_create_reformat_root(struct mlx5dr_action *action, int ret; /* Convert action to FT type and verbs reformat type */ - ret = mlx5dr_action_conv_flags_to_ft_type(action->flags, &ft_type); + ret = mlx5dr_action_conv_root_flags_to_dv_ft(action->flags, &ft_type); if (ret) - return rte_errno; + return ret; ret = mlx5dr_action_conv_reformat_to_verbs(action->type, &verb_reformat_type); if (ret) @@ -1616,9 +1661,9 @@ mlx5dr_action_create_modify_header_root(struct mlx5dr_action *action, struct ibv_context *local_ibv_ctx; int ret; - ret = mlx5dr_action_conv_flags_to_ft_type(action->flags, &ft_type); + ret = mlx5dr_action_conv_root_flags_to_dv_ft(action->flags, &ft_type); if (ret) - return rte_errno; + return ret; local_ibv_ctx = mlx5dr_context_get_local_ibv(action->ctx); @@ -2008,7 +2053,7 @@ mlx5dr_action_create_dest_root(struct mlx5dr_context *ctx, return NULL; } - if (mlx5dr_action_conv_flags_to_ft_type(flags, &attr.ft_type)) + if (mlx5dr_action_conv_hws_flags_to_dv_ft(flags, &attr.ft_type)) return NULL; attr.priority = priority; -- 2.39.5