From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 325AF1B8B8 for ; Fri, 14 Dec 2018 19:25:14 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 524DA7E9CB; Fri, 14 Dec 2018 18:25:13 +0000 (UTC) Received: from ktraynor.remote.csb (ovpn-116-106.ams2.redhat.com [10.36.116.106]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4A953600C4; Fri, 14 Dec 2018 18:25:12 +0000 (UTC) From: Kevin Traynor To: "Timmons C. Player" Cc: Wei Zhao , dpdk stable Date: Fri, 14 Dec 2018 18:24:04 +0000 Message-Id: <20181214182430.11593-2-ktraynor@redhat.com> In-Reply-To: <20181214182430.11593-1-ktraynor@redhat.com> References: <20181214182430.11593-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 14 Dec 2018 18:25:13 +0000 (UTC) Subject: [dpdk-stable] patch 'net/igb: fix LSC interrupt when using MSI-X' has been queued to stable release 18.11.1 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Dec 2018 18:25:14 -0000 Hi, FYI, your patch has been queued to stable release 18.11.1 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 12/18/18. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Thanks. Kevin Traynor --- >>From c7dd7044fcf39e9bb4665fcc06d388422eaed4ef Mon Sep 17 00:00:00 2001 From: "Timmons C. Player" Date: Mon, 19 Nov 2018 14:48:54 +0000 Subject: [PATCH] net/igb: fix LSC interrupt when using MSI-X [ upstream commit 7f5c81d5689d4d1b4dce8279a6eb3318bddf1607 ] Take the 'other interrupt' into account when setting up MSI-X interrupts and use the proper mask when enabling it. Also, rearm the MSI-X vector after the LSC interrupt fires. This change allows both LSC and RXQ interrupts to work at the same time when using MSI-X interrupts. Signed-off-by: Timmons C. Player Acked-by: Wei Zhao --- drivers/net/e1000/igb_ethdev.c | 43 +++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index d9d29d22f..87c9aedf2 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -69,4 +69,7 @@ #define E1000_VET_VET_EXT_SHIFT 16 +/* MSI-X other interrupt vector */ +#define IGB_MSIX_OTHER_INTR_VEC 0 + static int eth_igb_configure(struct rte_eth_dev *dev); static int eth_igb_start(struct rte_eth_dev *dev); @@ -139,5 +142,5 @@ static int eth_igb_led_on(struct rte_eth_dev *dev); static int eth_igb_led_off(struct rte_eth_dev *dev); -static void igb_intr_disable(struct e1000_hw *hw); +static void igb_intr_disable(struct rte_eth_dev *dev); static int igb_get_rx_buffer_size(struct e1000_hw *hw); static int eth_igb_rar_set(struct rte_eth_dev *dev, @@ -539,4 +542,11 @@ igb_intr_enable(struct rte_eth_dev *dev) struct e1000_hw *hw = E1000_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; + + if (rte_intr_allow_others(intr_handle) && + dev->data->dev_conf.intr_conf.lsc != 0) { + E1000_WRITE_REG(hw, E1000_EIMS, 1 << IGB_MSIX_OTHER_INTR_VEC); + } E1000_WRITE_REG(hw, E1000_IMS, intr->mask); @@ -545,6 +555,16 @@ igb_intr_enable(struct rte_eth_dev *dev) static void -igb_intr_disable(struct e1000_hw *hw) +igb_intr_disable(struct rte_eth_dev *dev) { + struct e1000_hw *hw = + E1000_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; + + if (rte_intr_allow_others(intr_handle) && + dev->data->dev_conf.intr_conf.lsc != 0) { + E1000_WRITE_REG(hw, E1000_EIMC, 1 << IGB_MSIX_OTHER_INTR_VEC); + } + E1000_WRITE_REG(hw, E1000_IMC, ~0); E1000_WRITE_FLUSH(hw); @@ -1487,5 +1507,5 @@ eth_igb_stop(struct rte_eth_dev *dev) eth_igb_rxtx_control(dev, false); - igb_intr_disable(hw); + igb_intr_disable(dev); /* disable intr eventfd mapping */ @@ -2769,4 +2789,7 @@ static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev) struct e1000_hw *hw = E1000_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; + int misc_shift = rte_intr_allow_others(intr_handle) ? 1 : 0; struct rte_eth_dev_info dev_info; @@ -2774,5 +2797,5 @@ static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev) eth_igb_infos_get(dev, &dev_info); - mask = 0xFFFFFFFF >> (32 - dev_info.max_rx_queues); + mask = (0xFFFFFFFF >> (32 - dev_info.max_rx_queues)) << misc_shift; regval = E1000_READ_REG(hw, E1000_EIMS); E1000_WRITE_REG(hw, E1000_EIMS, regval | mask); @@ -2801,5 +2824,5 @@ eth_igb_interrupt_get_status(struct rte_eth_dev *dev) E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private); - igb_intr_disable(hw); + igb_intr_disable(dev); /* read-on-clear nic registers here */ @@ -5584,4 +5607,8 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev) intr_mask = RTE_LEN2MASK(intr_handle->nb_efd, uint32_t) << misc_shift; + + if (dev->data->dev_conf.intr_conf.lsc != 0) + intr_mask |= (1 << IGB_MSIX_OTHER_INTR_VEC); + regval = E1000_READ_REG(hw, E1000_EIAC); E1000_WRITE_REG(hw, E1000_EIAC, regval | intr_mask); @@ -5590,5 +5617,5 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev) regval = E1000_READ_REG(hw, E1000_EIMS); E1000_WRITE_REG(hw, E1000_EIMS, regval | intr_mask); - tmpval = (dev->data->nb_rx_queues | E1000_IVAR_VALID) << 8; + tmpval = (IGB_MSIX_OTHER_INTR_VEC | E1000_IVAR_VALID) << 8; E1000_WRITE_REG(hw, E1000_IVAR_MISC, tmpval); } @@ -5599,4 +5626,8 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev) intr_mask = RTE_LEN2MASK(intr_handle->nb_efd, uint32_t) << misc_shift; + + if (dev->data->dev_conf.intr_conf.lsc != 0) + intr_mask |= (1 << IGB_MSIX_OTHER_INTR_VEC); + regval = E1000_READ_REG(hw, E1000_EIAM); E1000_WRITE_REG(hw, E1000_EIAM, regval | intr_mask); -- 2.19.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2018-12-14 18:23:18.261171574 +0000 +++ 0002-net-igb-fix-LSC-interrupt-when-using-MSI-X.patch 2018-12-14 18:23:18.000000000 +0000 @@ -1,8 +1,10 @@ -From 7f5c81d5689d4d1b4dce8279a6eb3318bddf1607 Mon Sep 17 00:00:00 2001 +From c7dd7044fcf39e9bb4665fcc06d388422eaed4ef Mon Sep 17 00:00:00 2001 From: "Timmons C. Player" Date: Mon, 19 Nov 2018 14:48:54 +0000 Subject: [PATCH] net/igb: fix LSC interrupt when using MSI-X +[ upstream commit 7f5c81d5689d4d1b4dce8279a6eb3318bddf1607 ] + Take the 'other interrupt' into account when setting up MSI-X interrupts and use the proper mask when enabling it. Also, rearm the MSI-X vector after the LSC interrupt fires. @@ -10,8 +12,6 @@ This change allows both LSC and RXQ interrupts to work at the same time when using MSI-X interrupts. -Cc: stable@dpdk.org - Signed-off-by: Timmons C. Player Acked-by: Wei Zhao ---