patch 'net/mlx5: fix actions translation error overwrite' has been queued to stable release 22.11.8

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Mar 7 13:24:16 CET 2025


Hi,

FYI, your patch has been queued to stable release 22.11.8

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/09/25. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/6bb59454b04bc43a601efa0389165afa148db421

Thanks.

Luca Boccassi

---
>From 6bb59454b04bc43a601efa0389165afa148db421 Mon Sep 17 00:00:00 2001
From: Junfeng Guo <junfengg at nvidia.com>
Date: Thu, 20 Feb 2025 09:08:50 +0200
Subject: [PATCH] net/mlx5: fix actions translation error overwrite

[ 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")

Signed-off-by: Junfeng Guo <junfengg at nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnowski at nvidia.com>
---
 .mailmap                        |  2 +-
 drivers/net/mlx5/mlx5_flow_hw.c | 41 +++++++++++++++++++++------------
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/.mailmap b/.mailmap
index dc7a465822..ee6eb01cf6 100644
--- a/.mailmap
+++ b/.mailmap
@@ -692,7 +692,7 @@ Julien Cretin <julien.cretin at trust-in-soft.com>
 Julien Massonneau <julien.massonneau at 6wind.com>
 Julien Meunier <julien.meunier at nokia.com> <julien.meunier at 6wind.com>
 Július Milan <jmilan.dev at gmail.com>
-Junfeng Guo <junfeng.guo at intel.com>
+Junfeng Guo <junfengg at nvidia.com> <junfeng.guo at intel.com>
 Junjie Chen <junjie.j.chen at intel.com>
 Junjie Wan <wanjunjie at bytedance.com>
 Jun Qiu <jun.qiu at jaguarmicro.com>
diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c
index a19342a25d..0f36700143 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -1368,6 +1368,11 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
 	uint8_t *encap_data = NULL, *encap_data_m = NULL;
 	size_t data_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;
@@ -1459,7 +1464,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[action_pos].action = (!!attr->group) ?
@@ -1568,7 +1573,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
 		case RTE_FLOW_ACTION_TYPE_MODIFY_FIELD:
 			err = flow_hw_modify_field_compile(dev, attr, action_start,
 							   actions, masks, acts, &mhdr,
-							   error);
+							   &sub_error);
 			if (err)
 				goto err;
 			/*
@@ -1586,7 +1591,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
 			action_pos = at->actions_off[actions - at->actions];
 			if (flow_hw_represented_port_compile
 					(dev, attr, action_start, actions,
-					 masks, acts, action_pos, error))
+					 masks, acts, action_pos, &sub_error))
 				goto err;
 			break;
 		case RTE_FLOW_ACTION_TYPE_METER:
@@ -1601,7 +1606,7 @@ __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,
-						action_pos, jump_pos, actions, acts, error);
+						action_pos, jump_pos, actions, acts, &sub_error);
 				if (err)
 					goto err;
 			} else if (__flow_hw_act_data_general_append(priv, acts,
@@ -1612,13 +1617,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;
 			}
 			action_pos = at->actions_off[actions - at->actions];
 			if (__flow_hw_act_data_general_append(priv, acts,
@@ -1629,13 +1635,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))
@@ -1739,7 +1746,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
 		MLX5_ASSERT(at->reformat_off != UINT16_MAX);
 		if (enc_item) {
 			MLX5_ASSERT(!encap_data);
-			if (flow_dv_convert_encap_data(enc_item, buf, &data_size, error))
+			if (flow_dv_convert_encap_data(enc_item, buf, &data_size, &sub_error))
 				goto err;
 			encap_data = buf;
 			if (!enc_item_m)
@@ -1782,6 +1789,10 @@ err:
 		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.47.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2025-03-07 12:23:38.646188034 +0000
+++ 0017-net-mlx5-fix-actions-translation-error-overwrite.patch	2025-03-07 12:23:38.018838643 +0000
@@ -1 +1 @@
-From 494da70e289c6a603185c890111f95568eb1fd63 Mon Sep 17 00:00:00 2001
+From 6bb59454b04bc43a601efa0389165afa148db421 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 494da70e289c6a603185c890111f95568eb1fd63 ]
+
@@ -27 +28,0 @@
-Cc: stable at dpdk.org
@@ -33,2 +34,2 @@
- drivers/net/mlx5/mlx5_flow_hw.c | 65 ++++++++++++++++++++-------------
- 2 files changed, 40 insertions(+), 27 deletions(-)
+ drivers/net/mlx5/mlx5_flow_hw.c | 41 +++++++++++++++++++++------------
+ 2 files changed, 27 insertions(+), 16 deletions(-)
@@ -37 +38 @@
-index 2a3f1b1bd4..e9896a2e5b 100644
+index dc7a465822..ee6eb01cf6 100644
@@ -40 +41 @@
-@@ -760,7 +760,7 @@ Julien Hascoet <ju.hascoet at gmail.com>
+@@ -692,7 +692,7 @@ Julien Cretin <julien.cretin at trust-in-soft.com>
@@ -48 +49 @@
- Junlong Wang <wang.junlong1 at zte.com.cn>
+ Jun Qiu <jun.qiu at jaguarmicro.com>
@@ -50 +51 @@
-index 501bf33f94..e72b87d70f 100644
+index a19342a25d..0f36700143 100644
@@ -53,3 +54,3 @@
-@@ -2543,6 +2543,11 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
- 	uint8_t *push_data = NULL, *push_data_m = NULL;
- 	size_t data_size = 0, push_size = 0;
+@@ -1368,6 +1368,11 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
+ 	uint8_t *encap_data = NULL, *encap_data_m = NULL;
+ 	size_t data_size = 0;
@@ -65 +66 @@
-@@ -2662,7 +2667,7 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
+@@ -1459,7 +1464,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
@@ -73,25 +74,2 @@
- 				acts->rule_acts[dr_pos].action = (!!attr->group) ?
-@@ -2793,15 +2798,16 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
- 			break;
- 		case RTE_FLOW_ACTION_TYPE_SEND_TO_KERNEL:
- 			ret = flow_hw_translate_group(dev, cfg, attr->group,
--						&target_grp, error);
-+						&target_grp, &sub_error);
- 			if (ret)
--				return ret;
-+				goto err;
- 			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 :
-@@ -2811,14 +2817,14 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
+ 				acts->rule_acts[action_pos].action = (!!attr->group) ?
+@@ -1568,7 +1573,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
@@ -99,4 +77,4 @@
- 			err = flow_hw_modify_field_compile(dev, attr, actions,
- 							   masks, acts, &mhdr,
--							   src_pos, error);
-+							   src_pos, &sub_error);
+ 			err = flow_hw_modify_field_compile(dev, attr, action_start,
+ 							   actions, masks, acts, &mhdr,
+-							   error);
++							   &sub_error);
@@ -105,2 +83,3 @@
- 			break;
- 		case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT:
+ 			/*
+@@ -1586,7 +1591,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
+ 			action_pos = at->actions_off[actions - at->actions];
@@ -108,3 +87,3 @@
- 					(dev, attr, actions,
--					 masks, acts, src_pos, dr_pos, error))
-+					 masks, acts, src_pos, dr_pos, &sub_error))
+ 					(dev, attr, action_start, actions,
+-					 masks, acts, action_pos, error))
++					 masks, acts, action_pos, &sub_error))
@@ -114 +93 @@
-@@ -2832,7 +2838,8 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
+@@ -1601,7 +1606,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
@@ -118,3 +97,2 @@
--							    dr_pos, jump_pos, actions, acts, error);
-+							    dr_pos, jump_pos, actions, acts,
-+							    &sub_error);
+-						action_pos, jump_pos, actions, acts, error);
++						action_pos, jump_pos, actions, acts, &sub_error);
@@ -124 +102 @@
-@@ -2843,15 +2850,16 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
+@@ -1612,13 +1617,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
@@ -127 +105 @@
- 			ret = flow_hw_translate_group(dev, cfg, attr->group,
+ 			flow_hw_translate_group(dev, cfg, attr->group,
@@ -130,3 +107,0 @@
- 			if (ret)
--				return ret;
-+				goto err;
@@ -144,0 +120 @@
+ 			action_pos = at->actions_off[actions - at->actions];
@@ -146,2 +122 @@
- 							      actions->type,
-@@ -2861,15 +2869,16 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
+@@ -1629,13 +1635,14 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
@@ -150 +125 @@
- 			ret = flow_hw_translate_group(dev, cfg, attr->group,
+ 			flow_hw_translate_group(dev, cfg, attr->group,
@@ -153,3 +127,0 @@
- 			if (ret)
--				return ret;
-+				goto err;
@@ -170,21 +142,6 @@
-@@ -2912,7 +2921,7 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
- 								 acts->rule_acts,
- 								 &acts->mtr_id,
- 								 MLX5_HW_INV_QUEUE,
--								 error);
-+								 &sub_error);
- 				if (err)
- 					goto err;
- 			} else if (__flow_hw_act_data_general_append(priv, acts,
-@@ -2979,11 +2988,11 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
- 		}
- 	}
- 	if (mhdr.pos != UINT16_MAX) {
--		ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx, &mhdr, error);
-+		ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx, &mhdr, &sub_error);
- 		if (ret)
- 			goto err;
- 		if (!nt_mode && mhdr.shared) {
--			ret = mlx5_tbl_ensure_shared_modify_header(dev, cfg, acts, error);
-+			ret = mlx5_tbl_ensure_shared_modify_header(dev, cfg, acts, &sub_error);
- 			if (ret)
+@@ -1739,7 +1746,7 @@ __flow_hw_actions_translate(struct rte_eth_dev *dev,
+ 		MLX5_ASSERT(at->reformat_off != UINT16_MAX);
+ 		if (enc_item) {
+ 			MLX5_ASSERT(!encap_data);
+-			if (flow_dv_convert_encap_data(enc_item, buf, &data_size, error))
++			if (flow_dv_convert_encap_data(enc_item, buf, &data_size, &sub_error))
@@ -192,11 +149,3 @@
- 		}
-@@ -2994,7 +3003,7 @@ __flow_hw_translate_actions_template(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;
- 		if (!nt_mode && acts->encap_decap->shared) {
-@@ -3020,6 +3029,10 @@ err:
+ 			encap_data = buf;
+ 			if (!enc_item_m)
+@@ -1782,6 +1789,10 @@ err:


More information about the stable mailing list