From mboxrd@z Thu Jan 1 00:00:00 1970 From: xiangxia.m.yue@gmail.com Subject: [PATCH 1/4] net/ixgbevf: unregister irq handler when other interrupts not allowed. Date: Thu, 26 Oct 2017 06:44:41 -0700 Message-ID: <1509025484-15771-1-git-send-email-xiangxia.m.yue@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Tonghao Zhang To: dev@dpdk.org Return-path: Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by dpdk.org (Postfix) with ESMTP id A4A621BAF0 for ; Thu, 26 Oct 2017 15:44:53 +0200 (CEST) Received: by mail-pf0-f194.google.com with SMTP id p87so2554143pfj.3 for ; Thu, 26 Oct 2017 06:44:53 -0700 (PDT) List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Tonghao Zhang When we bind the ixgbe VF (e.g 82599 card) to igb_uio and enable the rx-interrupt, there will be more than one epoll_wait on intr_handle.fd. One is in "eal-intr-thread" thread, and the others are in the thread which call the "rte_epoll_wait". The problem is that sometiems "eal-intr-thread" thread will process the rx interrupt, and rte_epoll_wait can’t get the event any more, and the packets may be lost. We should unregister the status interrupt handler in "eal-intr-thread" thread and the ixgbe is in the same case. Signed-off-by: Tonghao Zhang --- drivers/net/ixgbe/ixgbe_ethdev.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 4339347..5994e55 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -5070,6 +5070,15 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev, } ixgbevf_configure_msix(dev); + if (!rte_intr_allow_others(intr_handle)) { + rte_intr_callback_unregister(intr_handle, + ixgbevf_dev_interrupt_handler, + dev); + if (dev->data->dev_conf.intr_conf.lsc != 0) + PMD_INIT_LOG(INFO, "lsc won't enable because of" + " no intr multiplex"); + } + /* When a VF port is bound to VFIO-PCI, only miscellaneous interrupt * is mapped to VFIO vector 0 in eth_ixgbevf_dev_init( ). * If previous VFIO interrupt mapping setting in eth_ixgbevf_dev_init( ) @@ -5111,6 +5120,12 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev, dev->data->scattered_rx = 0; ixgbe_dev_clear_queues(dev); + + if (!rte_intr_allow_others(intr_handle)) + /* resume to the default handler */ + rte_intr_callback_register(intr_handle, + ixgbevf_dev_interrupt_handler, + (void *)dev); /* Clean datapath event and queue/vec mapping */ rte_intr_efd_disable(intr_handle); -- 1.8.3.1