patch 'net/iavf: defer device start when PF VSI not ready' has been queued to stable release 24.11.9

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue Oct 27 12:49:33 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/bb95797a4fbe9516f7a7e14e532158522e237126

Thanks.

Luca Boccassi

---
>From bb95797a4fbe9516f7a7e14e532158522e237126 Mon Sep 17 00:00:00 2001
From: Anurag Mandal <anurag.mandal at intel.com>
Date: Tue, 18 Aug 2026 04:57:27 +0000
Subject: [PATCH] net/iavf: defer device start when PF VSI not ready

[ upstream commit 9aac2219dc2afd9dd740918944615b5880b0da6e ]

During reset recovery iavf_dev_start() might fail (typically -EIO from
VIRTCHNL_OP_CONFIG_VSI_QUEUES) because the PF VSI is not yet active,
leaving the VF down and requiring manual intervention to recover.

Added a start_pending flag: when device start fails during recovery,
defer it instead of erroring out and resume it from newly added
iavf_resume_pending_start() on the next link-up event, so the VF comes
back automatically.

Fixes: 3e6a5d2d310a ("net/iavf: add devargs to enable VF auto-reset")

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 | 60 ++++++++++++++++++++++++++++++++--
 drivers/net/iavf/iavf_vchnl.c  |  3 ++
 3 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 89249416b6b..eb26a267316 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -286,6 +286,7 @@ struct iavf_info {
 	bool in_reset_recovery;
 	bool reset_pending;
 	bool pf_reset_in_progress;
+	bool start_pending;
 
 	uint32_t ptp_caps;
 	rte_spinlock_t phc_time_aq_lock;
@@ -567,4 +568,5 @@ void iavf_dev_watchdog_enable(struct iavf_adapter *adapter);
 void iavf_dev_watchdog_disable(struct iavf_adapter *adapter);
 void iavf_handle_hw_reset(struct rte_eth_dev *dev);
 void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change);
+void iavf_resume_pending_start(struct rte_eth_dev *dev);
 #endif /* _IAVF_ETHDEV_H_ */
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 19cc2186dd0..d4683e861c1 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -1084,6 +1084,9 @@ iavf_dev_start(struct rte_eth_dev *dev)
 		goto error;
 	}
 
+	/* An explicit start supersedes any pending deferred start */
+	vf->start_pending = false;
+
 	return 0;
 
 error:
@@ -1120,6 +1123,9 @@ iavf_dev_stop(struct rte_eth_dev *dev)
 	adapter->stopped = 1;
 	dev->data->dev_started = 0;
 
+	/* An explicit stop cancels any pending deferred start */
+	vf->start_pending = false;
+
 	return 0;
 }
 
@@ -3169,6 +3175,7 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev)
 
 	vf->in_reset_recovery = true;
 	vf->pf_reset_in_progress = true;
+	vf->start_pending = false;
 	iavf_set_no_poll(adapter, false);
 
 	ret = iavf_dev_reset(dev);
@@ -3184,10 +3191,18 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev)
 
 	/* start the device */
 	ret = iavf_dev_start(dev);
-	if (ret)
-		goto error;
+	if (ret == 0) {
+		dev->data->dev_started = 1;
+	} else {
+		PMD_DRV_LOG(WARNING,
+			    "dev_start failed during reset recovery (rc=%d);"
+			    "deferring to next link-up event",
+			    ret);
+		vf->start_pending = true;
+		dev->data->dev_started = 0;
+		ret = 0;
+	}
 
-	dev->data->dev_started = 1;
 	goto exit;
 
 error:
@@ -3271,6 +3286,45 @@ static struct rte_pci_driver rte_iavf_pmd = {
 	.remove = eth_iavf_pci_remove,
 };
 
+void
+iavf_resume_pending_start(struct rte_eth_dev *dev)
+{
+	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+	int ret;
+
+	if (!vf->start_pending)
+		return;
+
+	if (vf->vf_reset || vf->in_reset_recovery)
+		return;
+
+	/*
+	 * If the application has already (re)started the port itself, the
+	 * deferred start is stale, the application's action is honoured
+	 * and resume pending is dropped to avoid starting an
+	 * already-running port a second time.
+	 */
+	if (dev->data->dev_started) {
+		vf->start_pending = false;
+		return;
+	}
+
+	if (!vf->link_up)
+		return;
+
+	vf->start_pending = false;
+	PMD_DRV_LOG(DEBUG, "PF link back up; resuming deferred dev_start");
+	ret = iavf_dev_start(dev);
+	if (ret == 0) {
+		dev->data->dev_started = 1;
+	} else {
+		PMD_DRV_LOG(ERR,
+			    "deferred dev_start failed (ret=%d); will retry on next link-up",
+			    ret);
+		vf->start_pending = true;
+	}
+}
+
 RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index 8259273f45c..b90966808d3 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -271,6 +271,9 @@ iavf_handle_link_change_event(struct rte_eth_dev *dev,
 			    adapter->no_poll ? "on" : "off");
 	}
 
+	/* Retry a dev_start deferred by reset recovery, before the LSC post. */
+	iavf_resume_pending_start(dev);
+
 	iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_LSC, NULL, 0);
 
 	PMD_DRV_LOG(INFO, "Link status update:%s",
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-10-27 11:43:56.761533787 +0000
+++ 0079-net-iavf-defer-device-start-when-PF-VSI-not-ready.patch	2026-10-27 11:43:53.598062049 +0000
@@ -1 +1 @@
-From 9aac2219dc2afd9dd740918944615b5880b0da6e Mon Sep 17 00:00:00 2001
+From bb95797a4fbe9516f7a7e14e532158522e237126 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 9aac2219dc2afd9dd740918944615b5880b0da6e ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -21,10 +22,10 @@
- drivers/net/intel/iavf/iavf.h        |  2 +
- drivers/net/intel/iavf/iavf_ethdev.c | 61 ++++++++++++++++++++++++++--
- drivers/net/intel/iavf/iavf_vchnl.c  |  3 ++
- 3 files changed, 62 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
-index 6bf7121052..a811a8d2d4 100644
---- a/drivers/net/intel/iavf/iavf.h
-+++ b/drivers/net/intel/iavf/iavf.h
-@@ -293,6 +293,7 @@ struct iavf_info {
+ drivers/net/iavf/iavf.h        |  2 ++
+ drivers/net/iavf/iavf_ethdev.c | 60 ++++++++++++++++++++++++++++++++--
+ drivers/net/iavf/iavf_vchnl.c  |  3 ++
+ 3 files changed, 62 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
+index 89249416b6b..eb26a267316 100644
+--- a/drivers/net/iavf/iavf.h
++++ b/drivers/net/iavf/iavf.h
+@@ -286,6 +286,7 @@ struct iavf_info {
@@ -38 +39,3 @@
-@@ -532,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset);
+@@ -567,4 +568,5 @@ void iavf_dev_watchdog_enable(struct iavf_adapter *adapter);
+ void iavf_dev_watchdog_disable(struct iavf_adapter *adapter);
+ void iavf_handle_hw_reset(struct rte_eth_dev *dev);
@@ -40,2 +42,0 @@
- bool is_iavf_supported(struct rte_eth_dev *dev);
- void iavf_hash_uninit(struct iavf_adapter *ad);
@@ -44,7 +45,7 @@
-diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
-index 2c686d8802..742fd22551 100644
---- a/drivers/net/intel/iavf/iavf_ethdev.c
-+++ b/drivers/net/intel/iavf/iavf_ethdev.c
-@@ -1114,6 +1114,9 @@ iavf_dev_start(struct rte_eth_dev *dev)
- 
- 	iavf_phc_sync_alarm_start(dev);
+diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
+index 19cc2186dd0..d4683e861c1 100644
+--- a/drivers/net/iavf/iavf_ethdev.c
++++ b/drivers/net/iavf/iavf_ethdev.c
+@@ -1084,6 +1084,9 @@ iavf_dev_start(struct rte_eth_dev *dev)
+ 		goto error;
+ 	}
@@ -58 +59 @@
-@@ -1152,6 +1155,9 @@ iavf_dev_stop(struct rte_eth_dev *dev)
+@@ -1120,6 +1123,9 @@ iavf_dev_stop(struct rte_eth_dev *dev)
@@ -68 +69 @@
-@@ -3444,6 +3450,7 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset)
+@@ -3169,6 +3175,7 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev)
@@ -71 +72 @@
- 	vf->pf_reset_in_progress = !vf_initiated_reset;
+ 	vf->pf_reset_in_progress = true;
@@ -75,21 +76,2 @@
- 	/* Call the pre reset callback */
-@@ -3464,10 +3471,17 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset)
- 	if (!vf_initiated_reset || restart_device) {
- 		/* start the device */
- 		ret = iavf_dev_start(dev);
--		if (ret)
--			goto error;
--
--		dev->data->dev_started = 1;
-+		if (ret == 0) {
-+			dev->data->dev_started = 1;
-+		} else {
-+			PMD_DRV_LOG(WARNING,
-+				    "dev_start failed during reset recovery (rc=%d);"
-+				    "deferring to next link-up event",
-+				    ret);
-+			vf->start_pending = true;
-+			dev->data->dev_started = 0;
-+			ret = 0;
-+		}
- 	}
+ 	ret = iavf_dev_reset(dev);
+@@ -3184,10 +3191,18 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev)
@@ -97,4 +79,23 @@
- 	/* Restore settings after the reset */
-@@ -3674,6 +3688,45 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
- 	return !strcmp(dev->device->driver->name, rte_iavf_pmd.driver.name);
- }
+ 	/* start the device */
+ 	ret = iavf_dev_start(dev);
+-	if (ret)
+-		goto error;
++	if (ret == 0) {
++		dev->data->dev_started = 1;
++	} else {
++		PMD_DRV_LOG(WARNING,
++			    "dev_start failed during reset recovery (rc=%d);"
++			    "deferring to next link-up event",
++			    ret);
++		vf->start_pending = true;
++		dev->data->dev_started = 0;
++		ret = 0;
++	}
+ 
+-	dev->data->dev_started = 1;
+ 	goto exit;
+ 
+ error:
+@@ -3271,6 +3286,45 @@ static struct rte_pci_driver rte_iavf_pmd = {
+ 	.remove = eth_iavf_pci_remove,
+ };
@@ -144,4 +145,4 @@
-diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
-index 23e4107743..b6864d8d69 100644
---- a/drivers/net/intel/iavf/iavf_vchnl.c
-+++ b/drivers/net/intel/iavf/iavf_vchnl.c
+diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
+index 8259273f45c..b90966808d3 100644
+--- a/drivers/net/iavf/iavf_vchnl.c
++++ b/drivers/net/iavf/iavf_vchnl.c


More information about the stable mailing list