From: Junfeng Guo <junfengg@nvidia.com>
To: <stable@dpdk.org>
Cc: <dsosnowski@nvidia.com>, <viacheslavo@nvidia.com>,
<bingz@nvidia.com>, <orika@nvidia.com>, <suanmingm@nvidia.com>,
<matan@nvidia.com>, <xuemingl@nvidia.com>
Subject: [PATCH 23.11] net/mlx5: fix actions translation error overwrite
Date: Wed, 9 Apr 2025 09:35:59 +0300 [thread overview]
Message-ID: <20250409063559.288037-1-junfengg@nvidia.com> (raw)
[ upstream commit 494da70e289c6a603185c890111f95568eb1fd63 ]
Function __flow_hw_translate_actions_template contains several
encapsulated functions that already have internal error handling
process via rte_flow_error_set for each case.
Thus the one (rte_flow_error_set) within the goto statement `err`
at the end of __flow_hw_translate_actions_template function may be
redundant for those failed cases. As a result, the error messages
would all be overwritten as "fail to create rte table", making it
displayed at quite large granularity.
To prevent above error messages overwrite, this patch add a local
variable `struct rte_flow_error sub_error` to the function and pass
this `sub_error` instead of `error` to each sub-function. Under error
handling process (`err` label), if `sub_error` was updated, copy its
contents to `error` and return. If it was not updated, return default
error message (`fail to create rte table`).
Also refactor the logic for SEND_TO_KERNEL, COUNT and AGE actions in
above function to align the error handling process.
Fixes: f13fab23922b ("net/mlx5: add flow jump action")
Cc: suanmingm@nvidia.com
Cc: stable@dpdk.org
Signed-off-by: Junfeng Guo <junfengg@nvidia.com>
---
.mailmap | 2 +-
drivers/net/mlx5/mlx5_flow_hw.c | 55 ++++++++++++++++++++-------------
2 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/.mailmap b/.mailmap
index 7b2798a31a..20fa4a22ba 100644
--- a/.mailmap
+++ b/.mailmap
@@ -721,7 +721,7 @@ Julien Hascoet <ju.hascoet@gmail.com>
Julien Massonneau <julien.massonneau@6wind.com>
Julien Meunier <julien.meunier@nokia.com> <julien.meunier@6wind.com>
Július Milan <jmilan.dev@gmail.com>
-Junfeng Guo <junfeng.guo@intel.com>
+Junfeng Guo <junfengg@nvidia.com> <junfeng.guo@intel.com>
Junjie Chen <junjie.j.chen@intel.com>
Junjie Wan <wanjunjie@bytedance.com>
Jun Qiu <jun.qiu@jaguarmicro.com>
diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c
index 54f264a03c..c53d407746 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -2138,6 +2138,11 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
uint8_t *push_data = NULL, *push_data_m = NULL;
size_t data_size = 0, push_size = 0;
struct mlx5_hw_modify_header_action mhdr = { 0 };
+ struct rte_flow_error sub_error = {
+ .type = RTE_FLOW_ERROR_TYPE_NONE,
+ .cause = NULL,
+ .message = NULL,
+ };
bool actions_end = false;
uint32_t type;
bool reformat_used = false;
@@ -2246,7 +2251,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
((const struct rte_flow_action_jump *)
actions->conf)->group;
acts->jump = flow_hw_jump_action_register
- (dev, cfg, jump_group, error);
+ (dev, cfg, jump_group, &sub_error);
if (!acts->jump)
goto err;
acts->rule_acts[dr_pos].action = (!!attr->group) ?
@@ -2379,13 +2384,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
break;
case RTE_FLOW_ACTION_TYPE_SEND_TO_KERNEL:
flow_hw_translate_group(dev, cfg, attr->group,
- &target_grp, error);
+ &target_grp, &sub_error);
if (target_grp == 0) {
__flow_hw_action_template_destroy(dev, acts);
- return rte_flow_error_set(error, ENOTSUP,
- RTE_FLOW_ERROR_TYPE_ACTION,
- NULL,
- "Send to kernel action on root table is not supported in HW steering mode");
+ rte_flow_error_set(&sub_error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ NULL,
+ "Send to kernel action on root table is not supported in HW steering mode");
+ goto err;
}
table_type = attr->ingress ? MLX5DR_TABLE_TYPE_NIC_RX :
((attr->egress) ? MLX5DR_TABLE_TYPE_NIC_TX :
@@ -2395,14 +2401,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
case RTE_FLOW_ACTION_TYPE_MODIFY_FIELD:
err = flow_hw_modify_field_compile(dev, attr, actions,
masks, acts, &mhdr,
- src_pos, error);
+ src_pos, &sub_error);
if (err)
goto err;
break;
case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT:
if (flow_hw_represented_port_compile
(dev, attr, actions,
- masks, acts, src_pos, dr_pos, error))
+ masks, acts, src_pos, dr_pos, &sub_error))
goto err;
break;
case RTE_FLOW_ACTION_TYPE_METER:
@@ -2416,7 +2422,8 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
((const struct rte_flow_action_meter *)
masks->conf)->mtr_id) {
err = flow_hw_meter_compile(dev, cfg,
- dr_pos, jump_pos, actions, acts, error);
+ dr_pos, jump_pos, actions, acts,
+ &sub_error);
if (err)
goto err;
} else if (__flow_hw_act_data_general_append(priv, acts,
@@ -2427,13 +2434,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
break;
case RTE_FLOW_ACTION_TYPE_AGE:
flow_hw_translate_group(dev, cfg, attr->group,
- &target_grp, error);
+ &target_grp, &sub_error);
if (target_grp == 0) {
__flow_hw_action_template_destroy(dev, acts);
- return rte_flow_error_set(error, ENOTSUP,
- RTE_FLOW_ERROR_TYPE_ACTION,
- NULL,
- "Age action on root table is not supported in HW steering mode");
+ rte_flow_error_set(&sub_error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ NULL,
+ "Age action on root table is not supported in HW steering mode");
+ goto err;
}
if (__flow_hw_act_data_general_append(priv, acts,
actions->type,
@@ -2443,13 +2451,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
break;
case RTE_FLOW_ACTION_TYPE_COUNT:
flow_hw_translate_group(dev, cfg, attr->group,
- &target_grp, error);
+ &target_grp, &sub_error);
if (target_grp == 0) {
__flow_hw_action_template_destroy(dev, acts);
- return rte_flow_error_set(error, ENOTSUP,
- RTE_FLOW_ERROR_TYPE_ACTION,
- NULL,
- "Counter action on root table is not supported in HW steering mode");
+ rte_flow_error_set(&sub_error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ACTION,
+ NULL,
+ "Counter action on root table is not supported in HW steering mode");
+ goto err;
}
if ((at->action_flags & MLX5_FLOW_ACTION_AGE) ||
(at->action_flags & MLX5_FLOW_ACTION_INDIRECT_AGE))
@@ -2519,7 +2528,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
}
if (mhdr.pos != UINT16_MAX) {
ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx,
- &mhdr, error);
+ &mhdr, &sub_error);
if (ret)
goto err;
}
@@ -2529,7 +2538,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
encap_data, encap_data_m,
mp_ctx, data_size,
reformat_src,
- refmt_type, error);
+ refmt_type, &sub_error);
if (ret)
goto err;
}
@@ -2548,6 +2557,10 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
rte_errno = EINVAL;
err = rte_errno;
__flow_hw_action_template_destroy(dev, acts);
+ if (error != NULL && sub_error.type != RTE_FLOW_ERROR_TYPE_NONE) {
+ rte_memcpy(error, &sub_error, sizeof(sub_error));
+ return -EINVAL;
+ }
return rte_flow_error_set(error, err,
RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
"fail to create rte table");
--
2.34.1
reply other threads:[~2025-04-09 6:36 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250409063559.288037-1-junfengg@nvidia.com \
--to=junfengg@nvidia.com \
--cc=bingz@nvidia.com \
--cc=dsosnowski@nvidia.com \
--cc=matan@nvidia.com \
--cc=orika@nvidia.com \
--cc=stable@dpdk.org \
--cc=suanmingm@nvidia.com \
--cc=viacheslavo@nvidia.com \
--cc=xuemingl@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).