patch 'net/txgbe: disable flow director when no rule is left' has been queued to stable release 24.11.9
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Thu Nov 5 17:43:05 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/c9b36194b0e5b5492766a67d6ac4c3a76e798f7d
Thanks.
Luca Boccassi
---
>From c9b36194b0e5b5492766a67d6ac4c3a76e798f7d Mon Sep 17 00:00:00 2001
From: Zhang Tengfei <zhtfdev at gmail.com>
Date: Thu, 15 Oct 2026 00:39:24 +0800
Subject: [PATCH] net/txgbe: disable flow director when no rule is left
[ upstream commit 78fce8c8fe657390491a398b1374ce08e8c03c13 ]
When the last FDIR rule is destroyed, on flush, or when enabling
FDIR fails, the FDIR mode is reset to none, but Flow Director is
left enabled and the Rx packet buffer stays reduced.
Disable Flow Director and restore the Rx packet buffer size in
these cases, and when the first rule fails after FDIR was enabled.
Fixes: ea230dda16ad ("net/txgbe: configure flow director filter")
Fixes: 26048c25942f ("net/txgbe: fix FDIR mode clearing")
Signed-off-by: Zhang Tengfei <zhtfdev at gmail.com>
---
drivers/net/txgbe/base/txgbe_hw.c | 6 +++++-
drivers/net/txgbe/base/txgbe_hw.h | 1 +
drivers/net/txgbe/txgbe_ethdev.h | 1 +
drivers/net/txgbe/txgbe_fdir.c | 31 +++++++++++++++++++++++++++----
drivers/net/txgbe/txgbe_flow.c | 7 ++++++-
5 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/drivers/net/txgbe/base/txgbe_hw.c b/drivers/net/txgbe/base/txgbe_hw.c
index fe82b881bf4..4671ee49aa0 100644
--- a/drivers/net/txgbe/base/txgbe_hw.c
+++ b/drivers/net/txgbe/base/txgbe_hw.c
@@ -2491,6 +2491,11 @@ s32 txgbe_init_shared_code(struct txgbe_hw *hw)
return status;
}
+bool txgbe_is_pf(struct txgbe_hw *hw)
+{
+ return hw->mac.type == txgbe_mac_raptor;
+}
+
/**
* txgbe_set_mac_type - Sets MAC type
* @hw: pointer to the HW structure
@@ -3837,4 +3842,3 @@ s32 txgbe_reset_pipeline_raptor(struct txgbe_hw *hw)
return err;
}
-
diff --git a/drivers/net/txgbe/base/txgbe_hw.h b/drivers/net/txgbe/base/txgbe_hw.h
index 1ed2892f610..7a450208249 100644
--- a/drivers/net/txgbe/base/txgbe_hw.h
+++ b/drivers/net/txgbe/base/txgbe_hw.h
@@ -85,6 +85,7 @@ void txgbe_set_mta(struct txgbe_hw *hw, u8 *mc_addr);
s32 txgbe_negotiate_fc(struct txgbe_hw *hw, u32 adv_reg, u32 lp_reg,
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
s32 txgbe_init_shared_code(struct txgbe_hw *hw);
+bool txgbe_is_pf(struct txgbe_hw *hw);
s32 txgbe_set_mac_type(struct txgbe_hw *hw);
s32 txgbe_init_ops_pf(struct txgbe_hw *hw);
s32 txgbe_get_link_capabilities_raptor(struct txgbe_hw *hw,
diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h
index 33d72e68d56..ad01dfc1b25 100644
--- a/drivers/net/txgbe/txgbe_ethdev.h
+++ b/drivers/net/txgbe/txgbe_ethdev.h
@@ -556,6 +556,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction,
* Flow director function prototypes
*/
int txgbe_fdir_configure(struct rte_eth_dev *dev);
+void txgbe_fdir_disable(struct txgbe_hw *hw);
int txgbe_fdir_set_input_mask(struct rte_eth_dev *dev);
uint16_t txgbe_fdir_get_flex_base(struct txgbe_fdir_rule *rule);
int txgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev,
diff --git a/drivers/net/txgbe/txgbe_fdir.c b/drivers/net/txgbe/txgbe_fdir.c
index d77815af7c8..411acdf6137 100644
--- a/drivers/net/txgbe/txgbe_fdir.c
+++ b/drivers/net/txgbe/txgbe_fdir.c
@@ -368,6 +368,18 @@ txgbe_set_fdir_flex_conf(struct rte_eth_dev *dev, uint32_t flex)
return 0;
}
+void
+txgbe_fdir_disable(struct txgbe_hw *hw)
+{
+ int i;
+
+ wr32(hw, TXGBE_FDIRCTL, 0);
+ wr32(hw, TXGBE_PBRXSIZE(0), hw->mac.rx_pb_size << 10);
+ for (i = 1; i < 8; i++)
+ wr32(hw, TXGBE_PBRXSIZE(i), 0);
+ txgbe_flush(hw);
+}
+
int
txgbe_fdir_configure(struct rte_eth_dev *dev)
{
@@ -408,27 +420,31 @@ txgbe_fdir_configure(struct rte_eth_dev *dev)
err = txgbe_fdir_store_input_mask(dev);
if (err < 0) {
PMD_INIT_LOG(ERR, " Error on setting FD mask");
- return err;
+ goto error;
}
err = txgbe_fdir_set_input_mask(dev);
if (err < 0) {
PMD_INIT_LOG(ERR, " Error on setting FD mask");
- return err;
+ goto error;
}
err = txgbe_set_fdir_flex_conf(dev, flex);
if (err < 0) {
PMD_INIT_LOG(ERR, " Error on setting FD flexible arguments.");
- return err;
+ goto error;
}
err = txgbe_fdir_enable(hw, fdirctrl);
if (err < 0) {
PMD_INIT_LOG(ERR, " Error on enabling FD.");
- return err;
+ goto error;
}
return 0;
+
+error:
+ txgbe_fdir_disable(hw);
+ return err;
}
/*
@@ -992,12 +1008,16 @@ txgbe_fdir_filter_restore(struct rte_eth_dev *dev)
int
txgbe_clear_all_fdir_filter(struct rte_eth_dev *dev)
{
+ struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
struct rte_eth_fdir_conf *fdir_conf = TXGBE_DEV_FDIR_CONF(dev);
struct txgbe_hw_fdir_info *fdir_info = TXGBE_DEV_FDIR(dev);
struct txgbe_fdir_filter *fdir_filter;
struct txgbe_fdir_filter *filter_flag;
+ bool fdir_enabled;
int ret = 0;
+ fdir_enabled = fdir_conf->mode != RTE_FDIR_MODE_NONE;
+
/* flush flow director */
rte_hash_reset(fdir_info->hash_handle);
memset(fdir_info->hash_map, 0,
@@ -1015,5 +1035,8 @@ txgbe_clear_all_fdir_filter(struct rte_eth_dev *dev)
if (filter_flag != NULL)
ret = txgbe_fdir_flush(dev);
+ if (fdir_enabled && txgbe_is_pf(hw))
+ txgbe_fdir_disable(hw);
+
return ret;
}
diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c
index 5032c8d836e..4731bdf9ef8 100644
--- a/drivers/net/txgbe/txgbe_flow.c
+++ b/drivers/net/txgbe/txgbe_flow.c
@@ -3434,8 +3434,10 @@ fdir_out:
rte_free(fdir_rule_ptr);
if (first_mask)
fdir_info->mask_added = FALSE;
- if (fdir_configured)
+ if (fdir_configured) {
+ txgbe_fdir_disable(TXGBE_DEV_HW(dev));
fdir_conf->mode = RTE_FDIR_MODE_NONE;
+ }
out:
TAILQ_REMOVE(&txgbe_flow_list,
txgbe_flow_mem_ptr, entries);
@@ -3585,6 +3587,9 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
fdir_info->mask_added = false;
fdir_info->flex_relative = false;
fdir_info->flex_bytes_offset = 0;
+ if (fdir_conf->mode != RTE_FDIR_MODE_NONE &&
+ txgbe_is_pf(TXGBE_DEV_HW(dev)))
+ txgbe_fdir_disable(TXGBE_DEV_HW(dev));
fdir_conf->mode = RTE_FDIR_MODE_NONE;
}
}
--
2.47.3
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-11-05 16:42:48.667103645 +0000
+++ 0098-net-txgbe-disable-flow-director-when-no-rule-is-left.patch 2026-11-05 16:42:45.037064252 +0000
@@ -1 +1 @@
-From 78fce8c8fe657390491a398b1374ce08e8c03c13 Mon Sep 17 00:00:00 2001
+From c9b36194b0e5b5492766a67d6ac4c3a76e798f7d Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 78fce8c8fe657390491a398b1374ce08e8c03c13 ]
+
@@ -15 +16,0 @@
-Cc: stable at dpdk.org
@@ -19,4 +20,6 @@
- drivers/net/txgbe/txgbe_ethdev.h | 1 +
- drivers/net/txgbe/txgbe_fdir.c | 31 +++++++++++++++++++++++++++----
- drivers/net/txgbe/txgbe_flow.c | 7 ++++++-
- 3 files changed, 34 insertions(+), 5 deletions(-)
+ drivers/net/txgbe/base/txgbe_hw.c | 6 +++++-
+ drivers/net/txgbe/base/txgbe_hw.h | 1 +
+ drivers/net/txgbe/txgbe_ethdev.h | 1 +
+ drivers/net/txgbe/txgbe_fdir.c | 31 +++++++++++++++++++++++++++----
+ drivers/net/txgbe/txgbe_flow.c | 7 ++++++-
+ 5 files changed, 40 insertions(+), 6 deletions(-)
@@ -23,0 +27,33 @@
+diff --git a/drivers/net/txgbe/base/txgbe_hw.c b/drivers/net/txgbe/base/txgbe_hw.c
+index fe82b881bf4..4671ee49aa0 100644
+--- a/drivers/net/txgbe/base/txgbe_hw.c
++++ b/drivers/net/txgbe/base/txgbe_hw.c
+@@ -2491,6 +2491,11 @@ s32 txgbe_init_shared_code(struct txgbe_hw *hw)
+ return status;
+ }
+
++bool txgbe_is_pf(struct txgbe_hw *hw)
++{
++ return hw->mac.type == txgbe_mac_raptor;
++}
++
+ /**
+ * txgbe_set_mac_type - Sets MAC type
+ * @hw: pointer to the HW structure
+@@ -3837,4 +3842,3 @@ s32 txgbe_reset_pipeline_raptor(struct txgbe_hw *hw)
+
+ return err;
+ }
+-
+diff --git a/drivers/net/txgbe/base/txgbe_hw.h b/drivers/net/txgbe/base/txgbe_hw.h
+index 1ed2892f610..7a450208249 100644
+--- a/drivers/net/txgbe/base/txgbe_hw.h
++++ b/drivers/net/txgbe/base/txgbe_hw.h
+@@ -85,6 +85,7 @@ void txgbe_set_mta(struct txgbe_hw *hw, u8 *mc_addr);
+ s32 txgbe_negotiate_fc(struct txgbe_hw *hw, u32 adv_reg, u32 lp_reg,
+ u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
+ s32 txgbe_init_shared_code(struct txgbe_hw *hw);
++bool txgbe_is_pf(struct txgbe_hw *hw);
+ s32 txgbe_set_mac_type(struct txgbe_hw *hw);
+ s32 txgbe_init_ops_pf(struct txgbe_hw *hw);
+ s32 txgbe_get_link_capabilities_raptor(struct txgbe_hw *hw,
@@ -25 +61 @@
-index a617b70e3c..05c20fd58c 100644
+index 33d72e68d56..ad01dfc1b25 100644
@@ -28 +64 @@
-@@ -552,6 +552,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction,
+@@ -556,6 +556,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction,
@@ -37 +73 @@
-index cee38a42b8..8e397c995c 100644
+index d77815af7c8..411acdf6137 100644
@@ -95 +131 @@
-@@ -1138,12 +1154,16 @@ txgbe_fdir_filter_restore(struct rte_eth_dev *dev)
+@@ -992,12 +1008,16 @@ txgbe_fdir_filter_restore(struct rte_eth_dev *dev)
@@ -112 +148 @@
-@@ -1161,5 +1181,8 @@ txgbe_clear_all_fdir_filter(struct rte_eth_dev *dev)
+@@ -1015,5 +1035,8 @@ txgbe_clear_all_fdir_filter(struct rte_eth_dev *dev)
@@ -122 +158 @@
-index 0b7ce3aa2d..7016fb29d2 100644
+index 5032c8d836e..4731bdf9ef8 100644
@@ -125 +161 @@
-@@ -3487,8 +3487,10 @@ fdir_out:
+@@ -3434,8 +3434,10 @@ fdir_out:
@@ -137 +173 @@
-@@ -3641,6 +3643,9 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
+@@ -3585,6 +3587,9 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
More information about the stable
mailing list