patch 'net/iavf: change no-poll flag to atomic' has been queued to stable release 24.11.9

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue Oct 27 12:49:34 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 10/29/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/bb8cf215ee34efbc869b94fa4cdd07a4c57009d3

Thanks.

Luca Boccassi

---
>From bb8cf215ee34efbc869b94fa4cdd07a4c57009d3 Mon Sep 17 00:00:00 2001
From: Anurag Mandal <anurag.mandal at intel.com>
Date: Tue, 18 Aug 2026 04:57:29 +0000
Subject: [PATCH] net/iavf: change no-poll flag to atomic

[ upstream commit 282e6820d6bef371a3775f645b28cdeeac16d2fa ]

The no_poll gate that pauses the Rx/Tx data path during reset and
link-down was a plain bool written on the control path and read on
the data-plane lcores without synchronization, allowing stale reads
that either keep dropping traffic or trigger spurious reset detection.

Made no_poll an RTE_ATOMIC(bool) and access it with release stores and
acquire loads so data-plane lcores reliably observe gate changes.

Fixes: 5b3124a0a6ef ("net/iavf: support no polling when link down")

Signed-off-by: Anurag Mandal <anurag.mandal at intel.com>
Acked-by: Ciara Loftus <ciara.loftus at intel.com>
---
 drivers/net/iavf/iavf.h        | 2 +-
 drivers/net/iavf/iavf_ethdev.c | 6 +++++-
 drivers/net/iavf/iavf_rxtx.c   | 8 ++++++--
 drivers/net/iavf/iavf_vchnl.c  | 4 +++-
 4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index eb26a267316..0b9153ddecb 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -381,7 +381,7 @@ struct iavf_adapter {
 	alignas(RTE_CACHE_LINE_MIN_SIZE) uint32_t ptype_tbl[IAVF_MAX_PKT_TYPE];
 	bool stopped;
 	bool closed;
-	bool no_poll;
+	RTE_ATOMIC(bool) no_poll;
 	enum iavf_rx_burst_type rx_burst_type;
 	enum iavf_tx_burst_type tx_burst_type;
 	uint16_t fdir_ref_cnt;
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index d4683e861c1..8a589fc5579 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -3219,9 +3219,13 @@ void
 iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change)
 {
 	struct iavf_info *vf = &adapter->vf;
+	bool no_poll;
 
-	adapter->no_poll = (link_change & !vf->link_up) ||
+	no_poll = (link_change & !vf->link_up) ||
 		vf->vf_reset || vf->in_reset_recovery;
+
+	rte_atomic_store_explicit(&adapter->no_poll, no_poll,
+				  rte_memory_order_release);
 }
 
 static int
diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index cccaf418a33..5343bf02c18 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -3777,7 +3777,9 @@ iavf_recv_pkts_no_poll(void *rx_queue, struct rte_mbuf **rx_pkts,
 	struct iavf_rx_queue *rxq = rx_queue;
 	enum iavf_rx_burst_type rx_burst_type;
 
-	if (!rxq->vsi || rxq->vsi->adapter->no_poll)
+	if (!rxq->vsi ||
+	    rte_atomic_load_explicit(&rxq->vsi->adapter->no_poll,
+				     rte_memory_order_acquire))
 		return 0;
 
 	rx_burst_type = rxq->vsi->adapter->rx_burst_type;
@@ -3793,7 +3795,9 @@ iavf_xmit_pkts_no_poll(void *tx_queue, struct rte_mbuf **tx_pkts,
 	struct iavf_tx_queue *txq = tx_queue;
 	enum iavf_tx_burst_type tx_burst_type;
 
-	if (!txq->vsi || txq->vsi->adapter->no_poll)
+	if (!txq->vsi ||
+	    rte_atomic_load_explicit(&txq->vsi->adapter->no_poll,
+				     rte_memory_order_acquire))
 		return 0;
 
 	tx_burst_type = txq->vsi->adapter->tx_burst_type;
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index b90966808d3..e71f260aae8 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -268,7 +268,9 @@ iavf_handle_link_change_event(struct rte_eth_dev *dev,
 	if (adapter->devargs.no_poll_on_link_down) {
 		iavf_set_no_poll(adapter, true);
 		PMD_DRV_LOG(DEBUG, "VF no poll turned %s",
-			    adapter->no_poll ? "on" : "off");
+			    rte_atomic_load_explicit(&adapter->no_poll,
+						     rte_memory_order_relaxed) ?
+						     "on" : "off");
 	}
 
 	/* Retry a dev_start deferred by reset recovery, before the LSC post. */
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-10-27 11:43:56.800292427 +0000
+++ 0080-net-iavf-change-no-poll-flag-to-atomic.patch	2026-10-27 11:43:53.602062172 +0000
@@ -1 +1 @@
-From 282e6820d6bef371a3775f645b28cdeeac16d2fa Mon Sep 17 00:00:00 2001
+From bb8cf215ee34efbc869b94fa4cdd07a4c57009d3 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 282e6820d6bef371a3775f645b28cdeeac16d2fa ]
+
@@ -15 +16,0 @@
-Cc: stable at dpdk.org
@@ -20,4 +21,4 @@
- drivers/net/intel/iavf/iavf.h        | 2 +-
- drivers/net/intel/iavf/iavf_ethdev.c | 6 +++++-
- drivers/net/intel/iavf/iavf_rxtx.c   | 8 ++++++--
- drivers/net/intel/iavf/iavf_vchnl.c  | 4 +++-
+ drivers/net/iavf/iavf.h        | 2 +-
+ drivers/net/iavf/iavf_ethdev.c | 6 +++++-
+ drivers/net/iavf/iavf_rxtx.c   | 8 ++++++--
+ drivers/net/iavf/iavf_vchnl.c  | 4 +++-
@@ -26,5 +27,5 @@
-diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
-index a811a8d2d4..4a0ba44164 100644
---- a/drivers/net/intel/iavf/iavf.h
-+++ b/drivers/net/intel/iavf/iavf.h
-@@ -391,7 +391,7 @@ struct iavf_adapter {
+diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
+index eb26a267316..0b9153ddecb 100644
+--- a/drivers/net/iavf/iavf.h
++++ b/drivers/net/iavf/iavf.h
+@@ -381,7 +381,7 @@ struct iavf_adapter {
@@ -36,2 +37,2 @@
- 	enum iavf_rx_func_type rx_func_type;
- 	enum iavf_tx_func_type tx_func_type;
+ 	enum iavf_rx_burst_type rx_burst_type;
+ 	enum iavf_tx_burst_type tx_burst_type;
@@ -39,5 +40,5 @@
-diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
-index 742fd22551..3a52038e09 100644
---- a/drivers/net/intel/iavf/iavf_ethdev.c
-+++ b/drivers/net/intel/iavf/iavf_ethdev.c
-@@ -3616,9 +3616,13 @@ void
+diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
+index d4683e861c1..8a589fc5579 100644
+--- a/drivers/net/iavf/iavf_ethdev.c
++++ b/drivers/net/iavf/iavf_ethdev.c
+@@ -3219,9 +3219,13 @@ void
@@ -58,11 +59,11 @@
-diff --git a/drivers/net/intel/iavf/iavf_rxtx.c b/drivers/net/intel/iavf/iavf_rxtx.c
-index c553d1623d..d65a518f8e 100644
---- a/drivers/net/intel/iavf/iavf_rxtx.c
-+++ b/drivers/net/intel/iavf/iavf_rxtx.c
-@@ -3724,7 +3724,9 @@ iavf_recv_pkts_no_poll(void *rx_queue, struct rte_mbuf **rx_pkts,
- 	struct ci_rx_queue *rxq = rx_queue;
- 	enum iavf_rx_func_type rx_func_type;
- 
--	if (!rxq->iavf_vsi || rxq->iavf_vsi->adapter->no_poll)
-+	if (!rxq->iavf_vsi ||
-+	    rte_atomic_load_explicit(&rxq->iavf_vsi->adapter->no_poll,
+diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
+index cccaf418a33..5343bf02c18 100644
+--- a/drivers/net/iavf/iavf_rxtx.c
++++ b/drivers/net/iavf/iavf_rxtx.c
+@@ -3777,7 +3777,9 @@ iavf_recv_pkts_no_poll(void *rx_queue, struct rte_mbuf **rx_pkts,
+ 	struct iavf_rx_queue *rxq = rx_queue;
+ 	enum iavf_rx_burst_type rx_burst_type;
+ 
+-	if (!rxq->vsi || rxq->vsi->adapter->no_poll)
++	if (!rxq->vsi ||
++	    rte_atomic_load_explicit(&rxq->vsi->adapter->no_poll,
@@ -72,8 +73,8 @@
- 	rx_func_type = rxq->iavf_vsi->adapter->rx_func_type;
-@@ -3740,7 +3742,9 @@ iavf_xmit_pkts_no_poll(void *tx_queue, struct rte_mbuf **tx_pkts,
- 	struct ci_tx_queue *txq = tx_queue;
- 	enum iavf_tx_func_type tx_func_type;
- 
--	if (!txq->iavf_vsi || txq->iavf_vsi->adapter->no_poll)
-+	if (!txq->iavf_vsi ||
-+	    rte_atomic_load_explicit(&txq->iavf_vsi->adapter->no_poll,
+ 	rx_burst_type = rxq->vsi->adapter->rx_burst_type;
+@@ -3793,7 +3795,9 @@ iavf_xmit_pkts_no_poll(void *tx_queue, struct rte_mbuf **tx_pkts,
+ 	struct iavf_tx_queue *txq = tx_queue;
+ 	enum iavf_tx_burst_type tx_burst_type;
+ 
+-	if (!txq->vsi || txq->vsi->adapter->no_poll)
++	if (!txq->vsi ||
++	    rte_atomic_load_explicit(&txq->vsi->adapter->no_poll,
@@ -83,5 +84,5 @@
- 	tx_func_type = txq->iavf_vsi->adapter->tx_func_type;
-diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
-index 565e81e176..43b5f29cad 100644
---- a/drivers/net/intel/iavf/iavf_vchnl.c
-+++ b/drivers/net/intel/iavf/iavf_vchnl.c
+ 	tx_burst_type = txq->vsi->adapter->tx_burst_type;
+diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
+index b90966808d3..e71f260aae8 100644
+--- a/drivers/net/iavf/iavf_vchnl.c
++++ b/drivers/net/iavf/iavf_vchnl.c


More information about the stable mailing list