patch 'net/ixgbe: fix flows not being scoped to port' has been queued to stable release 25.11.3

Kevin Traynor ktraynor at redhat.com
Thu Jul 23 19:15:05 CEST 2026


Hi,

FYI, your patch has been queued to stable release 25.11.3

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

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/eb5c7cb55191b90440eb1c48264603591e8e2963

Thanks.

Kevin

---
>From eb5c7cb55191b90440eb1c48264603591e8e2963 Mon Sep 17 00:00:00 2001
From: Anatoly Burakov <anatoly.burakov at intel.com>
Date: Thu, 30 Apr 2026 12:14:30 +0100
Subject: [PATCH] net/ixgbe: fix flows not being scoped to port

[ upstream commit 8494070f4f587b11c0578fc0408017794285993d ]

Currently, ixgbe keeps `rte_flow`` software state in global static lists
without tracking which port created each rule. As a result, a rule
removal request can affect rules that belong to another port (for example,
a flow flush command will drop *all* flows from *all* ixgbe ports).

Fix this by moving the flow lists to adapter structure.

Fixes: 72c135a89f80 ("net/ixgbe: create consistent filter")

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
Acked-by: Bruce Richardson <bruce.richardson at intel.com>
---
 drivers/net/intel/ixgbe/ixgbe_ethdev.c |   4 +-
 drivers/net/intel/ixgbe/ixgbe_ethdev.h |  21 ++-
 drivers/net/intel/ixgbe/ixgbe_flow.c   | 223 +++++++++++--------------
 3 files changed, 121 insertions(+), 127 deletions(-)

diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.c b/drivers/net/intel/ixgbe/ixgbe_ethdev.c
index 11500a923c..990257dc05 100644
--- a/drivers/net/intel/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.c
@@ -1339,5 +1339,5 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
 
 	/* initialize flow filter lists */
-	ixgbe_filterlist_init();
+	ixgbe_filterlist_init(eth_dev);
 
 	/* initialize bandwidth configuration info */
@@ -3144,5 +3144,5 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
 
 	/* clear all the filters list */
-	ixgbe_filterlist_flush();
+	ixgbe_filterlist_flush(dev);
 
 	/* Remove all Traffic Manager configuration */
diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.h b/drivers/net/intel/ixgbe/ixgbe_ethdev.h
index 5dbd659941..2e1b94a483 100644
--- a/drivers/net/intel/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.h
@@ -470,4 +470,17 @@ struct ixgbe_tm_conf {
 };
 
+struct ixgbe_filter_ele_base;
+TAILQ_HEAD(ixgbe_filter_ele_list, ixgbe_filter_ele_base);
+
+struct ixgbe_flow_lists {
+	struct ixgbe_filter_ele_list ntuple_list;
+	struct ixgbe_filter_ele_list ethertype_list;
+	struct ixgbe_filter_ele_list syn_list;
+	struct ixgbe_filter_ele_list fdir_list;
+	struct ixgbe_filter_ele_list l2_tunnel_list;
+	struct ixgbe_filter_ele_list rss_list;
+	struct ixgbe_filter_ele_list flow_list;
+};
+
 /*
  * Structure to store private data for each driver instance (for each port).
@@ -491,4 +504,5 @@ struct ixgbe_adapter {
 #endif /* RTE_LIBRTE_IXGBE_BYPASS */
 	struct ixgbe_filter_info    filter;
+	struct ixgbe_flow_lists     flow_lists;
 	struct ixgbe_l2_tn_info     l2_tn;
 	struct ixgbe_bw_conf        bw_conf;
@@ -574,4 +588,7 @@ uint16_t ixgbe_vf_representor_tx_burst(void *tx_queue, struct rte_mbuf **tx_pkts
 	(&((struct ixgbe_adapter *)adapter)->filter)
 
+#define IXGBE_DEV_PRIVATE_TO_FLOW_LISTS(adapter) \
+	(&((struct ixgbe_adapter *)adapter)->flow_lists)
+
 #define IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(adapter) \
 	(&((struct ixgbe_adapter *)adapter)->l2_tn)
@@ -704,6 +721,6 @@ int
 ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev *dev,
 			       struct ixgbe_l2_tunnel_conf *l2_tunnel);
-void ixgbe_filterlist_init(void);
-void ixgbe_filterlist_flush(void);
+void ixgbe_filterlist_init(struct rte_eth_dev *dev);
+void ixgbe_filterlist_flush(struct rte_eth_dev *dev);
 /*
  * Flow director function prototypes
diff --git a/drivers/net/intel/ixgbe/ixgbe_flow.c b/drivers/net/intel/ixgbe/ixgbe_flow.c
index 6a7edc6377..630b1e9361 100644
--- a/drivers/net/intel/ixgbe/ixgbe_flow.c
+++ b/drivers/net/intel/ixgbe/ixgbe_flow.c
@@ -24,4 +24,5 @@
 #include <rte_alarm.h>
 #include <rte_ether.h>
+#include <rte_tailq.h>
 #include <ethdev_driver.h>
 #include <rte_malloc.h>
@@ -49,56 +50,44 @@
 #define IXGBE_MAX_FLX_SOURCE_OFF 62
 
+struct ixgbe_filter_ele_base {
+	TAILQ_ENTRY(ixgbe_filter_ele_base) entries;
+};
+
 /* ntuple filter list structure */
 struct ixgbe_ntuple_filter_ele {
-	TAILQ_ENTRY(ixgbe_ntuple_filter_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct rte_eth_ntuple_filter filter_info;
 };
 /* ethertype filter list structure */
 struct ixgbe_ethertype_filter_ele {
-	TAILQ_ENTRY(ixgbe_ethertype_filter_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct rte_eth_ethertype_filter filter_info;
 };
 /* syn filter list structure */
 struct ixgbe_eth_syn_filter_ele {
-	TAILQ_ENTRY(ixgbe_eth_syn_filter_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct rte_eth_syn_filter filter_info;
 };
 /* fdir filter list structure */
 struct ixgbe_fdir_rule_ele {
-	TAILQ_ENTRY(ixgbe_fdir_rule_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct ixgbe_fdir_rule filter_info;
 };
 /* l2_tunnel filter list structure */
 struct ixgbe_eth_l2_tunnel_conf_ele {
-	TAILQ_ENTRY(ixgbe_eth_l2_tunnel_conf_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct ixgbe_l2_tunnel_conf filter_info;
 };
 /* rss filter list structure */
 struct ixgbe_rss_conf_ele {
-	TAILQ_ENTRY(ixgbe_rss_conf_ele) entries;
+	struct ixgbe_filter_ele_base base;
 	struct ixgbe_rte_flow_rss_conf filter_info;
 };
 /* ixgbe_flow memory list structure */
 struct ixgbe_flow_mem {
-	TAILQ_ENTRY(ixgbe_flow_mem) entries;
+	struct ixgbe_filter_ele_base base;
 	struct rte_flow *flow;
 };
 
-TAILQ_HEAD(ixgbe_ntuple_filter_list, ixgbe_ntuple_filter_ele);
-TAILQ_HEAD(ixgbe_ethertype_filter_list, ixgbe_ethertype_filter_ele);
-TAILQ_HEAD(ixgbe_syn_filter_list, ixgbe_eth_syn_filter_ele);
-TAILQ_HEAD(ixgbe_fdir_rule_filter_list, ixgbe_fdir_rule_ele);
-TAILQ_HEAD(ixgbe_l2_tunnel_filter_list, ixgbe_eth_l2_tunnel_conf_ele);
-TAILQ_HEAD(ixgbe_rss_filter_list, ixgbe_rss_conf_ele);
-TAILQ_HEAD(ixgbe_flow_mem_list, ixgbe_flow_mem);
-
-static struct ixgbe_ntuple_filter_list filter_ntuple_list;
-static struct ixgbe_ethertype_filter_list filter_ethertype_list;
-static struct ixgbe_syn_filter_list filter_syn_list;
-static struct ixgbe_fdir_rule_filter_list filter_fdir_list;
-static struct ixgbe_l2_tunnel_filter_list filter_l2_tunnel_list;
-static struct ixgbe_rss_filter_list filter_rss_list;
-static struct ixgbe_flow_mem_list ixgbe_flow_list;
-
 /**
  * Endless loop will never happen with below assumption
@@ -2969,74 +2958,50 @@ ixgbe_clear_rss_filter(struct rte_eth_dev *dev)
 
 void
-ixgbe_filterlist_init(void)
+ixgbe_filterlist_init(struct rte_eth_dev *dev)
 {
-	TAILQ_INIT(&filter_ntuple_list);
-	TAILQ_INIT(&filter_ethertype_list);
-	TAILQ_INIT(&filter_syn_list);
-	TAILQ_INIT(&filter_fdir_list);
-	TAILQ_INIT(&filter_l2_tunnel_list);
-	TAILQ_INIT(&filter_rss_list);
-	TAILQ_INIT(&ixgbe_flow_list);
+	struct ixgbe_flow_lists *flow_lists =
+		IXGBE_DEV_PRIVATE_TO_FLOW_LISTS(dev->data->dev_private);
+
+	TAILQ_INIT(&flow_lists->ntuple_list);
+	TAILQ_INIT(&flow_lists->ethertype_list);
+	TAILQ_INIT(&flow_lists->syn_list);
+	TAILQ_INIT(&flow_lists->fdir_list);
+	TAILQ_INIT(&flow_lists->l2_tunnel_list);
+	TAILQ_INIT(&flow_lists->rss_list);
+	TAILQ_INIT(&flow_lists->flow_list);
+}
+
+static void
+ixgbe_filter_flush(struct ixgbe_filter_ele_list *list)
+{
+	struct ixgbe_filter_ele_base *ele, *tmp;
+
+	RTE_TAILQ_FOREACH_SAFE(ele, list, entries, tmp) {
+		TAILQ_REMOVE(list, ele, entries);
+		rte_free(ele);
+	}
 }
 
 void
-ixgbe_filterlist_flush(void)
+ixgbe_filterlist_flush(struct rte_eth_dev *dev)
 {
-	struct ixgbe_ntuple_filter_ele *ntuple_filter_ptr;
-	struct ixgbe_ethertype_filter_ele *ethertype_filter_ptr;
-	struct ixgbe_eth_syn_filter_ele *syn_filter_ptr;
-	struct ixgbe_eth_l2_tunnel_conf_ele *l2_tn_filter_ptr;
-	struct ixgbe_fdir_rule_ele *fdir_rule_ptr;
-	struct ixgbe_flow_mem *ixgbe_flow_mem_ptr;
-	struct ixgbe_rss_conf_ele *rss_filter_ptr;
+	struct ixgbe_flow_lists *flow_lists =
+		IXGBE_DEV_PRIVATE_TO_FLOW_LISTS(dev->data->dev_private);
+	struct ixgbe_filter_ele_base *ele, *tmp;
 
-	while ((ntuple_filter_ptr = TAILQ_FIRST(&filter_ntuple_list))) {
-		TAILQ_REMOVE(&filter_ntuple_list,
-				 ntuple_filter_ptr,
-				 entries);
-		rte_free(ntuple_filter_ptr);
-	}
+	ixgbe_filter_flush(&flow_lists->ntuple_list);
+	ixgbe_filter_flush(&flow_lists->ethertype_list);
+	ixgbe_filter_flush(&flow_lists->syn_list);
+	ixgbe_filter_flush(&flow_lists->l2_tunnel_list);
+	ixgbe_filter_flush(&flow_lists->fdir_list);
+	ixgbe_filter_flush(&flow_lists->rss_list);
 
-	while ((ethertype_filter_ptr = TAILQ_FIRST(&filter_ethertype_list))) {
-		TAILQ_REMOVE(&filter_ethertype_list,
-				 ethertype_filter_ptr,
-				 entries);
-		rte_free(ethertype_filter_ptr);
-	}
+	RTE_TAILQ_FOREACH_SAFE(ele, &flow_lists->flow_list, entries, tmp) {
+		struct ixgbe_flow_mem *ixgbe_flow_mem_ptr =
+			(struct ixgbe_flow_mem *)ele;
 
-	while ((syn_filter_ptr = TAILQ_FIRST(&filter_syn_list))) {
-		TAILQ_REMOVE(&filter_syn_list,
-				 syn_filter_ptr,
-				 entries);
-		rte_free(syn_filter_ptr);
-	}
-
-	while ((l2_tn_filter_ptr = TAILQ_FIRST(&filter_l2_tunnel_list))) {
-		TAILQ_REMOVE(&filter_l2_tunnel_list,
-				 l2_tn_filter_ptr,
-				 entries);
-		rte_free(l2_tn_filter_ptr);
-	}
-
-	while ((fdir_rule_ptr = TAILQ_FIRST(&filter_fdir_list))) {
-		TAILQ_REMOVE(&filter_fdir_list,
-				 fdir_rule_ptr,
-				 entries);
-		rte_free(fdir_rule_ptr);
-	}
-
-	while ((rss_filter_ptr = TAILQ_FIRST(&filter_rss_list))) {
-		TAILQ_REMOVE(&filter_rss_list,
-				 rss_filter_ptr,
-				 entries);
-		rte_free(rss_filter_ptr);
-	}
-
-	while ((ixgbe_flow_mem_ptr = TAILQ_FIRST(&ixgbe_flow_list))) {
-		TAILQ_REMOVE(&ixgbe_flow_list,
-				 ixgbe_flow_mem_ptr,
-				 entries);
+		TAILQ_REMOVE(&flow_lists->flow_list, ele, entries);
 		rte_free(ixgbe_flow_mem_ptr->flow);
-		rte_free(ixgbe_flow_mem_ptr);
+		rte_free(ele);
 	}
 }
@@ -3072,4 +3037,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 	struct ixgbe_rss_conf_ele *rss_filter_ptr;
 	struct ixgbe_flow_mem *ixgbe_flow_mem_ptr;
+	struct ixgbe_flow_lists *flow_lists =
+		IXGBE_DEV_PRIVATE_TO_FLOW_LISTS(dev->data->dev_private);
 	uint8_t first_mask = FALSE;
 
@@ -3087,6 +3054,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 	}
 	ixgbe_flow_mem_ptr->flow = flow;
-	TAILQ_INSERT_TAIL(&ixgbe_flow_list,
-				ixgbe_flow_mem_ptr, entries);
+	TAILQ_INSERT_TAIL(&flow_lists->flow_list,
+				&ixgbe_flow_mem_ptr->base, entries);
 
 	memset(&ntuple_filter, 0, sizeof(struct rte_eth_ntuple_filter));
@@ -3116,6 +3083,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 				&ntuple_filter,
 				sizeof(struct rte_eth_ntuple_filter));
-			TAILQ_INSERT_TAIL(&filter_ntuple_list,
-				ntuple_filter_ptr, entries);
+			TAILQ_INSERT_TAIL(&flow_lists->ntuple_list,
+				&ntuple_filter_ptr->base, entries);
 			flow->rule = ntuple_filter_ptr;
 			flow->filter_type = RTE_ETH_FILTER_NTUPLE;
@@ -3142,6 +3109,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 				&ethertype_filter,
 				sizeof(struct rte_eth_ethertype_filter));
-			TAILQ_INSERT_TAIL(&filter_ethertype_list,
-				ethertype_filter_ptr, entries);
+			TAILQ_INSERT_TAIL(&flow_lists->ethertype_list,
+				&ethertype_filter_ptr->base, entries);
 			flow->rule = ethertype_filter_ptr;
 			flow->filter_type = RTE_ETH_FILTER_ETHERTYPE;
@@ -3166,6 +3133,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 				&syn_filter,
 				sizeof(struct rte_eth_syn_filter));
-			TAILQ_INSERT_TAIL(&filter_syn_list,
-				syn_filter_ptr,
+			TAILQ_INSERT_TAIL(&flow_lists->syn_list,
+				&syn_filter_ptr->base,
 				entries);
 			flow->rule = syn_filter_ptr;
@@ -3229,6 +3196,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 					&fdir_rule,
 					sizeof(struct ixgbe_fdir_rule));
-				TAILQ_INSERT_TAIL(&filter_fdir_list,
-					fdir_rule_ptr, entries);
+				TAILQ_INSERT_TAIL(&flow_lists->fdir_list,
+					&fdir_rule_ptr->base, entries);
 				flow->rule = fdir_rule_ptr;
 				flow->filter_type = RTE_ETH_FILTER_FDIR;
@@ -3266,6 +3233,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 				&l2_tn_filter,
 				sizeof(struct ixgbe_l2_tunnel_conf));
-			TAILQ_INSERT_TAIL(&filter_l2_tunnel_list,
-				l2_tn_filter_ptr, entries);
+			TAILQ_INSERT_TAIL(&flow_lists->l2_tunnel_list,
+				&l2_tn_filter_ptr->base, entries);
 			flow->rule = l2_tn_filter_ptr;
 			flow->filter_type = RTE_ETH_FILTER_L2_TUNNEL;
@@ -3288,6 +3255,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 			ixgbe_rss_conf_init(&rss_filter_ptr->filter_info,
 					    &rss_conf.conf);
-			TAILQ_INSERT_TAIL(&filter_rss_list,
-				rss_filter_ptr, entries);
+			TAILQ_INSERT_TAIL(&flow_lists->rss_list,
+				&rss_filter_ptr->base, entries);
 			flow->rule = rss_filter_ptr;
 			flow->filter_type = RTE_ETH_FILTER_HASH;
@@ -3297,6 +3264,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
 
 out:
-	TAILQ_REMOVE(&ixgbe_flow_list,
-		ixgbe_flow_mem_ptr, entries);
+	TAILQ_REMOVE(&flow_lists->flow_list,
+		&ixgbe_flow_mem_ptr->base, entries);
 	rte_flow_error_set(error, -ret,
 			   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
@@ -3383,9 +3350,25 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 	struct ixgbe_eth_l2_tunnel_conf_ele *l2_tn_filter_ptr;
 	struct ixgbe_fdir_rule_ele *fdir_rule_ptr;
-	struct ixgbe_flow_mem *ixgbe_flow_mem_ptr;
+	struct ixgbe_filter_ele_base *flow_mem_base;
 	struct ixgbe_hw_fdir_info *fdir_info =
 		IXGBE_DEV_PRIVATE_TO_FDIR_INFO(dev->data->dev_private);
+	struct ixgbe_flow_lists *flow_lists =
+		IXGBE_DEV_PRIVATE_TO_FLOW_LISTS(dev->data->dev_private);
 	struct ixgbe_rss_conf_ele *rss_filter_ptr;
 
+	/* Validate ownership before touching HW/SW state. */
+	TAILQ_FOREACH(flow_mem_base, &flow_lists->flow_list, entries) {
+		struct ixgbe_flow_mem *ixgbe_flow_mem_ptr =
+			(struct ixgbe_flow_mem *)flow_mem_base;
+
+		if (ixgbe_flow_mem_ptr->flow == pmd_flow)
+			break;
+	}
+	if (flow_mem_base == NULL) {
+		return rte_flow_error_set(error, EINVAL,
+				RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+				"Flow not found for this port");
+	}
+
 	/* Special case for SECURITY flows */
 	if (flow->is_security) {
@@ -3403,6 +3386,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 		ret = ixgbe_add_del_ntuple_filter(dev, &ntuple_filter, FALSE);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_ntuple_list,
-			ntuple_filter_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->ntuple_list,
+				&ntuple_filter_ptr->base, entries);
 			rte_free(ntuple_filter_ptr);
 		}
@@ -3417,6 +3400,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 				&ethertype_filter, FALSE);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_ethertype_list,
-				ethertype_filter_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->ethertype_list,
+				&ethertype_filter_ptr->base, entries);
 			rte_free(ethertype_filter_ptr);
 		}
@@ -3430,6 +3413,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 		ret = ixgbe_syn_filter_set(dev, &syn_filter, FALSE);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_syn_list,
-				syn_filter_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->syn_list,
+				&syn_filter_ptr->base, entries);
 			rte_free(syn_filter_ptr);
 		}
@@ -3442,8 +3425,8 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 		ret = ixgbe_fdir_filter_program(dev, &fdir_rule, TRUE, FALSE);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_fdir_list,
-				fdir_rule_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->fdir_list,
+				&fdir_rule_ptr->base, entries);
 			rte_free(fdir_rule_ptr);
-			if (TAILQ_EMPTY(&filter_fdir_list))
+			if (TAILQ_EMPTY(&flow_lists->fdir_list))
 				fdir_info->mask_added = false;
 		}
@@ -3456,6 +3439,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 		ret = ixgbe_dev_l2_tunnel_filter_del(dev, &l2_tn_filter);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_l2_tunnel_list,
-				l2_tn_filter_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->l2_tunnel_list,
+				&l2_tn_filter_ptr->base, entries);
 			rte_free(l2_tn_filter_ptr);
 		}
@@ -3467,6 +3450,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 					&rss_filter_ptr->filter_info, FALSE);
 		if (!ret) {
-			TAILQ_REMOVE(&filter_rss_list,
-				rss_filter_ptr, entries);
+			TAILQ_REMOVE(&flow_lists->rss_list,
+				&rss_filter_ptr->base, entries);
 			rte_free(rss_filter_ptr);
 		}
@@ -3487,12 +3470,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
 
 free:
-	TAILQ_FOREACH(ixgbe_flow_mem_ptr, &ixgbe_flow_list, entries) {
-		if (ixgbe_flow_mem_ptr->flow == pmd_flow) {
-			TAILQ_REMOVE(&ixgbe_flow_list,
-				ixgbe_flow_mem_ptr, entries);
-			rte_free(ixgbe_flow_mem_ptr);
-			break;
-		}
-	}
+	TAILQ_REMOVE(&flow_lists->flow_list, flow_mem_base, entries);
+	rte_free(flow_mem_base);
 	rte_free(flow);
 
@@ -3527,5 +3504,5 @@ ixgbe_flow_flush(struct rte_eth_dev *dev,
 	ixgbe_clear_rss_filter(dev);
 
-	ixgbe_filterlist_flush();
+	ixgbe_filterlist_flush(dev);
 
 	return 0;
-- 
2.55.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-07-23 17:57:59.873314044 +0100
+++ 0042-net-ixgbe-fix-flows-not-being-scoped-to-port.patch	2026-07-23 17:57:58.653918603 +0100
@@ -1 +1 @@
-From 8494070f4f587b11c0578fc0408017794285993d Mon Sep 17 00:00:00 2001
+From eb5c7cb55191b90440eb1c48264603591e8e2963 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 8494070f4f587b11c0578fc0408017794285993d ]
+
@@ -14 +15,0 @@
-Cc: stable at dpdk.org
@@ -21,2 +22,2 @@
- drivers/net/intel/ixgbe/ixgbe_flow.c   | 247 +++++++++++--------------
- 3 files changed, 126 insertions(+), 146 deletions(-)
+ drivers/net/intel/ixgbe/ixgbe_flow.c   | 223 +++++++++++--------------
+ 3 files changed, 121 insertions(+), 127 deletions(-)
@@ -25 +26 @@
-index 57d929cf2c..9454cbee0a 100644
+index 11500a923c..990257dc05 100644
@@ -28 +29 @@
-@@ -1335,5 +1335,5 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
+@@ -1339,5 +1339,5 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
@@ -35 +36 @@
-@@ -3138,5 +3138,5 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
+@@ -3144,5 +3144,5 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
@@ -43 +44 @@
-index 3f00896943..38d476d309 100644
+index 5dbd659941..2e1b94a483 100644
@@ -46 +47 @@
-@@ -456,4 +456,17 @@ struct ixgbe_tm_conf {
+@@ -470,4 +470,17 @@ struct ixgbe_tm_conf {
@@ -64 +65 @@
-@@ -477,4 +490,5 @@ struct ixgbe_adapter {
+@@ -491,4 +504,5 @@ struct ixgbe_adapter {
@@ -70 +71 @@
-@@ -561,4 +575,7 @@ uint16_t ixgbe_vf_representor_tx_burst(void *tx_queue, struct rte_mbuf **tx_pkts
+@@ -574,4 +588,7 @@ uint16_t ixgbe_vf_representor_tx_burst(void *tx_queue, struct rte_mbuf **tx_pkts
@@ -78 +79 @@
-@@ -691,6 +708,6 @@ int
+@@ -704,6 +721,6 @@ int
@@ -88 +89 @@
-index e40ece9755..c3abba4a90 100644
+index 6a7edc6377..630b1e9361 100644
@@ -91 +92 @@
-@@ -25,4 +25,5 @@
+@@ -24,4 +24,5 @@
@@ -97 +98 @@
-@@ -51,56 +52,44 @@
+@@ -49,56 +50,44 @@
@@ -165 +166 @@
-@@ -3015,74 +3004,50 @@ ixgbe_clear_rss_filter(struct rte_eth_dev *dev)
+@@ -2969,74 +2958,50 @@ ixgbe_clear_rss_filter(struct rte_eth_dev *dev)
@@ -277 +278 @@
-@@ -3118,4 +3083,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3072,4 +3037,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -284 +285 @@
-@@ -3133,6 +3100,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3087,6 +3054,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -292,2 +293,2 @@
- 	/**
-@@ -3161,6 +3128,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+ 	memset(&ntuple_filter, 0, sizeof(struct rte_eth_ntuple_filter));
+@@ -3116,6 +3083,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -302 +303 @@
-@@ -3187,6 +3154,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3142,6 +3109,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -311 +312 @@
-@@ -3211,6 +3178,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3166,6 +3133,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -320 +321 @@
-@@ -3274,6 +3241,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3229,6 +3196,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -329 +330 @@
-@@ -3311,6 +3278,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3266,6 +3233,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -338 +339 @@
-@@ -3333,6 +3300,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3288,6 +3255,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -347 +348 @@
-@@ -3342,6 +3309,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
+@@ -3297,6 +3264,6 @@ ixgbe_flow_create(struct rte_eth_dev *dev,
@@ -356 +357 @@
-@@ -3435,9 +3402,25 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3383,9 +3350,25 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -383 +384 @@
-@@ -3455,6 +3438,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3403,6 +3386,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -392 +393 @@
-@@ -3469,6 +3452,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3417,6 +3400,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -401 +402 @@
-@@ -3482,6 +3465,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3430,6 +3413,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -410 +411 @@
-@@ -3494,8 +3477,8 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3442,8 +3425,8 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -422 +423 @@
-@@ -3508,6 +3491,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3456,6 +3439,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -431 +432 @@
-@@ -3519,6 +3502,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3467,6 +3450,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -440 +441 @@
-@@ -3539,12 +3522,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3487,12 +3470,6 @@ ixgbe_flow_destroy(struct rte_eth_dev *dev,
@@ -455 +456 @@
-@@ -3579,5 +3556,5 @@ ixgbe_flow_flush(struct rte_eth_dev *dev,
+@@ -3527,5 +3504,5 @@ ixgbe_flow_flush(struct rte_eth_dev *dev,
@@ -462,40 +462,0 @@
-@@ -3640,20 +3617,5 @@ ixgbe_flow_rule_data(const struct rte_flow *flow)
- 		return NULL;
- 
--	switch (flow->filter_type) {
--	case RTE_ETH_FILTER_NTUPLE:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_ntuple_filter_ele)));
--	case RTE_ETH_FILTER_ETHERTYPE:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_ethertype_filter_ele)));
--	case RTE_ETH_FILTER_SYN:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_eth_syn_filter_ele)));
--	case RTE_ETH_FILTER_FDIR:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_fdir_rule_ele)));
--	case RTE_ETH_FILTER_L2_TUNNEL:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_eth_l2_tunnel_conf_ele)));
--	case RTE_ETH_FILTER_HASH:
--		return RTE_PTR_ADD(flow->rule, sizeof(TAILQ_ENTRY(ixgbe_rss_conf_ele)));
--	default:
--		return NULL;
--	}
-+	return RTE_PTR_ADD(flow->rule, sizeof(struct ixgbe_filter_ele_base));
- }
- 
-@@ -3685,13 +3647,14 @@ ixgbe_flow_dump_blob(FILE *file, const char *engine,
- 
- static int
--ixgbe_flow_dev_dump(struct rte_eth_dev *dev __rte_unused,
-+ixgbe_flow_dev_dump(struct rte_eth_dev *dev,
- 		    struct rte_flow *flow,
- 		    FILE *file,
- 		    struct rte_flow_error *error)
- {
--	struct ixgbe_flow_mem *flow_mem_base;
-+	struct ixgbe_adapter *ad = IXGBE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
-+	struct ixgbe_filter_ele_base *flow_mem_base;
- 	bool found = false;
- 
--	TAILQ_FOREACH(flow_mem_base, &ixgbe_flow_list, entries) {
-+	TAILQ_FOREACH(flow_mem_base, &ad->flow_lists.flow_list, entries) {
- 		struct ixgbe_flow_mem *ixgbe_flow_mem_ptr =
- 			(struct ixgbe_flow_mem *)flow_mem_base;



More information about the stable mailing list