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 58120438A2 for ; Fri, 12 Jan 2024 12:20:59 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 518454028C; Fri, 12 Jan 2024 12:20:59 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 3AD9F4026E for ; Fri, 12 Jan 2024 12:20:58 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1705058457; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=A9gu/GKt5aPamcd8rU5RuhV3JSPg9p1/jS8ebxUqNg8=; b=T5ixyTfZSHnWLA9EXBaO8gp9hTSPTYL0t2ZNHNXDGyRl2svZTziFiNqC31fMlMEx1LdY37 p48kCTSYy4385QsASNbz+D66iY/5fil7sNp02kUWkdmZhQkCS9E09EkAlFSJK7Jas9fIz3 y1iZpwH+kmc8psx/MVNsuS6pV82QVF8= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-553--q7mOwIoO4maV7EWUm1_Fw-1; Fri, 12 Jan 2024 06:20:55 -0500 X-MC-Unique: -q7mOwIoO4maV7EWUm1_Fw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 873E6185A781; Fri, 12 Jan 2024 11:20:55 +0000 (UTC) Received: from rh.Home (unknown [10.39.194.227]) by smtp.corp.redhat.com (Postfix) with ESMTP id 97E3A3C39; Fri, 12 Jan 2024 11:20:54 +0000 (UTC) From: Kevin Traynor To: stable@dpdk.org, xuemingl@nvidia.com Cc: Kevin Traynor Subject: [PATCH 22.11] Revert "net/iavf: fix abnormal disable HW interrupt" Date: Fri, 12 Jan 2024 11:20:46 +0000 Message-ID: <20240112112046.224346-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org This reverts commit 2bdeeb53da0dda4e36a022553d3403c1217d677e. The change in behaviour [0] for handling some admin queue messages from polling to interrupt mode has changed the behaviour and is leading to a deadlock with OVS. [0] commit 2bdeeb53da0dda4e36a022553d3403c1217d677e Author: Mingjin Ye Date: Wed Jun 14 09:53:03 2023 +0000 net/iavf: fix abnormal disable HW interrupt [ upstream commit 675a104e2e940ec476e8b469725e8465d01c0098 ] Bugzilla ID: 1337 Reported-by: Kevin Traynor Signed-off-by: Kevin Traynor --- drivers/net/iavf/iavf_ethdev.c | 25 +++++++++--------- drivers/net/iavf/iavf_vchnl.c | 48 +++++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 62d72a0155..a12ea39444 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -2760,17 +2760,4 @@ iavf_dev_close(struct rte_eth_dev *dev) ret = iavf_dev_stop(dev); - - /* - * Release redundant queue resource when close the dev - * so that other vfs can re-use the queues. - */ - if (vf->lv_enabled) { - ret = iavf_request_queues(dev, IAVF_MAX_NUM_QUEUES_DFLT); - if (ret) - PMD_DRV_LOG(ERR, "Reset the num of queues failed"); - - vf->max_rss_qregion = IAVF_MAX_NUM_QUEUES_DFLT; - } - adapter->closed = true; @@ -2789,4 +2776,16 @@ iavf_dev_close(struct rte_eth_dev *dev) iavf_config_promisc(adapter, false, false); + /* + * Release redundant queue resource when close the dev + * so that other vfs can re-use the queues. + */ + if (vf->lv_enabled) { + ret = iavf_request_queues(dev, IAVF_MAX_NUM_QUEUES_DFLT); + if (ret) + PMD_DRV_LOG(ERR, "Reset the num of queues failed"); + + vf->max_rss_qregion = IAVF_MAX_NUM_QUEUES_DFLT; + } + iavf_shutdown_adminq(hw); if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) { diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index c2f6b617d6..aeffb07cca 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -319,5 +319,4 @@ iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args, switch (args->ops) { case VIRTCHNL_OP_RESET_VF: - case VIRTCHNL_OP_REQUEST_QUEUES: /*no need to wait for response */ _clear_cmd(vf); @@ -343,4 +342,31 @@ iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args, _clear_cmd(vf); break; + case VIRTCHNL_OP_REQUEST_QUEUES: + /* + * ignore async reply, only wait for system message, + * vf_reset = true if get VIRTCHNL_EVENT_RESET_IMPENDING, + * if not, means request queues failed. + */ + do { + result = iavf_read_msg_from_pf(adapter, args->out_size, + args->out_buffer); + if (result == IAVF_MSG_SYS && vf->vf_reset) { + break; + } else if (result == IAVF_MSG_CMD || + result == IAVF_MSG_ERR) { + err = -1; + break; + } + iavf_msec_delay(ASQ_DELAY_MS); + /* If don't read msg or read sys event, continue */ + } while (i++ < MAX_TRY_TIMES); + if (i >= MAX_TRY_TIMES || + vf->cmd_retval != VIRTCHNL_STATUS_SUCCESS) { + err = -1; + PMD_DRV_LOG(ERR, "No response or return failure (%d)" + " for cmd %d", vf->cmd_retval, args->ops); + } + _clear_cmd(vf); + break; default: if (rte_thread_is_intr()) { @@ -2042,9 +2068,9 @@ iavf_request_queues(struct rte_eth_dev *dev, uint16_t num) IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); struct virtchnl_vf_res_request vfres; struct iavf_cmd_info args; uint16_t num_queue_pairs; int err; - int i = 0; if (!(vf->vf_res->vf_cap_flags & @@ -2067,5 +2093,14 @@ iavf_request_queues(struct rte_eth_dev *dev, uint16_t num) if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) { - err = iavf_execute_vf_cmd_safe(adapter, &args, 0); + /* disable interrupt to avoid the admin queue message to be read + * before iavf_read_msg_from_pf. + * + * don't disable interrupt handler until ready to execute vf cmd. + */ + rte_spinlock_lock(&vf->aq_lock); + rte_intr_disable(pci_dev->intr_handle); + err = iavf_execute_vf_cmd(adapter, &args, 0); + rte_intr_enable(pci_dev->intr_handle); + rte_spinlock_unlock(&vf->aq_lock); } else { rte_eal_alarm_cancel(iavf_dev_alarm_handler, dev); @@ -2080,11 +2115,4 @@ iavf_request_queues(struct rte_eth_dev *dev, uint16_t num) } - /* wait for interrupt notification vf is resetting */ - while (i++ < MAX_TRY_TIMES) { - if (vf->vf_reset) - break; - iavf_msec_delay(ASQ_DELAY_MS); - } - /* request queues succeeded, vf is resetting */ if (vf->vf_reset) { -- 2.43.0