patch 'net/txgbe: switch to FDIR when ntuple filter is full' has been queued to stable release 22.11.11

luca.boccassi at gmail.com luca.boccassi at gmail.com
Wed Nov 12 17:52:42 CET 2025


Hi,

FYI, your patch has been queued to stable release 22.11.11

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/14/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/2764f319bbcfe01f961023b2a856bedd30dd3d49

Thanks.

Luca Boccassi

---
>From 2764f319bbcfe01f961023b2a856bedd30dd3d49 Mon Sep 17 00:00:00 2001
From: Jiawen Wu <jiawenwu at trustnetic.com>
Date: Mon, 27 Oct 2025 11:15:39 +0800
Subject: [PATCH] net/txgbe: switch to FDIR when ntuple filter is full

[ upstream commit ccac5e093041f255f38a59ea472c6dee493ccc7c ]

Using ntuple filter has less performance loss on the hardware compared
to FDIR filter. So when the flow rule both match ntuple filter and FDIR
filter, ntuple filter will be created first. But there are only maximum
128 flow rules can be created on ntuple filter, it is far less than the
requirements of many users. So switch to use FDIR when ntuple filters
are full.

Fixes: 77a72b4d9dc0 ("net/txgbe: support ntuple filter add and delete")

Signed-off-by: Jiawen Wu <jiawenwu at trustnetic.com>
---
 drivers/net/txgbe/txgbe_ethdev.c | 5 ++++-
 drivers/net/txgbe/txgbe_ethdev.h | 1 +
 drivers/net/txgbe/txgbe_flow.c   | 8 ++++++++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 8b4a134b08..004738f5ae 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -851,6 +851,7 @@ static int txgbe_ntuple_filter_uninit(struct rte_eth_dev *eth_dev)
 	}
 	memset(filter_info->fivetuple_mask, 0,
 	       sizeof(uint32_t) * TXGBE_5TUPLE_ARRAY_SIZE);
+	filter_info->ntuple_is_full = false;
 
 	return 0;
 }
@@ -4070,7 +4071,8 @@ txgbe_add_5tuple_filter(struct rte_eth_dev *dev,
 		}
 	}
 	if (i >= TXGBE_MAX_FTQF_FILTERS) {
-		PMD_DRV_LOG(ERR, "5tuple filters are full.");
+		PMD_DRV_LOG(INFO, "5tuple filters are full, switch to FDIR");
+		filter_info->ntuple_is_full = true;
 		return -ENOSYS;
 	}
 
@@ -4098,6 +4100,7 @@ txgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
 				~(1 << (index % (sizeof(uint32_t) * NBBY)));
 	TAILQ_REMOVE(&filter_info->fivetuple_list, filter, entries);
 	rte_free(filter);
+	filter_info->ntuple_is_full = false;
 
 	wr32(hw, TXGBE_5TFDADDR(index), 0);
 	wr32(hw, TXGBE_5TFSADDR(index), 0);
diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h
index 7b278da096..e02df98c41 100644
--- a/drivers/net/txgbe/txgbe_ethdev.h
+++ b/drivers/net/txgbe/txgbe_ethdev.h
@@ -241,6 +241,7 @@ struct txgbe_filter_info {
 	/* Bit mask for every used 5tuple filter */
 	uint32_t fivetuple_mask[TXGBE_5TUPLE_ARRAY_SIZE];
 	struct txgbe_5tuple_filter_list fivetuple_list;
+	bool ntuple_is_full;
 	/* store the SYN filter info */
 	uint32_t syn_info;
 	/* store the rss filter info */
diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c
index f947093014..074bbe6aab 100644
--- a/drivers/net/txgbe/txgbe_flow.c
+++ b/drivers/net/txgbe/txgbe_flow.c
@@ -580,8 +580,12 @@ txgbe_parse_ntuple_filter(struct rte_eth_dev *dev,
 			  struct rte_eth_ntuple_filter *filter,
 			  struct rte_flow_error *error)
 {
+	struct txgbe_filter_info *filter_info = TXGBE_DEV_FILTER(dev);
 	int ret;
 
+	if (filter_info->ntuple_is_full)
+		return -ENOSYS;
+
 	ret = cons_parse_ntuple_filter(attr, pattern, actions, filter, error);
 
 	if (ret)
@@ -3200,6 +3204,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
 	struct txgbe_fdir_rule_ele *fdir_rule_ptr;
 	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;
 
 	flow = rte_zmalloc("txgbe_rte_flow", sizeof(struct rte_flow), 0);
@@ -3245,10 +3250,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
 			flow->rule = ntuple_filter_ptr;
 			flow->filter_type = RTE_ETH_FILTER_NTUPLE;
 			return flow;
+		} else if (filter_info->ntuple_is_full) {
+			goto next;
 		}
 		goto out;
 	}
 
+next:
 	memset(&ethertype_filter, 0, sizeof(struct rte_eth_ethertype_filter));
 	ret = txgbe_parse_ethertype_filter(dev, attr, pattern,
 				actions, &ethertype_filter, error);
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2025-11-12 16:20:42.011288021 +0000
+++ 0028-net-txgbe-switch-to-FDIR-when-ntuple-filter-is-full.patch	2025-11-12 16:20:40.927716946 +0000
@@ -1 +1 @@
-From ccac5e093041f255f38a59ea472c6dee493ccc7c Mon Sep 17 00:00:00 2001
+From 2764f319bbcfe01f961023b2a856bedd30dd3d49 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit ccac5e093041f255f38a59ea472c6dee493ccc7c ]
+
@@ -14 +15,0 @@
-Cc: stable at dpdk.org
@@ -24 +25 @@
-index f650c5b7a4..21f0711762 100644
+index 8b4a134b08..004738f5ae 100644
@@ -27 +28 @@
-@@ -893,6 +893,7 @@ int txgbe_ntuple_filter_uninit(struct rte_eth_dev *eth_dev)
+@@ -851,6 +851,7 @@ static int txgbe_ntuple_filter_uninit(struct rte_eth_dev *eth_dev)
@@ -35 +36 @@
-@@ -4495,7 +4496,8 @@ txgbe_add_5tuple_filter(struct rte_eth_dev *dev,
+@@ -4070,7 +4071,8 @@ txgbe_add_5tuple_filter(struct rte_eth_dev *dev,
@@ -45 +46 @@
-@@ -4526,6 +4528,7 @@ txgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
+@@ -4098,6 +4100,7 @@ txgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
@@ -51,2 +52,2 @@
- 	if (!txgbe_is_pf(TXGBE_DEV_HW(dev))) {
- 		txgbevf_remove_5tuple_filter(dev, index);
+ 	wr32(hw, TXGBE_5TFDADDR(index), 0);
+ 	wr32(hw, TXGBE_5TFSADDR(index), 0);
@@ -54 +55 @@
-index 053aa1645f..1e7cc5ea80 100644
+index 7b278da096..e02df98c41 100644
@@ -57 +58 @@
-@@ -245,6 +245,7 @@ struct txgbe_filter_info {
+@@ -241,6 +241,7 @@ struct txgbe_filter_info {
@@ -66 +67 @@
-index d3113b6fc8..cd05ceffed 100644
+index f947093014..074bbe6aab 100644
@@ -90 +91 @@
-@@ -3245,6 +3250,8 @@ txgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3245,10 +3250,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
@@ -97,3 +97,0 @@
- 		goto out;
- 	}
-@@ -3254,6 +3261,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,


More information about the stable mailing list