From: Zhang Tengfei <zhtfdev@gmail.com>
To: dev@dpdk.org
Cc: stephen@networkplumber.org, Zhang Tengfei <zhtfdev@gmail.com>,
jiawenwu@trustnetic.com, zaiyuwang@trustnetic.com,
stable@dpdk.org
Subject: [PATCH 2/3] net/txgbe: do not enable flow director on flow validate
Date: Tue, 13 Oct 2026 22:00:18 +0800 [thread overview]
Message-ID: <c5100ed9a24b032f070da660ec4ecb59469ef504.1791898970.git.zhtfdev@gmail.com> (raw)
In-Reply-To: <cover.1791898970.git.zhtfdev@gmail.com>
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.
Fixes: 5007ac13189d ("ethdev: remove deprecated Flow Director configuration")
Cc: stable@dpdk.org
Signed-off-by: Zhang Tengfei <zhtfdev@gmail.com>
---
drivers/net/txgbe/txgbe_flow.c | 55 +++++++++++++++++-----------------
1 file changed, 27 insertions(+), 28 deletions(-)
diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c
index f8d8c6850d..f2fc589a10 100644
--- a/drivers/net/txgbe/txgbe_flow.c
+++ b/drivers/net/txgbe/txgbe_flow.c
@@ -2966,16 +2966,9 @@ txgbe_parse_fdir_filter(struct rte_eth_dev *dev,
if (!txgbe_is_pf(TXGBE_DEV_HW(dev)))
return ret;
- 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 (fdir_conf->mode != RTE_FDIR_MODE_NONE &&
+ fdir_conf->mode != rule->mode)
return -ENOTSUP;
- }
if (rule->queue >= dev->data->nb_rx_queues)
return -ENOTSUP;
@@ -3208,17 +3201,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) {
@@ -3360,6 +3355,16 @@ txgbe_flow_create(struct rte_eth_dev *dev,
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) {
@@ -3381,10 +3386,8 @@ txgbe_flow_create(struct rte_eth_dev *dev,
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;
@@ -3397,9 +3400,8 @@ txgbe_flow_create(struct rte_eth_dev *dev,
&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 !=
@@ -3408,25 +3410,16 @@ txgbe_flow_create(struct rte_eth_dev *dev,
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,
@@ -3486,6 +3479,12 @@ txgbe_flow_create(struct rte_eth_dev *dev,
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.53.0
next prev parent reply other threads:[~2026-10-13 14:01 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 14:00 [PATCH 0/3] net/txgbe: fix FDIR Rx packet buffer handling Zhang Tengfei
2026-10-13 14:00 ` [PATCH 1/3] net/txgbe: fix Rx packet buffer size with flow director Zhang Tengfei
2026-10-13 14:00 ` Zhang Tengfei [this message]
2026-10-13 14:00 ` [PATCH 3/3] net/txgbe: disable flow director when no rule is left Zhang Tengfei
2026-10-13 14:45 ` [PATCH 0/3] net/txgbe: fix FDIR Rx packet buffer handling Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c5100ed9a24b032f070da660ec4ecb59469ef504.1791898970.git.zhtfdev@gmail.com \
--to=zhtfdev@gmail.com \
--cc=dev@dpdk.org \
--cc=jiawenwu@trustnetic.com \
--cc=stable@dpdk.org \
--cc=stephen@networkplumber.org \
--cc=zaiyuwang@trustnetic.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox