<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<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 very much, patch enlisted to 23.11.4 release queue.</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> Junfeng Guo <junfengg@nvidia.com><br>
<b>Sent:</b> Wednesday, April 9, 2025 2:35 PM<br>
<b>To:</b> stable@dpdk.org <stable@dpdk.org><br>
<b>Cc:</b> Dariusz Sosnowski <dsosnowski@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Bing Zhao <bingz@nvidia.com>; Ori Kam <orika@nvidia.com>; Suanming Mou <suanmingm@nvidia.com>; Matan Azrad <matan@nvidia.com>; Xueming Li <xuemingl@nvidia.com><br>
<b>Subject:</b> [PATCH 23.11] net/mlx5: fix actions translation error overwrite</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">[ upstream commit 494da70e289c6a603185c890111f95568eb1fd63 ]<br>
<br>
Function __flow_hw_translate_actions_template contains several<br>
encapsulated functions that already have internal error handling<br>
process via rte_flow_error_set for each case.<br>
<br>
Thus the one (rte_flow_error_set) within the goto statement `err`<br>
at the end of __flow_hw_translate_actions_template function may be<br>
redundant for those failed cases. As a result, the error messages<br>
would all be overwritten as "fail to create rte table", making it<br>
displayed at quite large granularity.<br>
<br>
To prevent above error messages overwrite, this patch add a local<br>
variable `struct rte_flow_error sub_error` to the function and pass<br>
this `sub_error` instead of `error` to each sub-function. Under error<br>
handling process (`err` label), if `sub_error` was updated, copy its<br>
contents to `error` and return. If it was not updated, return default<br>
error message (`fail to create rte table`).<br>
<br>
Also refactor the logic for SEND_TO_KERNEL, COUNT and AGE actions in<br>
above function to align the error handling process.<br>
<br>
Fixes: f13fab23922b ("net/mlx5: add flow jump action")<br>
Cc: suanmingm@nvidia.com<br>
Cc: stable@dpdk.org<br>
<br>
Signed-off-by: Junfeng Guo <junfengg@nvidia.com><br>
---<br>
.mailmap | 2 +-<br>
drivers/net/mlx5/mlx5_flow_hw.c | 55 ++++++++++++++++++++-------------<br>
2 files changed, 35 insertions(+), 22 deletions(-)<br>
<br>
diff --git a/.mailmap b/.mailmap<br>
index 7b2798a31a..20fa4a22ba 100644<br>
--- a/.mailmap<br>
+++ b/.mailmap<br>
@@ -721,7 +721,7 @@ Julien Hascoet <ju.hascoet@gmail.com><br>
Julien Massonneau <julien.massonneau@6wind.com><br>
Julien Meunier <julien.meunier@nokia.com> <julien.meunier@6wind.com><br>
Július Milan <jmilan.dev@gmail.com><br>
-Junfeng Guo <junfeng.guo@intel.com><br>
+Junfeng Guo <junfengg@nvidia.com> <junfeng.guo@intel.com><br>
Junjie Chen <junjie.j.chen@intel.com><br>
Junjie Wan <wanjunjie@bytedance.com><br>
Jun Qiu <jun.qiu@jaguarmicro.com><br>
diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c<br>
index 54f264a03c..c53d407746 100644<br>
--- a/drivers/net/mlx5/mlx5_flow_hw.c<br>
+++ b/drivers/net/mlx5/mlx5_flow_hw.c<br>
@@ -2138,6 +2138,11 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
uint8_t *push_data = NULL, *push_data_m = NULL;<br>
size_t data_size = 0, push_size = 0;<br>
struct mlx5_hw_modify_header_action mhdr = { 0 };<br>
+ struct rte_flow_error sub_error = {<br>
+ .type = RTE_FLOW_ERROR_TYPE_NONE,<br>
+ .cause = NULL,<br>
+ .message = NULL,<br>
+ };<br>
bool actions_end = false;<br>
uint32_t type;<br>
bool reformat_used = false;<br>
@@ -2246,7 +2251,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
((const struct rte_flow_action_jump *)<br>
actions->conf)->group;<br>
acts->jump = flow_hw_jump_action_register<br>
- (dev, cfg, jump_group, error);<br>
+ (dev, cfg, jump_group, &sub_error);<br>
if (!acts->jump)<br>
goto err;<br>
acts->rule_acts[dr_pos].action = (!!attr->group) ?<br>
@@ -2379,13 +2384,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
break;<br>
case RTE_FLOW_ACTION_TYPE_SEND_TO_KERNEL:<br>
flow_hw_translate_group(dev, cfg, attr->group,<br>
- &target_grp, error);<br>
+ &target_grp, &sub_error);<br>
if (target_grp == 0) {<br>
__flow_hw_action_template_destroy(dev, acts);<br>
- return rte_flow_error_set(error, ENOTSUP,<br>
- RTE_FLOW_ERROR_TYPE_ACTION,<br>
- NULL,<br>
- "Send to kernel action on root table is not supported in HW steering mode");<br>
+ rte_flow_error_set(&sub_error, ENOTSUP,<br>
+ RTE_FLOW_ERROR_TYPE_ACTION,<br>
+ NULL,<br>
+ "Send to kernel action on root table is not supported in HW steering mode");<br>
+ goto err;<br>
}<br>
table_type = attr->ingress ? MLX5DR_TABLE_TYPE_NIC_RX :<br>
((attr->egress) ? MLX5DR_TABLE_TYPE_NIC_TX :<br>
@@ -2395,14 +2401,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
case RTE_FLOW_ACTION_TYPE_MODIFY_FIELD:<br>
err = flow_hw_modify_field_compile(dev, attr, actions,<br>
masks, acts, &mhdr,<br>
- src_pos, error);<br>
+ src_pos, &sub_error);<br>
if (err)<br>
goto err;<br>
break;<br>
case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT:<br>
if (flow_hw_represented_port_compile<br>
(dev, attr, actions,<br>
- masks, acts, src_pos, dr_pos, error))<br>
+ masks, acts, src_pos, dr_pos, &sub_error))<br>
goto err;<br>
break;<br>
case RTE_FLOW_ACTION_TYPE_METER:<br>
@@ -2416,7 +2422,8 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
((const struct rte_flow_action_meter *)<br>
masks->conf)->mtr_id) {<br>
err = flow_hw_meter_compile(dev, cfg,<br>
- dr_pos, jump_pos, actions, acts, error);<br>
+ dr_pos, jump_pos, actions, acts,<br>
+ &sub_error);<br>
if (err)<br>
goto err;<br>
} else if (__flow_hw_act_data_general_append(priv, acts,<br>
@@ -2427,13 +2434,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
break;<br>
case RTE_FLOW_ACTION_TYPE_AGE:<br>
flow_hw_translate_group(dev, cfg, attr->group,<br>
- &target_grp, error);<br>
+ &target_grp, &sub_error);<br>
if (target_grp == 0) {<br>
__flow_hw_action_template_destroy(dev, acts);<br>
- return rte_flow_error_set(error, ENOTSUP,<br>
- RTE_FLOW_ERROR_TYPE_ACTION,<br>
- NULL,<br>
- "Age action on root table is not supported in HW steering mode");<br>
+ rte_flow_error_set(&sub_error, ENOTSUP,<br>
+ RTE_FLOW_ERROR_TYPE_ACTION,<br>
+ NULL,<br>
+ "Age action on root table is not supported in HW steering mode");<br>
+ goto err;<br>
}<br>
if (__flow_hw_act_data_general_append(priv, acts,<br>
actions->type,<br>
@@ -2443,13 +2451,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
break;<br>
case RTE_FLOW_ACTION_TYPE_COUNT:<br>
flow_hw_translate_group(dev, cfg, attr->group,<br>
- &target_grp, error);<br>
+ &target_grp, &sub_error);<br>
if (target_grp == 0) {<br>
__flow_hw_action_template_destroy(dev, acts);<br>
- return rte_flow_error_set(error, ENOTSUP,<br>
- RTE_FLOW_ERROR_TYPE_ACTION,<br>
- NULL,<br>
- "Counter action on root table is not supported in HW steering mode");<br>
+ rte_flow_error_set(&sub_error, ENOTSUP,<br>
+ RTE_FLOW_ERROR_TYPE_ACTION,<br>
+ NULL,<br>
+ "Counter action on root table is not supported in HW steering mode");<br>
+ goto err;<br>
}<br>
if ((at->action_flags & MLX5_FLOW_ACTION_AGE) ||<br>
(at->action_flags & MLX5_FLOW_ACTION_INDIRECT_AGE))<br>
@@ -2519,7 +2528,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
}<br>
if (mhdr.pos != UINT16_MAX) {<br>
ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx,<br>
- &mhdr, error);<br>
+ &mhdr, &sub_error);<br>
if (ret)<br>
goto err;<br>
}<br>
@@ -2529,7 +2538,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
encap_data, encap_data_m,<br>
mp_ctx, data_size,<br>
reformat_src,<br>
- refmt_type, error);<br>
+ refmt_type, &sub_error);<br>
if (ret)<br>
goto err;<br>
}<br>
@@ -2548,6 +2557,10 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,<br>
rte_errno = EINVAL;<br>
err = rte_errno;<br>
__flow_hw_action_template_destroy(dev, acts);<br>
+ if (error != NULL && sub_error.type != RTE_FLOW_ERROR_TYPE_NONE) {<br>
+ rte_memcpy(error, &sub_error, sizeof(sub_error));<br>
+ return -EINVAL;<br>
+ }<br>
return rte_flow_error_set(error, err,<br>
RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,<br>
"fail to create rte table");<br>
-- <br>
2.34.1<br>
<br>
</div>
</span></font></div>
</body>
</html>