patch 'net/txgbe: do not enable flow director on flow validate' has been queued to stable release 24.11.9

luca.boccassi at gmail.com luca.boccassi at gmail.com
Thu Nov 5 17:43:04 CET 2026


Hi,

FYI, your patch has been queued to stable release 24.11.9

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/07/26. 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/f2fe47da1795473c48263b08dc57d6e217f4451a

Thanks.

Luca Boccassi

---
>From f2fe47da1795473c48263b08dc57d6e217f4451a Mon Sep 17 00:00:00 2001
From: Zhang Tengfei <zhtfdev at gmail.com>
Date: Thu, 15 Oct 2026 00:39:23 +0800
Subject: [PATCH] net/txgbe: do not enable flow director on flow validate

[ upstream commit 99bbecbbe8ccdc649c71563e845dcf7b804b79a4 ]

Flow Director was enabled and its mode recorded while parsing a rule,
so validating a rule configured the hardware, and the mode stayed
locked when the rule was rejected afterwards, e.g. for an invalid
queue or when the rule could not be programmed.

Enable Flow Director only when creating the rule, and reset the mode
if the first rule fails. Reject a mode other than signature or perfect
while parsing. Configuration does not implement it, so validate and
create fail the same way.

Fixes: 5007ac13189d ("ethdev: remove deprecated Flow Director configuration")

Signed-off-by: Zhang Tengfei <zhtfdev at gmail.com>
---
 drivers/net/txgbe/txgbe_flow.c | 59 ++++++++++++++++++----------------
 1 file changed, 31 insertions(+), 28 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c
index 6f321ebf497..5032c8d836e 100644
--- a/drivers/net/txgbe/txgbe_flow.c
+++ b/drivers/net/txgbe/txgbe_flow.c
@@ -2942,16 +2942,13 @@ txgbe_parse_fdir_filter(struct rte_eth_dev *dev,
 		return ret;
 
 step_next:
-	if (fdir_conf->mode == RTE_FDIR_MODE_NONE) {
-		fdir_conf->mode = rule->mode;
-		ret = txgbe_fdir_configure(dev);
-		if (ret) {
-			fdir_conf->mode = RTE_FDIR_MODE_NONE;
-			return ret;
-		}
-	} else if (fdir_conf->mode != rule->mode) {
+	if (rule->mode != RTE_FDIR_MODE_SIGNATURE &&
+	    rule->mode != RTE_FDIR_MODE_PERFECT)
+		return -ENOTSUP;
+
+	if (fdir_conf->mode != RTE_FDIR_MODE_NONE &&
+	    fdir_conf->mode != rule->mode)
 		return -ENOTSUP;
-	}
 
 	if (rule->queue >= dev->data->nb_rx_queues)
 		return -ENOTSUP;
@@ -3177,17 +3174,19 @@ txgbe_flow_create(struct rte_eth_dev *dev,
 	struct txgbe_fdir_rule fdir_rule;
 	struct txgbe_l2_tunnel_conf l2_tn_filter;
 	struct txgbe_hw_fdir_info *fdir_info = TXGBE_DEV_FDIR(dev);
+	struct rte_eth_fdir_conf *fdir_conf = TXGBE_DEV_FDIR_CONF(dev);
 	struct txgbe_rte_flow_rss_conf rss_conf;
 	struct rte_flow *flow = NULL;
 	struct txgbe_ntuple_filter_ele *ntuple_filter_ptr;
 	struct txgbe_ethertype_filter_ele *ethertype_filter_ptr;
 	struct txgbe_eth_syn_filter_ele *syn_filter_ptr;
 	struct txgbe_eth_l2_tunnel_conf_ele *l2_tn_filter_ptr;
-	struct txgbe_fdir_rule_ele *fdir_rule_ptr;
+	struct txgbe_fdir_rule_ele *fdir_rule_ptr = NULL;
 	struct txgbe_rss_conf_ele *rss_filter_ptr;
 	struct txgbe_flow_mem *txgbe_flow_mem_ptr;
 	struct txgbe_filter_info *filter_info = TXGBE_DEV_FILTER(dev);
 	uint8_t first_mask = FALSE;
+	bool fdir_configured = false;
 
 	flow = rte_zmalloc("txgbe_rte_flow", sizeof(struct rte_flow), 0);
 	if (!flow) {
@@ -3305,6 +3304,16 @@ next:
 			goto out;
 		}
 
+		if (fdir_conf->mode == RTE_FDIR_MODE_NONE) {
+			fdir_conf->mode = fdir_rule.mode;
+			ret = txgbe_fdir_configure(dev);
+			if (ret) {
+				fdir_conf->mode = RTE_FDIR_MODE_NONE;
+				goto fdir_out;
+			}
+			fdir_configured = true;
+		}
+
 		/* A mask cannot be deleted. */
 		if (fdir_rule.b_mask) {
 			if (!fdir_info->mask_added) {
@@ -3328,10 +3337,8 @@ next:
 				fdir_info->mask.pkt_type_mask =
 					fdir_rule.mask.pkt_type_mask;
 				ret = txgbe_fdir_set_input_mask(dev);
-				if (ret) {
-					rte_free(fdir_rule_ptr);
-					goto out;
-				}
+				if (ret)
+					goto fdir_out;
 
 				fdir_info->mask_added = TRUE;
 				first_mask = TRUE;
@@ -3344,9 +3351,8 @@ next:
 					&fdir_rule.mask,
 					sizeof(struct txgbe_hw_fdir_mask)) != 0) {
 					PMD_DRV_LOG(ERR, "only support one global mask");
-					rte_free(fdir_rule_ptr);
 					ret = -EINVAL;
-					goto out;
+					goto fdir_out;
 				}
 
 				if (fdir_info->flex_bytes_offset !=
@@ -3355,25 +3361,16 @@ next:
 				    fdir_rule.flex_relative) {
 					PMD_DRV_LOG(ERR,
 						"flex bytes offset mismatch");
-					rte_free(fdir_rule_ptr);
 					ret = -EINVAL;
-					goto out;
+					goto fdir_out;
 				}
 			}
 		}
 
 		ret = txgbe_fdir_filter_program(dev, &fdir_rule,
 				FALSE, FALSE);
-		if (ret) {
-			rte_free(fdir_rule_ptr);
-			/**
-			 * clean the mask_added flag if fail to
-			 * program
-			 **/
-			if (first_mask)
-				fdir_info->mask_added = FALSE;
-			goto out;
-		}
+		if (ret)
+			goto fdir_out;
 
 		fdir_rule_ptr->filter_info = fdir_rule;
 		TAILQ_INSERT_TAIL(&filter_fdir_list,
@@ -3433,6 +3430,12 @@ next:
 		return flow;
 	}
 
+fdir_out:
+	rte_free(fdir_rule_ptr);
+	if (first_mask)
+		fdir_info->mask_added = FALSE;
+	if (fdir_configured)
+		fdir_conf->mode = RTE_FDIR_MODE_NONE;
 out:
 	TAILQ_REMOVE(&txgbe_flow_list,
 		txgbe_flow_mem_ptr, entries);
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-11-05 16:42:48.628992038 +0000
+++ 0097-net-txgbe-do-not-enable-flow-director-on-flow-valida.patch	2026-11-05 16:42:45.033064133 +0000
@@ -1 +1 @@
-From 99bbecbbe8ccdc649c71563e845dcf7b804b79a4 Mon Sep 17 00:00:00 2001
+From f2fe47da1795473c48263b08dc57d6e217f4451a Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 99bbecbbe8ccdc649c71563e845dcf7b804b79a4 ]
+
@@ -17 +18,0 @@
-Cc: stable at dpdk.org
@@ -25 +26 @@
-index f8d8c6850d..0b7ce3aa2d 100644
+index 6f321ebf497..5032c8d836e 100644
@@ -28,2 +29 @@
-@@ -2966,16 +2966,13 @@ step_next:
- 	if (!txgbe_is_pf(TXGBE_DEV_HW(dev)))
+@@ -2942,16 +2942,13 @@ txgbe_parse_fdir_filter(struct rte_eth_dev *dev,
@@ -31,0 +32 @@
+ step_next:
@@ -51 +52 @@
-@@ -3208,17 +3205,19 @@ txgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3177,17 +3174,19 @@ txgbe_flow_create(struct rte_eth_dev *dev,
@@ -72 +73 @@
-@@ -3360,6 +3359,16 @@ next:
+@@ -3305,6 +3304,16 @@ next:
@@ -89 +90 @@
-@@ -3381,10 +3390,8 @@ next:
+@@ -3328,10 +3337,8 @@ next:
@@ -102 +103 @@
-@@ -3397,9 +3404,8 @@ next:
+@@ -3344,9 +3351,8 @@ next:
@@ -113 +114 @@
-@@ -3408,25 +3414,16 @@ next:
+@@ -3355,25 +3361,16 @@ next:
@@ -142 +143 @@
-@@ -3486,6 +3483,12 @@ next:
+@@ -3433,6 +3430,12 @@ next:


More information about the stable mailing list