From: Steve Yang <stevex.yang@intel.com>
To: dev@dpdk.org
Cc: qiming.yang@intel.com, beilei.xing@intel.com,
jingjing.wu@intel.com, Steve Yang <stevex.yang@intel.com>
Subject: [dpdk-dev] [PATCH v2 1/2] net/iavf: fix reset VF doesn't notify PF to reset
Date: Mon, 9 Nov 2020 06:51:35 +0000 [thread overview]
Message-ID: <20201109065136.26807-2-stevex.yang@intel.com> (raw)
In-Reply-To: <20201109065136.26807-1-stevex.yang@intel.com>
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 <stevex.yang@intel.com>
---
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
next prev parent reply other threads:[~2020-11-09 6:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-05 8:32 [dpdk-dev] [PATCH v1] " Steve Yang
2020-11-06 2:58 ` Xing, Beilei
2020-11-09 6:51 ` [dpdk-dev] [PATCH v2 0/2] net/iavf: backported bug fixes from i40evf to iavf Steve Yang
2020-11-09 6:51 ` Steve Yang [this message]
2020-11-10 5:56 ` [dpdk-dev] [PATCH v2 1/2] net/iavf: fix reset VF doesn't notify PF to reset Xing, Beilei
2020-11-09 6:51 ` [dpdk-dev] [PATCH v2 2/2] net/iavf: fix the RSS error when VF port closed Steve Yang
2020-11-12 11:47 ` Zhang, Qi Z
2020-11-13 0:46 ` [dpdk-dev] [PATCH v2 0/2] net/iavf: backported bug fixes from i40evf to iavf Steve Yang
2020-11-13 0:46 ` [dpdk-dev] [PATCH v3 1/2] net/iavf: fix reset VF doesn't notify PF to reset Steve Yang
2020-11-13 7:45 ` Xing, Beilei
2020-11-13 0:46 ` [dpdk-dev] [PATCH v3 2/2] net/iavf: fix the RSS error when VF port closed Steve Yang
2020-11-13 5:38 ` Zhang, Qi Z
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201109065136.26807-2-stevex.yang@intel.com \
--to=stevex.yang@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=jingjing.wu@intel.com \
--cc=qiming.yang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).