From patchwork Tue Dec 5 10:28:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mingjin Ye X-Patchwork-Id: 134877 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CA37A43676; Tue, 5 Dec 2023 11:43:32 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2EB7942E2F; Tue, 5 Dec 2023 11:43:32 +0100 (CET) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id 6CA5140275; Tue, 5 Dec 2023 11:43:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1701773010; x=1733309010; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=/iqJ8jC97b9Of+8xCWSB6a7fAjtFh+qnenKJJ7rawQY=; b=jkb8V8mf5UyXTq+6Oxnq8Rf5bf3OE3jcaecCbX8P13eisUz8d7sB9zBa 85U8SHtqjLg6NqW3sVDm8Eph3OCf7KXxNF7srSCD7/xN9wfIdNQ1Q7NNk j03qCpEKS2ggLRxOZn1AdXB1b8UujpYNLLGCn8IxOa67wjAHGj3VHdKUl 1UioyK5wUaA9hI4ZJCU3M4J8MKguLalpzBLRQFun2q52hskYgsmQj82dc E0X10mBHwQaKB6ak5c1qwxbK/ugU1Ac5EGavxvFYD8Tpgu41MYM4tYPXp aJbeED70LF0nG0+62sqOxPa1Srxh5D48bs2IZp6P73BYuALxPBN+Y8oX/ Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10914"; a="393609572" X-IronPort-AV: E=Sophos;i="6.04,251,1695711600"; d="scan'208";a="393609572" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2023 02:43:29 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10914"; a="914758234" X-IronPort-AV: E=Sophos;i="6.04,251,1695711600"; d="scan'208";a="914758234" Received: from unknown (HELO localhost.localdomain) ([10.239.252.253]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2023 02:43:27 -0800 From: Mingjin Ye To: dev@dpdk.org Cc: qiming.yang@intel.com, Mingjin Ye , stable@dpdk.org, Jingjing Wu , Beilei Xing Subject: [PATCH] net/iavf: fix no polling mode switch Date: Tue, 5 Dec 2023 10:28:28 +0000 Message-Id: <20231205102828.1446631-1-mingjinx.ye@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 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 PMD does not switch to no polling mode when the PF triggers a reset event or the watchdog detects a reset event. In this scenario, data path will access the freed resources and cause a core dump. This patch fixes this issue by automatically switching modes on VF reset. Fixes: 5b3124a0a6ef ("net/iavf: support no polling when link down") Cc: stable@dpdk.org Signed-off-by: Mingjin Ye --- drivers/net/iavf/iavf.h | 1 + drivers/net/iavf/iavf_ethdev.c | 27 +++++++++++++++++++++++---- drivers/net/iavf/iavf_vchnl.c | 24 ++++++++++-------------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 10868f2c30..18d39ee652 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -512,4 +512,5 @@ int iavf_flow_sub_check(struct iavf_adapter *adapter, void iavf_dev_watchdog_enable(struct iavf_adapter *adapter); void iavf_dev_watchdog_disable(struct iavf_adapter *adapter); int iavf_handle_hw_reset(struct rte_eth_dev *dev); +void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change); #endif /* _IAVF_ETHDEV_H_ */ diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index d1edb0dd5c..0952998304 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -296,6 +296,7 @@ iavf_dev_watchdog(void *cb_arg) PMD_DRV_LOG(INFO, "VF \"%s\" reset has completed", adapter->vf.eth_dev->data->name); adapter->vf.vf_reset = false; + iavf_set_no_poll(adapter, false); } /* If not in reset then poll vfr_inprogress register for VFLR event */ } else { @@ -308,6 +309,7 @@ iavf_dev_watchdog(void *cb_arg) /* enter reset state with VFLR event */ adapter->vf.vf_reset = true; + iavf_set_no_poll(adapter, false); adapter->vf.link_up = false; iavf_dev_event_post(adapter->vf.eth_dev, RTE_ETH_EVENT_INTR_RESET, @@ -2916,8 +2918,10 @@ iavf_dev_close(struct rte_eth_dev *dev) * effect. */ out: - if (vf->vf_reset && !rte_pci_set_bus_master(pci_dev, true)) + if (vf->vf_reset && !rte_pci_set_bus_master(pci_dev, true)) { vf->vf_reset = false; + iavf_set_no_poll(adapter, false); + } /* disable watchdog */ iavf_dev_watchdog_disable(adapter); @@ -2948,6 +2952,8 @@ static int iavf_dev_reset(struct rte_eth_dev *dev) { int ret; + struct iavf_adapter *adapter = + IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); @@ -2962,6 +2968,7 @@ iavf_dev_reset(struct rte_eth_dev *dev) return ret; } vf->vf_reset = false; + iavf_set_no_poll(adapter, false); PMD_DRV_LOG(DEBUG, "Start dev_reset ...\n"); ret = iavf_dev_uninit(dev); @@ -2977,10 +2984,13 @@ iavf_dev_reset(struct rte_eth_dev *dev) int iavf_handle_hw_reset(struct rte_eth_dev *dev) { + struct iavf_adapter *adapter = + IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); int ret; vf->in_reset_recovery = true; + iavf_set_no_poll(adapter, false); ret = iavf_dev_reset(dev); if (ret) @@ -2998,16 +3008,25 @@ iavf_handle_hw_reset(struct rte_eth_dev *dev) if (ret) goto error; dev->data->dev_started = 1; - - vf->in_reset_recovery = false; - return 0; + goto exit; error: PMD_DRV_LOG(DEBUG, "RESET recover with error code=%d\n", ret); +exit: vf->in_reset_recovery = false; + iavf_set_no_poll(adapter, false); return ret; } +void +iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change) +{ + struct iavf_info *vf = &adapter->vf; + + adapter->no_poll = (link_change & !vf->link_up) || + vf->vf_reset || vf->in_reset_recovery; +} + static int iavf_dcf_cap_check_handler(__rte_unused const char *key, const char *value, __rte_unused void *opaque) diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index 0a3e1d082c..1111d30f57 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -273,20 +273,18 @@ iavf_read_msg_from_pf(struct iavf_adapter *adapter, uint16_t buf_len, iavf_dev_watchdog_enable(adapter); } if (adapter->devargs.no_poll_on_link_down) { - if (vf->link_up && adapter->no_poll) { - adapter->no_poll = false; - PMD_DRV_LOG(DEBUG, "VF no poll turned off"); - } - if (!vf->link_up) { - adapter->no_poll = true; + iavf_set_no_poll(adapter, true); + if (adapter->no_poll) PMD_DRV_LOG(DEBUG, "VF no poll turned on"); - } + else + PMD_DRV_LOG(DEBUG, "VF no poll turned off"); } PMD_DRV_LOG(INFO, "Link status update:%s", vf->link_up ? "up" : "down"); break; case VIRTCHNL_EVENT_RESET_IMPENDING: vf->vf_reset = true; + iavf_set_no_poll(adapter, false); PMD_DRV_LOG(INFO, "VF is resetting"); break; case VIRTCHNL_EVENT_PF_DRIVER_CLOSE: @@ -462,6 +460,7 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg, vf->link_up = false; if (!vf->vf_reset) { vf->vf_reset = true; + iavf_set_no_poll(adapter, false); iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_RESET, NULL, 0); } @@ -485,14 +484,11 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg, iavf_dev_watchdog_enable(adapter); } if (adapter->devargs.no_poll_on_link_down) { - if (vf->link_up && adapter->no_poll) { - adapter->no_poll = false; - PMD_DRV_LOG(DEBUG, "VF no poll turned off"); - } - if (!vf->link_up) { - adapter->no_poll = true; + iavf_set_no_poll(adapter, true); + if (adapter->no_poll) PMD_DRV_LOG(DEBUG, "VF no poll turned on"); - } + else + PMD_DRV_LOG(DEBUG, "VF no poll turned off"); } iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_LSC, NULL, 0); break;