From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6CBE5A0527; Mon, 9 Nov 2020 07:53:22 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3BEC95A51; Mon, 9 Nov 2020 07:53:07 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 103A1593A for ; Mon, 9 Nov 2020 07:53:03 +0100 (CET) IronPort-SDR: K4NFAspGQ9QzXOPOSc9Hf7fiV+wTl7bPPXlmbHse3SFLOziR8XE711VlSzzY5Y4uBR28BcUSNg /Xz58WR3MAWQ== X-IronPort-AV: E=McAfee;i="6000,8403,9799"; a="166247815" X-IronPort-AV: E=Sophos;i="5.77,462,1596524400"; d="scan'208";a="166247815" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Nov 2020 22:53:03 -0800 IronPort-SDR: A9iFeffloVKYIxiF7H5hqKDYUFjvOLWXe1Tz+OA7ZNcPvurRmtaUEKPCDfz/SLtvr4juH3gpGs Zvk0eKw8GUpQ== X-IronPort-AV: E=Sophos;i="5.77,462,1596524400"; d="scan'208";a="540717609" Received: from intel-npg-odc-srv01.cd.intel.com ([10.240.178.136]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Nov 2020 22:53:01 -0800 From: Steve Yang To: dev@dpdk.org Cc: qiming.yang@intel.com, beilei.xing@intel.com, jingjing.wu@intel.com, Steve Yang Date: Mon, 9 Nov 2020 06:51:35 +0000 Message-Id: <20201109065136.26807-2-stevex.yang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201109065136.26807-1-stevex.yang@intel.com> References: <20201105083216.38300-1-stevex.yang@intel.com> <20201109065136.26807-1-stevex.yang@intel.com> Subject: [dpdk-dev] [PATCH v2 1/2] net/iavf: fix reset VF doesn't notify PF to reset X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" When VF closed, the VF should notify PF to close/reset relative resources from PF side. Fixes: 22b123a36d07 ("net/avf: initialize PMD") Signed-off-by: Steve Yang --- drivers/common/iavf/iavf_prototype.h | 1 + drivers/common/iavf/version.map | 1 + drivers/net/iavf/iavf_ethdev.c | 57 ++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/drivers/common/iavf/iavf_prototype.h b/drivers/common/iavf/iavf_prototype.h index f34e77db0f..3998d26dc0 100644 --- a/drivers/common/iavf/iavf_prototype.h +++ b/drivers/common/iavf/iavf_prototype.h @@ -83,6 +83,7 @@ void iavf_destroy_spinlock(struct iavf_spinlock *sp); __rte_internal void iavf_vf_parse_hw_config(struct iavf_hw *hw, struct virtchnl_vf_resource *msg); +__rte_internal enum iavf_status iavf_vf_reset(struct iavf_hw *hw); __rte_internal enum iavf_status iavf_aq_send_msg_to_pf(struct iavf_hw *hw, diff --git a/drivers/common/iavf/version.map b/drivers/common/iavf/version.map index e0f117197c..6c1427cca4 100644 --- a/drivers/common/iavf/version.map +++ b/drivers/common/iavf/version.map @@ -7,6 +7,7 @@ INTERNAL { iavf_set_mac_type; iavf_shutdown_adminq; iavf_vf_parse_hw_config; + iavf_vf_reset; local: *; }; diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 7e3c26a94e..510adc5f6b 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -1417,8 +1417,10 @@ iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id) } static int -iavf_check_vf_reset_done(struct iavf_hw *hw) +iavf_check_vf_reset_done(struct rte_eth_dev *dev) { + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); int i, reset; for (i = 0; i < IAVF_RESET_WAIT_CNT; i++) { @@ -1434,6 +1436,7 @@ iavf_check_vf_reset_done(struct iavf_hw *hw) if (i >= IAVF_RESET_WAIT_CNT) return -1; + vf->vf_reset = false; return 0; } @@ -1780,6 +1783,36 @@ iavf_init_proto_xtr(struct rte_eth_dev *dev) } } +static int +iavf_reset_vf(struct rte_eth_dev *dev) +{ + struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); + int ret; + + if (iavf_vf_reset(hw) != IAVF_SUCCESS) { + PMD_INIT_LOG(ERR, "Reset VF NIC failed"); + return -1; + } + /** + * After issuing vf reset command to pf, pf won't necessarily + * reset vf, it depends on what state it exactly is. If it's not + * initialized yet, it won't have vf reset since it's in a certain + * state. If not, it will try to reset. Even vf is reset, pf will + * set I40E_VFGEN_RSTAT to COMPLETE first, then wait 10ms and set + * it to ACTIVE. In this duration, vf may not catch the moment that + * COMPLETE is set. So, for vf, we'll try to wait a long time. + */ + rte_delay_ms(200); + + ret = iavf_check_vf_reset_done(dev); + if (ret) { + PMD_INIT_LOG(ERR, "VF is still resetting"); + return ret; + } + + return 0; +} + static int iavf_init_vf(struct rte_eth_dev *dev) { @@ -1801,7 +1834,7 @@ iavf_init_vf(struct rte_eth_dev *dev) goto err; } - err = iavf_check_vf_reset_done(hw); + err = iavf_check_vf_reset_done(dev); if (err) { PMD_INIT_LOG(ERR, "VF is still resetting"); goto err; @@ -1814,6 +1847,24 @@ iavf_init_vf(struct rte_eth_dev *dev) goto err; } + /* Reset VF and wait until it's complete */ + if (iavf_reset_vf(dev)) { + PMD_INIT_LOG(ERR, "reset NIC failed"); + goto err_aq; + } + + /* VF reset, shutdown admin queue and initialize again */ + if (iavf_shutdown_adminq(hw) != IAVF_SUCCESS) { + PMD_INIT_LOG(ERR, "iavf_shutdown_adminq failed"); + goto err; + } + + iavf_init_adminq_parameter(hw); + if (iavf_init_adminq(hw) != IAVF_SUCCESS) { + PMD_INIT_LOG(ERR, "init_adminq failed"); + goto err; + } + vf->aq_resp = rte_zmalloc("vf_aq_resp", IAVF_AQ_BUF_SZ, 0); if (!vf->aq_resp) { PMD_INIT_LOG(ERR, "unable to allocate vf_aq_resp memory"); @@ -2050,7 +2101,7 @@ iavf_dev_close(struct rte_eth_dev *dev) iavf_flow_flush(dev, NULL); iavf_flow_uninit(adapter); - + iavf_reset_vf(dev); /* * disable promiscuous mode before reset vf * it is a workaround solution when work with kernel driver -- 2.17.1