[v2] net/iavf: fix invalid cmd after pf reset

Message ID 20200911101848.111384-1-jia.guo@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Qi Zhang
Headers
Series [v2] net/iavf: fix invalid cmd after pf reset |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply issues

Commit Message

Guo, Jia Sept. 11, 2020, 10:18 a.m. UTC
  If PF reset is finished but VF reset is pending, VF should no need to
send any invalid cmd to PF. That would avoid mass unexpected behaviors
affecting the robust.

Fixes: 22b123a36d07 ("net/avf: initialize PMD")
Fixes: 9e03acd726cf ("net/iavf: fix flow access")

Signed-off-by: Jeff Guo <jia.guo@intel.com>
Tested-by: Xu, HailinX <hailinx.xu@intel.com>
---
v2->v1:
rebase patch.
---
 drivers/net/iavf/iavf.h        | 2 +-
 drivers/net/iavf/iavf_ethdev.c | 2 ++
 drivers/net/iavf/iavf_hash.c   | 8 ++++++++
 drivers/net/iavf/iavf_vchnl.c  | 4 ++++
 4 files changed, 15 insertions(+), 1 deletion(-)
  

Comments

Qi Zhang Sept. 11, 2020, 10:45 a.m. UTC | #1
> -----Original Message-----
> From: Guo, Jia <jia.guo@intel.com>
> Sent: Friday, September 11, 2020 6:19 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>;
> Xing, Beilei <beilei.xing@intel.com>
> Cc: dev@dpdk.org; Guo, Jia <jia.guo@intel.com>; Xu; Xu, HailinX
> <hailinx.xu@intel.com>
> Subject: [PATCH v2] net/iavf: fix invalid cmd after pf reset
> 
> If PF reset is finished but VF reset is pending, VF should no need to send any
> invalid cmd to PF. That would avoid mass unexpected behaviors affecting the
> robust.
> 
> Fixes: 22b123a36d07 ("net/avf: initialize PMD")
> Fixes: 9e03acd726cf ("net/iavf: fix flow access")
> 
> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> Tested-by: Xu, HailinX <hailinx.xu@intel.com>

Acked-by: Qi Zhang <qi.z.zhang@intel.com>

Applied to dpdk-next-net-intel.

Thanks
Qi
  

Patch

diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 9ad331ee9..3198d85b3 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -134,7 +134,7 @@  struct iavf_info {
 	uint16_t mc_addrs_num;   /* Multicast mac addresses number */
 
 	struct iavf_vsi vsi;
-	bool vf_reset;
+	bool vf_reset;	/* true for VF reset pending, false for no VF reset */
 	uint64_t flags;
 
 	uint8_t *rss_lut;
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 8e1d8a8d3..8fe81409c 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -1288,6 +1288,8 @@  iavf_init_vf(struct rte_eth_dev *dev)
 		}
 	}
 
+	vf->vf_reset = false;
+
 	return 0;
 err_rss:
 	rte_free(vf->rss_key);
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index ff77d7135..ddc6df849 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -457,6 +457,9 @@  iavf_hash_init(struct iavf_adapter *ad)
 	struct iavf_flow_parser *parser;
 	int ret;
 
+	if (vf->vf_reset)
+		return -EIO;
+
 	if (!vf->vf_res)
 		return -EINVAL;
 
@@ -967,6 +970,11 @@  iavf_hash_destroy(__rte_unused struct iavf_adapter *ad,
 static void
 iavf_hash_uninit(struct iavf_adapter *ad)
 {
+	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
+
+	if (vf->vf_reset)
+		return;
+
 	if (iavf_hash_default_set(ad, false))
 		PMD_DRV_LOG(ERR, "fail to delete default RSS");
 
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index 34c31a153..1871ba299 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -77,6 +77,9 @@  iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args)
 	if (_atomic_set_cmd(vf, args->ops))
 		return -1;
 
+	if (vf->vf_reset)
+		return -EIO;
+
 	ret = iavf_aq_send_msg_to_pf(hw, args->ops, IAVF_SUCCESS,
 				    args->in_args, args->in_args_size, NULL);
 	if (ret) {
@@ -187,6 +190,7 @@  iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,
 	switch (pf_msg->event) {
 	case VIRTCHNL_EVENT_RESET_IMPENDING:
 		PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
+		vf->vf_reset = true;
 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
 					      NULL);
 		break;