From patchwork Mon Nov 19 14:48:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Player, Timmons" X-Patchwork-Id: 48187 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E97FE2C52; Mon, 19 Nov 2018 15:48:57 +0100 (CET) Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-eopbgr800109.outbound.protection.outlook.com [40.107.80.109]) by dpdk.org (Postfix) with ESMTP id 9BA7C2B83 for ; Mon, 19 Nov 2018 15:48:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spirent1.onmicrosoft.com; s=selector1-spirent-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d4b9FCk9FzFB3FcX66KZoi1l1m0tShPvJlfLBwCoIDU=; b=lR6Kkf6XZDFFEVyZpY919Rh05uBdzXQ3ATElY4Sd/pjNwHR12+Qa7PFUYrZyoE9F4NJMLaBQp6LN2lwtQvokf3Jxi5c+5G5w96efec5vYdYXEcNlDx8Y2WpIMedjTuFQgPAHfy9Mx58Krhc3ophNlY0KRBxrdq4H4vq9AIY4TZ8= Received: from BN7PR10MB2739.namprd10.prod.outlook.com (20.176.21.18) by BN7PR10MB2675.namprd10.prod.outlook.com (20.176.20.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1339.21; Mon, 19 Nov 2018 14:48:55 +0000 Received: from BN7PR10MB2739.namprd10.prod.outlook.com ([fe80::880e:92b1:994b:aa04]) by BN7PR10MB2739.namprd10.prod.outlook.com ([fe80::880e:92b1:994b:aa04%3]) with mapi id 15.20.1339.027; Mon, 19 Nov 2018 14:48:54 +0000 From: "Player, Timmons" To: Wenzhuo Lu CC: "dev@dpdk.org" , "Player, Timmons" Thread-Topic: [PATCH v2] net/igb: fix LSC interrupt when using MSI-X Thread-Index: AQHUgBb+/9QoQxnqWE2foIYOgJptGg== Date: Mon, 19 Nov 2018 14:48:54 +0000 Message-ID: <20181119144833.7732-1-timmons.player@spirent.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [2605:a601:a204:3390:e9d:92ff:fe82:3675] x-clientproxiedby: BN6PR13CA0014.namprd13.prod.outlook.com (2603:10b6:404:10a::24) To BN7PR10MB2739.namprd10.prod.outlook.com (2603:10b6:406:c6::18) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Timmons.Player@spirent.com; x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; BN7PR10MB2675; 6:oLZJJF3+rHiU7uT0DrikFqQQYJpOcPguR8zuPBb8H1ewzzPRzQWTN5pDOqsGA5ujUlxz7xe2xbIgJ5P6wiEKJE28L5W+ggdv1qnp7hJlk2DJFhkSLUuzrf3MVZ8xeACvJtqe4SSLvwQdJOHhN7x+ZO93wrPRu0dAew6dd9LfRqiqhRuSPBROuM5YxGxyszEA0Sg7sYnNOGMg52/IzaOsjgX7e6T3Ge0H8U1BrI9aM4Egus/K4Ls86WW77c3mwUAammbTu1dhSuQ2yhe8nRWl7TidF36xC0VSJcNjES9QlJuile13dmXixvyq4ai2RyRTI51lVwAX3EAWs7gLk5c6KFRgwPNqLb4wQv5xN135XWWoIVptlOW4hZ1uqQq9SqDDqQZnTt+6MDljAxzE4mv+KUbEfb18J30GCG3O4HmuTP2iCGeww9QgNpic+4S2euc6kFUck4gdYjzkPIEI1WlLJQ==; 5:+MBQsHpwGLZa1pm7dEFZWa1XDJMlaCoYSwd2yV3DT8+sjgvlpH9sqZxTMskwyi4IU8M2N64pSIz/wzpJ2rDUZ6ESjpENMAZ1mCKgth8mQL0rY3kKsxtX+EF9jvt4uMsZD40T5mdCcYz8Ss18D6Efa6K6j3StZAk71ukT/x0KAtM=; 7:2DePkOvFRqt0/z2+UBaG8XAnJF/dihpnuEbzIXs6o4QWr0FDStLWdCsIyWSTSr8h604kf8ydmmCDRLrF+es60Rp+MkAEgOGLl4aU66E1HvSYOnjK4xg6o1Mk1+KDZmQ1sYEcVEl6nIsEV1AyGfonDg== x-ms-office365-filtering-correlation-id: 0628b71d-a82b-4e98-b23c-08d64e2e20ba x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390098)(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:BN7PR10MB2675; x-ms-traffictypediagnostic: BN7PR10MB2675: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(3231415)(944501410)(52105112)(10201501046)(3002001)(148016)(149066)(150057)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:BN7PR10MB2675; BCL:0; PCL:0; RULEID:; SRVR:BN7PR10MB2675; x-forefront-prvs: 08617F610C x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(39850400004)(396003)(366004)(136003)(376002)(346002)(189003)(199004)(6116002)(6486002)(6436002)(386003)(6506007)(81166006)(81156014)(8676002)(1076002)(6916009)(478600001)(305945005)(7736002)(72206003)(106356001)(71190400001)(71200400001)(25786009)(5660300001)(256004)(105586002)(2900100001)(14444005)(14454004)(36756003)(54906003)(46003)(316002)(476003)(2616005)(99286004)(486006)(8936002)(52116002)(2906002)(68736007)(186003)(102836004)(86362001)(97736004)(107886003)(53936002)(4326008)(6512007); DIR:OUT; SFP:1102; SCL:1; SRVR:BN7PR10MB2675; H:BN7PR10MB2739.namprd10.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: spirent.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: lH3bzh6+slSk4YxKq5zkb26y3ErYybHJ1bRbRDZx09aCtoAVACmALWqDWdUnmtURssGtVG380fo2dnuCkp074wFyekJMFdmBy1Kh1jSb8lUoBDIjTVZUz2lUszEqwT4R5+MROa/Ggrkf/TneseZr1XkUrpRV13yfX1r64aVpw+aPdrAFXlgFAc94kGIQdfx3WXcUb1P++x4g5tx3HPPyDy0HMOAOfhHqu+JfyceMCyJJOdjfjll0Qspi8t6WE619hB34WNzQkuJ+MaEzQCX/XyNBmsPZKMg132+hhgrHPOalUUehySk/X5M78UkZd5ynW96vuYWVN7aUQKQc8Iq/6mPxRxcJCGTjo1U0Qt5WpcU= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: spirent.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0628b71d-a82b-4e98-b23c-08d64e2e20ba X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Nov 2018 14:48:54.9072 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: eb68cad0-6bd5-483f-a802-0f72f974373f X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN7PR10MB2675 Subject: [dpdk-dev] [PATCH v2] net/igb: fix LSC interrupt when using MSI-X X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- v2: * Update igb_intr_{enable,disable} to only touch the 'other interrupt' when it is explicitly enabled. 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 @@ -68,6 +68,9 @@ #define E1000_VET_VET_EXT 0xFFFF0000 #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); static void eth_igb_stop(struct rte_eth_dev *dev); @@ -138,7 +141,7 @@ static void igb_vlan_hw_extend_disable(struct rte_eth_dev *dev); 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, struct ether_addr *mac_addr, @@ -538,14 +541,31 @@ igb_intr_enable(struct rte_eth_dev *dev) E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private); 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); E1000_WRITE_FLUSH(hw); } 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); } @@ -1486,7 +1506,7 @@ 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 */ rte_intr_disable(intr_handle); @@ -2768,12 +2788,15 @@ static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev) uint32_t mask, regval; 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; memset(&dev_info, 0, sizeof(dev_info)); 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); @@ -2800,7 +2823,7 @@ eth_igb_interrupt_get_status(struct rte_eth_dev *dev) struct e1000_interrupt *intr = E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private); - igb_intr_disable(hw); + igb_intr_disable(dev); /* read-on-clear nic registers here */ icr = E1000_READ_REG(hw, E1000_ICR); @@ -5583,13 +5606,17 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev) E1000_GPIE_NSICR); 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); /* enable msix_other interrupt */ 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); } @@ -5598,6 +5625,10 @@ 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);