<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks, patch queued as 23.11.4 release candidate.</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Dariusz Sosnowski <dsosnowski@nvidia.com><br>
<b>Sent:</b> Wednesday, April 9, 2025 6:37 PM<br>
<b>To:</b> stable@dpdk.org <stable@dpdk.org>; Xueming Li <xuemingl@nvidia.com><br>
<b>Cc:</b> Alex Vesker <valex@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Ori Kam <orika@nvidia.com>; Suanming Mou <suanmingm@nvidia.com>; Matan Azrad <matan@nvidia.com>; Erez Shitrit <erezsh@nvidia.com><br>
<b>Subject:</b> [PATCH 23.11] net/mlx5/hws: fix DV FT type convert</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">From: Alex Vesker <valex@nvidia.com><br>
<br>
[ upstream commit 16ac8f980042da5c88860f1931789f3060caa38c ]<br>
<br>
When creating a root modify/reformat action it is created<br>
for a single specific table type, current code ignored this and<br>
used the first ft_type found in if, else.<br>
Also added missing translation for non-root FDB action root dest.<br>
<br>
Fixes: f8c8a6d8440d ("net/mlx5/hws: add action object")<br>
Cc: stable@dpdk.org<br>
<br>
Signed-off-by: Alex Vesker <valex@nvidia.com><br>
Acked-by: Dariusz Sosnowski <dsosnowski@nvidia.com><br>
---<br>
 drivers/net/mlx5/hws/mlx5dr_action.c | 65 +++++++++++++++++++++++-----<br>
 1 file changed, 55 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c b/drivers/net/mlx5/hws/mlx5dr_action.c<br>
index a068f100c5..6ffb79c254 100644<br>
--- a/drivers/net/mlx5/hws/mlx5dr_action.c<br>
+++ b/drivers/net/mlx5/hws/mlx5dr_action.c<br>
@@ -1247,19 +1247,64 @@ mlx5dr_action_conv_reformat_to_verbs(uint32_t action_type,<br>
 }<br>
 <br>
 static int<br>
-mlx5dr_action_conv_flags_to_ft_type(uint32_t flags, enum mlx5dv_flow_table_type *ft_type)<br>
+mlx5dr_action_conv_root_flags_to_dv_ft(uint32_t flags,<br>
+                                      enum mlx5dv_flow_table_type *ft_type)<br>
 {<br>
-       if (flags & (MLX5DR_ACTION_FLAG_ROOT_RX | MLX5DR_ACTION_FLAG_HWS_RX)) {<br>
+       uint8_t is_rx, is_tx, is_fdb;<br>
+<br>
+       is_rx = !!(flags & MLX5DR_ACTION_FLAG_ROOT_RX);<br>
+       is_tx = !!(flags & MLX5DR_ACTION_FLAG_ROOT_TX);<br>
+       is_fdb = !!(flags & MLX5DR_ACTION_FLAG_ROOT_FDB);<br>
+<br>
+       if (is_rx + is_tx + is_fdb != 1) {<br>
+               DR_LOG(ERR, "Root action flags must be converted to a single ft type");<br>
+               rte_errno = ENOTSUP;<br>
+               return -rte_errno;<br>
+       }<br>
+<br>
+       if (is_rx) {<br>
+               *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_RX;<br>
+       } else if (is_tx) {<br>
+               *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_TX;<br>
+#ifdef HAVE_MLX5DV_FLOW_MATCHER_FT_TYPE<br>
+       } else if (is_fdb) {<br>
+               *ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB;<br>
+#endif<br>
+       } else {<br>
+               rte_errno = ENOTSUP;<br>
+               return -rte_errno;<br>
+       }<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+static int<br>
+mlx5dr_action_conv_hws_flags_to_dv_ft(uint32_t flags,<br>
+                                    enum mlx5dv_flow_table_type *ft_type)<br>
+{<br>
+       uint8_t is_rx, is_tx, is_fdb;<br>
+<br>
+       is_rx = !!(flags & MLX5DR_ACTION_FLAG_HWS_RX);<br>
+       is_tx = !!(flags & MLX5DR_ACTION_FLAG_HWS_TX);<br>
+       is_fdb = !!(flags & MLX5DR_ACTION_FLAG_HWS_FDB);<br>
+<br>
+       if (is_rx + is_tx + is_fdb != 1) {<br>
+               DR_LOG(ERR, "Action flags must be converted to a single ft type");<br>
+               rte_errno = ENOTSUP;<br>
+               return -rte_errno;<br>
+       }<br>
+<br>
+       if (is_rx) {<br>
                 *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_RX;<br>
-       } else if (flags & (MLX5DR_ACTION_FLAG_ROOT_TX | MLX5DR_ACTION_FLAG_HWS_TX)) {<br>
+       } else if (is_tx) {<br>
                 *ft_type = MLX5DV_FLOW_TABLE_TYPE_NIC_TX;<br>
 #ifdef HAVE_MLX5DV_FLOW_MATCHER_FT_TYPE<br>
-       } else if (flags & (MLX5DR_ACTION_FLAG_ROOT_FDB | MLX5DR_ACTION_FLAG_HWS_FDB)) {<br>
+       } else if (is_fdb) {<br>
                 *ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB;<br>
 #endif<br>
         } else {<br>
                 rte_errno = ENOTSUP;<br>
-               return 1;<br>
+               return -rte_errno;<br>
         }<br>
 <br>
         return 0;<br>
@@ -1276,9 +1321,9 @@ mlx5dr_action_create_reformat_root(struct mlx5dr_action *action,<br>
         int ret;<br>
 <br>
         /* Convert action to FT type and verbs reformat type */<br>
-       ret = mlx5dr_action_conv_flags_to_ft_type(action->flags, &ft_type);<br>
+       ret = mlx5dr_action_conv_root_flags_to_dv_ft(action->flags, &ft_type);<br>
         if (ret)<br>
-               return rte_errno;<br>
+               return ret;<br>
 <br>
         ret = mlx5dr_action_conv_reformat_to_verbs(action->type, &verb_reformat_type);<br>
         if (ret)<br>
@@ -1616,9 +1661,9 @@ mlx5dr_action_create_modify_header_root(struct mlx5dr_action *action,<br>
         struct ibv_context *local_ibv_ctx;<br>
         int ret;<br>
 <br>
-       ret = mlx5dr_action_conv_flags_to_ft_type(action->flags, &ft_type);<br>
+       ret = mlx5dr_action_conv_root_flags_to_dv_ft(action->flags, &ft_type);<br>
         if (ret)<br>
-               return rte_errno;<br>
+               return ret;<br>
 <br>
         local_ibv_ctx = mlx5dr_context_get_local_ibv(action->ctx);<br>
 <br>
@@ -2008,7 +2053,7 @@ mlx5dr_action_create_dest_root(struct mlx5dr_context *ctx,<br>
                 return NULL;<br>
         }<br>
 <br>
-       if (mlx5dr_action_conv_flags_to_ft_type(flags, &attr.ft_type))<br>
+       if (mlx5dr_action_conv_hws_flags_to_dv_ft(flags, &attr.ft_type))<br>
                 return NULL;<br>
 <br>
         attr.priority = priority;<br>
-- <br>
2.39.5<br>
<br>
</div>
</span></font></div>
</body>
</html>