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 0B64BA0C4C for ; Tue, 13 Jul 2021 18:47:54 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D4A2741238; Tue, 13 Jul 2021 18:47:53 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id E9E8F41238 for ; Tue, 13 Jul 2021 18:47:51 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10044"; a="210247709" X-IronPort-AV: E=Sophos;i="5.84,236,1620716400"; d="scan'208";a="210247709" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Jul 2021 09:47:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,236,1620716400"; d="scan'208";a="493880587" Received: from dpdk-wujingji.sh.intel.com ([10.67.118.194]) by orsmga001.jf.intel.com with ESMTP; 13 Jul 2021 09:47:46 -0700 From: Jingjing Wu To: beilei.xing@intel.com Cc: stable@dpdk.org, jingjing.wu@intel.com Date: Wed, 14 Jul 2021 08:23:19 +0800 Message-Id: <20210714002319.22572-1-jingjing.wu@intel.com> X-Mailer: git-send-email 2.21.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [PATCH] net/iavf: replace event interrupt by alarm 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 Sender: "stable" To support environment without MSI/MSIX interrupt support, and reduce the performance impact when internal rx interrupt and adminq interrupt share the same source, the patch removes the interrupt handler, replace it with a low frequency interrupt polling daemon which is implemented by registering a alarm callback periodly. Fixes: 22b123a36d07 ("net/avf: initialize PMD") Signed-off-by: Jingjing Wu --- drivers/net/iavf/iavf_ethdev.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 649061d2ba..4671add0bb 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,8 @@ /* devargs */ #define IAVF_PROTO_XTR_ARG "proto_xtr" +#define IAVF_ALARM_INTERVAL 50000 /* us */ + static const char * const iavf_valid_args[] = { IAVF_PROTO_XTR_ARG, NULL @@ -729,6 +732,9 @@ iavf_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); + if (dev->data->dev_conf.intr_conf.rxq != 0) + rte_intr_disable(intr_handle); + if (adapter->stopped == 1) return 0; @@ -1902,7 +1908,7 @@ iavf_disable_irq0(struct iavf_hw *hw) } static void -iavf_dev_interrupt_handler(void *param) +iavf_dev_alarm_handler(void *param) { struct rte_eth_dev *dev = (struct rte_eth_dev *)param; struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -1912,6 +1918,8 @@ iavf_dev_interrupt_handler(void *param) iavf_handle_virtchnl_msg(dev); iavf_enable_irq0(hw); + + rte_eal_alarm_set(IAVF_ALARM_INTERVAL, iavf_dev_alarm_handler, dev); } static int @@ -2012,14 +2020,8 @@ iavf_dev_init(struct rte_eth_dev *eth_dev) rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.addr, ð_dev->data->mac_addrs[0]); - /* register callback func to eal lib */ - rte_intr_callback_register(&pci_dev->intr_handle, - iavf_dev_interrupt_handler, - (void *)eth_dev); - - /* enable uio intr after callback register */ - rte_intr_enable(&pci_dev->intr_handle); - + rte_eal_alarm_set(IAVF_ALARM_INTERVAL, + iavf_dev_alarm_handler, eth_dev); /* configure and enable device interrupt */ iavf_enable_irq0(hw); @@ -2036,8 +2038,6 @@ static int iavf_dev_close(struct rte_eth_dev *dev) { struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; 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); @@ -2060,14 +2060,11 @@ iavf_dev_close(struct rte_eth_dev *dev) iavf_config_promisc(adapter, false, false); iavf_shutdown_adminq(hw); - /* disable uio intr before callback unregister */ - rte_intr_disable(intr_handle); - /* unregister callback func from eal lib */ - rte_intr_callback_unregister(intr_handle, - iavf_dev_interrupt_handler, dev); iavf_disable_irq0(hw); + rte_eal_alarm_cancel(iavf_dev_alarm_handler, dev); + if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) { if (vf->rss_lut) { rte_free(vf->rss_lut); -- 2.21.1