From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D737EA0547; Tue, 26 Oct 2021 16:32:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2D6CE41142; Tue, 26 Oct 2021 16:32:02 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id A9B2D4113E for ; Tue, 26 Oct 2021 16:32:00 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10149"; a="253461881" X-IronPort-AV: E=Sophos;i="5.87,184,1631602800"; d="scan'208";a="253461881" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Oct 2021 07:11:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,184,1631602800"; d="scan'208";a="722385891" Received: from silpixa00400884.ir.intel.com ([10.243.22.82]) by fmsmga006.fm.intel.com with ESMTP; 26 Oct 2021 07:10:59 -0700 From: Radu Nicolau To: Jingjing Wu , Beilei Xing Cc: dev@dpdk.org, declan.doherty@intel.com, abhijit.sinha@intel.com, qi.z.zhang@intel.com, bruce.richardson@intel.com, konstantin.ananyev@intel.com, Radu Nicolau Date: Tue, 26 Oct 2021 14:56:56 +0100 Message-Id: <20211026135657.2034763-7-radu.nicolau@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211026135657.2034763-1-radu.nicolau@intel.com> References: <20210909142428.750634-1-radu.nicolau@intel.com> <20211026135657.2034763-1-radu.nicolau@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v12 6/7] net/iavf: add watchdog for VFLR 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 Sender: "dev" Add watchdog to iAVF PMD which support monitoring the VFLR register. If the device is not already in reset then if a VF reset in progress is detected then notfiy user through callback and set into reset state. If the device is already in reset then poll for completion of reset. The watchdog is disabled by default, to enable it set IAVF_DEV_WATCHDOG_PERIOD to a non zero value (microseconds) Signed-off-by: Declan Doherty Signed-off-by: Radu Nicolau Acked-by: Jingjing Wu --- drivers/net/iavf/iavf.h | 5 ++ drivers/net/iavf/iavf_ethdev.c | 94 ++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index f314373ab0..40c8045de1 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -31,6 +31,8 @@ #define IAVF_NUM_MACADDR_MAX 64 +#define IAVF_DEV_WATCHDOG_PERIOD 0 + #define IAVF_DEFAULT_RX_PTHRESH 8 #define IAVF_DEFAULT_RX_HTHRESH 8 #define IAVF_DEFAULT_RX_WTHRESH 0 @@ -216,6 +218,9 @@ struct iavf_info { int cmd_retval; /* return value of the cmd response from PF */ uint8_t *aq_resp; /* buffer to store the adminq response from PF */ + /** iAVF watchdog enable */ + bool watchdog_enabled; + /* Event from pf */ bool dev_closed; bool link_up; diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 783a10060c..ae0f8f17f4 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "iavf.h" #include "iavf_rxtx.h" @@ -240,6 +241,91 @@ iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, return 0; } +__rte_unused +static int +iavf_vfr_inprogress(struct iavf_hw *hw) +{ + int inprogress = 0; + + if ((IAVF_READ_REG(hw, IAVF_VFGEN_RSTAT) & + IAVF_VFGEN_RSTAT_VFR_STATE_MASK) == + VIRTCHNL_VFR_INPROGRESS) + inprogress = 1; + + if (inprogress) + PMD_DRV_LOG(INFO, "Watchdog detected VFR in progress"); + + return inprogress; +} + +__rte_unused +static void +iavf_dev_watchdog(void *cb_arg) +{ + struct iavf_adapter *adapter = cb_arg; + struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(adapter); + int vfr_inprogress = 0, rc = 0; + + /* check if watchdog has been disabled since last call */ + if (!adapter->vf.watchdog_enabled) + return; + + /* If in reset then poll vfr_inprogress register for completion */ + if (adapter->vf.vf_reset) { + vfr_inprogress = iavf_vfr_inprogress(hw); + + if (!vfr_inprogress) { + PMD_DRV_LOG(INFO, "VF \"%s\" reset has completed", + adapter->vf.eth_dev->data->name); + adapter->vf.vf_reset = false; + } + /* If not in reset then poll vfr_inprogress register for VFLR event */ + } else { + vfr_inprogress = iavf_vfr_inprogress(hw); + + if (vfr_inprogress) { + PMD_DRV_LOG(INFO, + "VF \"%s\" reset event detected by watchdog", + adapter->vf.eth_dev->data->name); + + /* enter reset state with VFLR event */ + adapter->vf.vf_reset = true; + + rte_eth_dev_callback_process(adapter->vf.eth_dev, + RTE_ETH_EVENT_INTR_RESET, NULL); + } + } + + /* re-alarm watchdog */ + rc = rte_eal_alarm_set(IAVF_DEV_WATCHDOG_PERIOD, + &iavf_dev_watchdog, cb_arg); + + if (rc) + PMD_DRV_LOG(ERR, "Failed \"%s\" to reset device watchdog alarm", + adapter->vf.eth_dev->data->name); +} + +static void +iavf_dev_watchdog_enable(struct iavf_adapter *adapter __rte_unused) +{ +#if (IAVF_DEV_WATCHDOG_PERIOD > 0) + PMD_DRV_LOG(INFO, "Enabling device watchdog"); + adapter->vf.watchdog_enabled = true; + if (rte_eal_alarm_set(IAVF_DEV_WATCHDOG_PERIOD, + &iavf_dev_watchdog, (void *)adapter)) + PMD_DRV_LOG(ERR, "Failed to enabled device watchdog"); +#endif +} + +static void +iavf_dev_watchdog_disable(struct iavf_adapter *adapter __rte_unused) +{ +#if (IAVF_DEV_WATCHDOG_PERIOD > 0) + PMD_DRV_LOG(INFO, "Disabling device watchdog"); + adapter->vf.watchdog_enabled = false; +#endif +} + static int iavf_set_mc_addr_list(struct rte_eth_dev *dev, struct rte_ether_addr *mc_addrs, @@ -2466,6 +2552,11 @@ iavf_dev_init(struct rte_eth_dev *eth_dev) iavf_default_rss_disable(adapter); + + /* Start device watchdog */ + iavf_dev_watchdog_enable(adapter); + + return 0; flow_init_err: @@ -2549,6 +2640,9 @@ iavf_dev_close(struct rte_eth_dev *dev) if (vf->vf_reset && !rte_pci_set_bus_master(pci_dev, true)) vf->vf_reset = false; + /* disable watchdog */ + iavf_dev_watchdog_disable(adapter); + return ret; } -- 2.25.1