From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7713C5B572 for ; Thu, 13 Aug 2026 10:46:47 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6D7E8427D0; Thu, 13 Aug 2026 12:46:42 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.13]) by mails.dpdk.org (Postfix) with ESMTP id 45361427AF for ; Thu, 13 Aug 2026 12:46:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1786618000; x=1818154000; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=I3Bwe+9v4Q35nVcNQZnoeqJaaXMMwEKLY+eMgzLZ1ng=; b=ZE1lcn4NRZWvqgUe1p4wS6lY3Ry8gTn6mYj95pQE1FpUhlhcoMKQDqxl 2QbyVmuaN7EpvzQJUERSNCAO5x6tBz5UCIRF26AUAHu/1Z0SOVQAGwXXq BaIEm7ayO+v9QkFdf/FQH/ecaqfEO3EbyLKEI61m0OQ9+i6Kf2HEfaTKq AJiBJYSHRZkvPB6q5msrh/vcznO/yYJBGyIqRAeHipONNHm25I9yZJoR+ jSMz2HfyI07hwV0zDz5Qr9fSiD1HXOQhTUOJsDIzIWQQNaCiQ+eahDKl8 QUmE/Y5kXOJvIGLlZPjATGHqjVcv2lg+NYjsiIbPSoqnifBmUoo6FKtvv w==; X-CSE-ConnectionGUID: VUiGuRSLQAiIEECQGDHtWw== X-CSE-MsgGUID: JDCIsTODRzC4uXr90WxiMg== X-IronPort-AV: E=McAfee;i="6800,10657,11873"; a="89708987" X-IronPort-AV: E=Sophos;i="6.25,221,1779174000"; d="scan'208";a="89708987" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by fmvoesa107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Aug 2026 03:46:40 -0700 X-CSE-ConnectionGUID: fJhvvS9dTGWKLy0vivRCxw== X-CSE-MsgGUID: WrgY1VLlTHuYDx6bVNIOIQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,221,1779174000"; d="scan'208";a="264491553" Received: from pae-14.iind.intel.com ([10.190.203.153]) by orviesa009.jf.intel.com with ESMTP; 13 Aug 2026 03:46:38 -0700 From: Anurag Mandal To: dev@dpdk.org Cc: bruce.richardson@intel.com, vladimir.medvedkin@intel.com, ciara.loftus@intel.com, Anurag Mandal Subject: [PATCH v2 2/7] net/iavf: defer device start when PF VSI not ready Date: Thu, 13 Aug 2026 10:45:30 +0000 Message-Id: <3bb2a6e50c1ba06f4929fa9bc8374416d15096eb.1786617159.git.anurag.mandal@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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: 105d9fcefbee ("net/iavf: fix race condition on link status change") Signed-off-by: Anurag Mandal --- 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 293adaf6c9..e76c3bb410 100644 --- a/drivers/net/intel/iavf/iavf.h +++ b/drivers/net/intel/iavf/iavf.h @@ -293,6 +293,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; @@ -533,4 +534,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset); void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change); bool is_iavf_supported(struct rte_eth_dev *dev); void iavf_hash_uninit(struct iavf_adapter *ad); +void iavf_resume_pending_start(struct rte_eth_dev *dev); #endif /* _IAVF_ETHDEV_H_ */ diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c index e475b64971..ebe0183a77 100644 --- a/drivers/net/intel/iavf/iavf_ethdev.c +++ b/drivers/net/intel/iavf/iavf_ethdev.c @@ -1093,6 +1093,9 @@ iavf_dev_start(struct rte_eth_dev *dev) iavf_phc_sync_alarm_start(dev); + /* An explicit start supersedes any pending deferred start */ + vf->start_pending = false; + return 0; error: @@ -1131,6 +1134,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; } @@ -3425,6 +3431,7 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset) vf->in_reset_recovery = true; vf->pf_reset_in_progress = !vf_initiated_reset; + vf->start_pending = false; iavf_set_no_poll(adapter, false); /* Call the pre reset callback */ @@ -3445,10 +3452,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; + } } /* Restore settings after the reset */ @@ -3662,6 +3676,45 @@ bool is_iavf_supported(struct rte_eth_dev *dev) return !strcmp(dev->device->driver->name, rte_iavf_pmd.driver.name); } +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/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 @@ -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.34.1