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 A2F65A0503; Thu, 19 May 2022 19:43:47 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3C75542B77; Thu, 19 May 2022 19:43:42 +0200 (CEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2108.outbound.protection.outlook.com [40.107.21.108]) by mails.dpdk.org (Postfix) with ESMTP id 882AA40223 for ; Thu, 19 May 2022 19:43:39 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zptf5te5FPYWFPnGMhDdXa7jC/rXEByGzhDTNA9fdOnbgSLS++3jTct4pQzxU+/2aaxBQ9+5+jgcf4RSNG2FrEcfNRV++0fgDDX9yivX56xI7t2+hk5SQ1wdBPU3636b5Y4rIY7/l5tBTjtCVq+OV+gUZO7p+ehIfopityqTPJvWUFQOCX7F9P0VXih8QawQ0EfK+XI+TBMCifl0prUZypnfGCQ5pD1qKtlsDnCrmxn6gThCX8G0l95dTV/2qtJu1sAPN/n1/dqe3+w73WlGO+UVZJxDmfxVbmrypXgF4Cz7bimdQ61IU1OyXvxGTQ6fW+ctZzPCM2NM+TZdKKR+vQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eFLDFFBmjNMAgLPS9TPpiCaPwjcZHzMflxp62/81VVI=; b=iikFC8hDJ5rSFztG2p8LCiJuJu0vX1XZtOs78v1ZVovNYBXwtHG1tw6894f5eQ8egV/FsTWQUEUjPpR/oFn1hGVegOJ8/T58tboZxSczNmdEZSbbFpFUXP/Kk7q6M8g8RlgVcPSLZTcMYk9iErgYXHWm6h7BVGEiiDnl0l8bDaufMpOs8k9rNymkRSbV5NAhuOFCwUANwPso0sVd3iomgHmNFbIq7pLM33/CxtpHKnxzKZZ5pvv7Lr/fZjrE1inukpl1Vze/zbqOxgwA8CvdrJl4JFUO/bUZW9oXh4Nf6T3T7r5+P/LfHUeCNHbb6UFPLMiBc25mF1cYXYhCdDb+yw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silicom-usa.com; dmarc=pass action=none header.from=silicom-usa.com; dkim=pass header.d=silicom-usa.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=SILICOMLTD.onmicrosoft.com; s=selector2-SILICOMLTD-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eFLDFFBmjNMAgLPS9TPpiCaPwjcZHzMflxp62/81VVI=; b=fbxn3VRIZXmdQ9Glw6QX4x3CruFiDPF5o9FSLw5M32K/J27jGuToPHuORmHOPuDn+83kpl6JuqpkFPO6PBVY2DuPJ6jlI3mcQk9Ba6Z/EOrEMS69tNOTD+7yrlgt1kayxUyZkvxngG2y94iorzG/WLNTVOMYTZdBqI01lUPkeZk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=silicom-usa.com; Received: from VI1PR0402MB3517.eurprd04.prod.outlook.com (2603:10a6:803:b::16) by PAXPR04MB8160.eurprd04.prod.outlook.com (2603:10a6:102:1cb::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.16; Thu, 19 May 2022 17:43:38 +0000 Received: from VI1PR0402MB3517.eurprd04.prod.outlook.com ([fe80::a8d9:7211:83e:46db]) by VI1PR0402MB3517.eurprd04.prod.outlook.com ([fe80::a8d9:7211:83e:46db%4]) with mapi id 15.20.5250.018; Thu, 19 May 2022 17:43:37 +0000 From: Jeff Daly To: dev@dpdk.org Cc: Stephen Douthit , Qiming Yang , Wenjun Wu Subject: [PATCH 1/3] ixgbe: make link update thread periodic Date: Thu, 19 May 2022 13:43:23 -0400 Message-Id: <20220519174325.23308-2-jeffd@silicom-usa.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220519174325.23308-1-jeffd@silicom-usa.com> References: <20220519174325.23308-1-jeffd@silicom-usa.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BL1PR13CA0026.namprd13.prod.outlook.com (2603:10b6:208:256::31) To VI1PR0402MB3517.eurprd04.prod.outlook.com (2603:10a6:803:b::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d73f6f53-3f5c-4285-592b-08da39bf1ab9 X-MS-TrafficTypeDiagnostic: PAXPR04MB8160:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: haawHoJjXNCAIf9cOvy74o/pa8sHE8q630dccJpaV8Lwf55N/7mS9lHVp0mcDplKEvUYQXKiCQmb1vF6oavgjCLPU2XJ6Ecv3ugx4CnSnPFyjI/ASPIF8yLtRyYSrk8FjfJQZzLgYCOrNdifcbkQD2ZQp03Vnlufe9AqPc2NNfxH7LBOAkffJ8bmU/ZHtSnCMy5tnOcV7rpVHhrkErYWSFinfyD+LDe8dXbjSSGkA0+2xU4yT/EfvWufx4vzPpHvV5e4MOi3AxPJ4mIIcQbKSLG3IR3TjIRmO6PsVxKry9AdiYKNFWwFyfyiaHq2WQ1pHeavWYafKaH4kLZBsxrat+V35I0LL7PXWjyK1HwAa0ltvOIPY8LWE+XZDLQ04MTu/wOJRTOiKQ8m6+uSerOAJRetNDvBo2h7yP5rnjqgLdj9btQJsCAF09AXyKpEXfgOleGh5IrYBc5y8bmNN979jWo8BM5DBRHAFdwHuCSx4GcL6MVjyND4lnt9y1SEwtNfeJX2ZbOsBEryodcJziHyYSAX8mPEKwtS9KSqDO/9LtJLYrtdhAw5dJ7WKk+daY7T5xdQBr0Cwj1QpD0Bg1FA3zZoe264SwSyjQqVMGl4GBTnXSRmlIZpaBU+2TTh9INiU55+sbazmX4IrcSzadpQZAq5O0PA+U+MomBR9shGId0MnhILyQtXWABp2YvfbMdZkT0980AyhvQr/E71mWwU9g== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR0402MB3517.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(6506007)(2616005)(6512007)(26005)(36756003)(83380400001)(8676002)(66476007)(66556008)(15650500001)(4326008)(38350700002)(6666004)(66946007)(52116002)(1076003)(186003)(86362001)(508600001)(2906002)(38100700002)(5660300002)(8936002)(3450700001)(316002)(6486002)(30864003)(6916009)(54906003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?MDcKcBMnq38MSb7BQcO94QEWkBzK90+go9jUs8kw94d0gDtRoY+DjgTbSUIC?= =?us-ascii?Q?5QC6Hkbaaqjl2HojYVFYsuE3/0mGgcr7a0keDWulXhqhbtroW9qCThc69Lja?= =?us-ascii?Q?MmHtIBgMr/WmS28EjZlzPOFj77KunANmiFOtJ8v3zzcpsbc4tghcPzuhrhFL?= =?us-ascii?Q?rXh2r6QaeTt91Ad7Z1Bekpq1yZSyjMfarQ7Y1Qkx93GCfnhva0OXOQuvOR1J?= =?us-ascii?Q?NrODWBVv23kGDuU3ZU2GfmpjZacVPSLDbGO7nP9W9lViJaJsWLZx3gs8RfoP?= =?us-ascii?Q?+iQRKqkjO66Lq0G5vKZe3VHHH/xRDY3oTpcYak4hx8NU+7llTmwQJ0AD8iUq?= =?us-ascii?Q?a1Hja7FK+j8k73oubtUcdhSMnuzDkyNSl6qiJMAeXSwpKFFA10ZfhXQ+a0Dt?= =?us-ascii?Q?AKSd0SCdqbOk/L1hsn979odKwD+/0XISzKjMXYfSScYvqw2dFPIaXFPLaYJs?= =?us-ascii?Q?QYf8VH4JuU18H+uQt/lVuxH5QG3Vp8ShU8uwj9DEVSqEYDFNM4uG8o39Jf8b?= =?us-ascii?Q?QYdu3iT3yXrS29rgz95fJDH/fAgyGRdXpi4k3KYlWo6Ocl66jA70cUx3MFwE?= =?us-ascii?Q?cge6kSrG7C9blAe7kPWs/zSREC0XREXeGnpYpVi9yZteB5I2WH2RrJ3AnkkY?= =?us-ascii?Q?XBI7LSOfCbW3TchSOJgx/HJmzx9cnlksBnJU8zeQOzqpVl3oWK1KjvulRpNg?= =?us-ascii?Q?6gMq3J/u53FTUhcf7uEMrtm8f/3mFaRxeT1FSTTEk/m5VZVjvay3nXMDaLIq?= =?us-ascii?Q?jIlkRttWRVqwsOgPJzUGjtFqCUKn2vC/W1aTZMqSkujCJ6t8qY2JHtnYhm0Q?= =?us-ascii?Q?/bIc0Q/PSbs2/lRxRguAcOViisArLvq3gUz42uilu0wZyPhfsEV0aqXRWW80?= =?us-ascii?Q?Y9vSmwUt3dFkirGdqnwlczQpxDgDQb8OK1RpcoIDVX+Wjf3tirZDlWz+7qSI?= =?us-ascii?Q?axqOLcBlqb1HQvATTDMTtmFF4JyPQkBV6kdOsChQZmN8tOZash8HW520QSPc?= =?us-ascii?Q?WTuoOYxR7a4qTzUzkiRbx4qlInnQfQ1pWlSDiiXYDl7D+m+rQiJ77/XiyuF4?= =?us-ascii?Q?n9TZKH3U8lh8DCRy4EkxCl+ZAWarnp8rNyOFIW1tVV4rojz4Yt1ei3cObPpn?= =?us-ascii?Q?a6eAmbhZxaPr9NRho039kiaEh/+gYa1qcXChSyVhw7qdi9+9/KkcjLJYmD91?= =?us-ascii?Q?YUG4gXyW8nQFv1JJsbeH+3i5kEI6ksxBDI/sB9EvgRBBoywXWABZ2+AEQD5w?= =?us-ascii?Q?hOCAmQNej+rBMzpz2SsCJSbTqjac/5WDJlmxlXQpfcJCkwiTkePP+7IvW7Kz?= =?us-ascii?Q?o0B/4udHkx5/RQ2X/jKaNhPSImdo84+v2S04BL5zmE3Zody7YdC5r0/Ryy5/?= =?us-ascii?Q?PqtLCCL9zjAwcrZP0G8Q95j/8gCrvRnt9TLafRJkBo68ngg3GtLlpUi1hsSg?= =?us-ascii?Q?yt5Y6+fKj05jrN4garb0RoHLxoydnA/klHTOlkQtnxSpWGFAPirC+Ksf64y0?= =?us-ascii?Q?UwxUFEnux5N47Kz8VS9dygCk8xntEUHgVHicw0HZr3wH7JfC/6/S9NUNLVfy?= =?us-ascii?Q?LxUESRKO7x8myiZ3H0GyA88l87W3i5SYWHJm7RLUpgcltRjItw6FQGU6xuz0?= =?us-ascii?Q?XHNhK/Zmnj3VYvmrIyPIfXWtTluw/IQiOYc/EUAs4PYmexTMC4+RHXuviD74?= =?us-ascii?Q?Y9g9Dddx8GC4IWxj8MGyhIlCBPrMYT0nEFCBfkNLEaifpP1Yy6IKa1vAjx3V?= =?us-ascii?Q?H3h7QGIQlA=3D=3D?= X-OriginatorOrg: silicom-usa.com X-MS-Exchange-CrossTenant-Network-Message-Id: d73f6f53-3f5c-4285-592b-08da39bf1ab9 X-MS-Exchange-CrossTenant-AuthSource: VI1PR0402MB3517.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 17:43:37.8425 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: c9e326d8-ce47-4930-8612-cc99d3c87ad1 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LeBmb8Z1qI1rEj1WN8L0RRCxb5zONCOa2atzc5vn2izeHtOZwkvDtwCynxAVMN28QreJYP75EvFFo5Bcd1/h+g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8160 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Jeff Daly Errors-To: dev-bounces@dpdk.org Rather than run-to-completion, allow the link update thread to be periodic. This will set the stage for properly handling hot-plugging. Signed-off-by: Jeff Daly Inspired-by: Stephen Douthit --- drivers/net/ixgbe/base/ixgbe_common.c | 4 +- drivers/net/ixgbe/ixgbe_ethdev.c | 180 ++++++++++---------------- 2 files changed, 71 insertions(+), 113 deletions(-) diff --git a/drivers/net/ixgbe/base/ixgbe_common.c b/drivers/net/ixgbe/base/ixgbe_common.c index aa843bd5c4a5..712062306491 100644 --- a/drivers/net/ixgbe/base/ixgbe_common.c +++ b/drivers/net/ixgbe/base/ixgbe_common.c @@ -4154,8 +4154,8 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed, break; case ixgbe_mac_X550EM_x: case ixgbe_mac_X550EM_a: - sfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) & - IXGBE_ESDP_SDP0; + sfp_cage_full = !(IXGBE_READ_REG(hw, IXGBE_ESDP) & + IXGBE_ESDP_SDP0); break; default: /* sanity check - No SFP+ devices here */ diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 2da3f67bbc78..81b15ad28212 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -230,8 +230,6 @@ static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev); static void ixgbe_dev_interrupt_handler(void *param); static void ixgbe_dev_interrupt_delayed_handler(void *param); static void *ixgbe_dev_setup_link_thread_handler(void *param); -static int ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev, - uint32_t timeout_ms); static int ixgbe_add_rar(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, @@ -1039,7 +1037,6 @@ ixgbe_swfw_lock_reset(struct ixgbe_hw *hw) static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) { - struct ixgbe_adapter *ad = eth_dev->data->dev_private; struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); struct rte_intr_handle *intr_handle = pci_dev->intr_handle; struct ixgbe_hw *hw = @@ -1094,7 +1091,6 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) return 0; } - rte_atomic32_clear(&ad->link_thread_running); rte_eth_copy_pci_info(eth_dev, pci_dev); eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; @@ -1547,7 +1543,6 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev) { int diag; uint32_t tc, tcs; - struct ixgbe_adapter *ad = eth_dev->data->dev_private; struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); struct rte_intr_handle *intr_handle = pci_dev->intr_handle; struct ixgbe_hw *hw = @@ -1590,7 +1585,6 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev) return 0; } - rte_atomic32_clear(&ad->link_thread_running); ixgbevf_parse_devargs(eth_dev->data->dev_private, pci_dev->device.devargs); @@ -2558,8 +2552,11 @@ ixgbe_flow_ctrl_enable(struct rte_eth_dev *dev, struct ixgbe_hw *hw) static int ixgbe_dev_start(struct rte_eth_dev *dev) { + struct ixgbe_adapter *ad = dev->data->dev_private; struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ixgbe_interrupt *intr = + IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); struct ixgbe_vf_info *vfinfo = *IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private); struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); @@ -2580,9 +2577,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); - /* Stop the link setup handler before resetting the HW. */ - ixgbe_dev_wait_setup_link_complete(dev, 0); - /* disable uio/vfio intr/eventfd mapping */ rte_intr_disable(intr_handle); @@ -2700,8 +2694,16 @@ ixgbe_dev_start(struct rte_eth_dev *dev) if (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) { err = hw->mac.ops.setup_sfp(hw); - if (err) + intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG; + err = rte_ctrl_thread_create(&ad->link_thread_tid, + "ixgbe-service-tid", + NULL, + ixgbe_dev_setup_link_thread_handler, + dev); + if (err) { + PMD_DRV_LOG(ERR, "service_thread err"); goto error; + } } if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper) { @@ -2825,12 +2827,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev) if (err) goto error; - /* - * Update link status right before return, because it may - * start link configuration process in a separate thread. - */ - ixgbe_dev_link_update(dev, 0); - /* setup the macsec setting register */ if (macsec_setting->offload_en) ixgbe_dev_macsec_register_enable(dev, macsec_setting); @@ -2860,13 +2856,21 @@ ixgbe_dev_stop(struct rte_eth_dev *dev) int vf; struct ixgbe_tm_conf *tm_conf = IXGBE_DEV_PRIVATE_TO_TM_CONF(dev->data->dev_private); + void *res; + s32 err; if (hw->adapter_stopped) return 0; PMD_INIT_FUNC_TRACE(); - ixgbe_dev_wait_setup_link_complete(dev, 0); + /* Cancel the service thread */ + err = pthread_cancel(adapter->link_thread_tid); + if (err) + PMD_DRV_LOG(ERR, "failed to cancel service thread %d", err); + err = pthread_join(adapter->link_thread_tid, &res); + if (err) + PMD_DRV_LOG(ERR, "failed to join service thread %d", err); /* disable interrupts */ ixgbe_disable_intr(hw); @@ -2945,7 +2949,6 @@ ixgbe_dev_set_link_up(struct rte_eth_dev *dev) } else { /* Turn on the laser */ ixgbe_enable_tx_laser(hw); - ixgbe_dev_link_update(dev, 0); } return 0; @@ -2976,7 +2979,6 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev) } else { /* Turn off the laser */ ixgbe_disable_tx_laser(hw); - ixgbe_dev_link_update(dev, 0); } return 0; @@ -4129,54 +4131,58 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, return ret_val; } -/* - * If @timeout_ms was 0, it means that it will not return until link complete. - * It returns 1 on complete, return 0 on timeout. - */ -static int -ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev, uint32_t timeout_ms) -{ -#define WARNING_TIMEOUT 9000 /* 9s in total */ - struct ixgbe_adapter *ad = dev->data->dev_private; - uint32_t timeout = timeout_ms ? timeout_ms : WARNING_TIMEOUT; - - while (rte_atomic32_read(&ad->link_thread_running)) { - msec_delay(1); - timeout--; - - if (timeout_ms) { - if (!timeout) - return 0; - } else if (!timeout) { - /* It will not return until link complete */ - timeout = WARNING_TIMEOUT; - PMD_DRV_LOG(ERR, "IXGBE link thread not complete too long time!"); - } - } - - return 1; -} - static void * ixgbe_dev_setup_link_thread_handler(void *param) { struct rte_eth_dev *dev = (struct rte_eth_dev *)param; - struct ixgbe_adapter *ad = dev->data->dev_private; struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct ixgbe_interrupt *intr = IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); - u32 speed; - bool autoneg = false; + u32 speed, start, ticks, service_ms; + s32 err; + bool link_up, autoneg = false; pthread_detach(pthread_self()); - speed = hw->phy.autoneg_advertised; - if (!speed) - ixgbe_get_link_capabilities(hw, &speed, &autoneg); - ixgbe_setup_link(hw, speed, true); + while (1) { + service_ms = 100; + if (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) { + speed = hw->phy.autoneg_advertised; + + if (!speed) + ixgbe_get_link_capabilities(hw, &speed, &autoneg); + + err = ixgbe_setup_link(hw, speed, true); + + if (err == IXGBE_SUCCESS) + err = ixgbe_check_link(hw, &speed, &link_up, 0); + + /* Run the service thread handler more frequently when link is + * down to reduce link up latency (every 200ms vs 1s) + * + * Use a number of smaller sleeps to decrease exit latency when + * ixgbe_dev_stop() wants this thread to join + */ + if (err == IXGBE_SUCCESS && link_up) { + service_ms = 2000; + intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG; + } + + if (!ixgbe_dev_link_update(dev, 0)) { + ixgbe_dev_link_status_print(dev); + rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL); + } + } + + /* Call msec_delay in a loop with several smaller sleeps to + * provide periodic thread cancellation points + */ + start = rte_get_timer_cycles(); + ticks = (uint64_t)service_ms * rte_get_timer_hz() / 1E3; + while ((rte_get_timer_cycles() - start) < ticks) + msec_delay(100); + } - intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG; - rte_atomic32_clear(&ad->link_thread_running); return NULL; } @@ -4219,11 +4225,8 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, int wait_to_complete, int vf) { struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct ixgbe_adapter *ad = dev->data->dev_private; struct rte_eth_link link; ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN; - struct ixgbe_interrupt *intr = - IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); bool link_up; int diag; int wait = 1; @@ -4238,9 +4241,6 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, hw->mac.get_link_status = true; - if (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) - return rte_eth_linkstatus_set(dev, &link); - /* check if it needs to wait to complete, if lsc interrupt is enabled */ if (wait_to_complete == 0 || dev->data->dev_conf.intr_conf.lsc != 0) wait = 0; @@ -4255,7 +4255,7 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, else diag = ixgbe_check_link(hw, &link_speed, &link_up, wait); - if (diag != 0) { + if (diag != 0 || !link_up) { link.link_speed = RTE_ETH_SPEED_NUM_100M; link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; return rte_eth_linkstatus_set(dev, &link); @@ -4267,32 +4267,6 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev, link_up = 0; } - if (link_up == 0) { - if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) { - ixgbe_dev_wait_setup_link_complete(dev, 0); - if (rte_atomic32_test_and_set(&ad->link_thread_running)) { - /* To avoid race condition between threads, set - * the IXGBE_FLAG_NEED_LINK_CONFIG flag only - * when there is no link thread running. - */ - intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG; - if (rte_ctrl_thread_create(&ad->link_thread_tid, - "ixgbe-link-handler", - NULL, - ixgbe_dev_setup_link_thread_handler, - dev) < 0) { - PMD_DRV_LOG(ERR, - "Create link thread failed!"); - rte_atomic32_clear(&ad->link_thread_running); - } - } else { - PMD_DRV_LOG(ERR, - "Other link thread is running now!"); - } - } - return rte_eth_linkstatus_set(dev, &link); - } - link.link_status = RTE_ETH_LINK_UP; link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; @@ -4566,6 +4540,8 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev) static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev) { + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); + struct rte_intr_handle *intr_handle = pci_dev->intr_handle; struct ixgbe_interrupt *intr = IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); int64_t timeout; @@ -4605,16 +4581,14 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev) if (rte_eal_alarm_set(timeout * 1000, ixgbe_dev_interrupt_delayed_handler, (void *)dev) < 0) PMD_DRV_LOG(ERR, "Error setting alarm"); - else { - /* remember original mask */ - intr->mask_original = intr->mask; + else /* only disable lsc interrupt */ intr->mask &= ~IXGBE_EIMS_LSC; - } } PMD_DRV_LOG(DEBUG, "enable intr immediately"); ixgbe_enable_intr(dev); + rte_intr_ack(intr_handle); return 0; } @@ -4637,8 +4611,6 @@ static void ixgbe_dev_interrupt_delayed_handler(void *param) { struct rte_eth_dev *dev = (struct rte_eth_dev *)param; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = pci_dev->intr_handle; struct ixgbe_interrupt *intr = IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private); struct ixgbe_hw *hw = @@ -4668,13 +4640,10 @@ ixgbe_dev_interrupt_delayed_handler(void *param) intr->flags &= ~IXGBE_FLAG_MACSEC; } - /* restore original mask */ - intr->mask = intr->mask_original; - intr->mask_original = 0; + if (dev->data->dev_conf.intr_conf.lsc != 0) + intr->mask |= IXGBE_EICR_LSC; - PMD_DRV_LOG(DEBUG, "enable intr in delayed handler S[%08x]", eicr); ixgbe_enable_intr(dev); - rte_intr_ack(intr_handle); } /** @@ -5316,9 +5285,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); - /* Stop the link setup handler before resetting the HW. */ - ixgbe_dev_wait_setup_link_complete(dev, 0); - err = hw->mac.ops.reset_hw(hw); /** @@ -5398,12 +5364,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev) /* Re-enable interrupt for VF */ ixgbevf_intr_enable(dev); - /* - * Update link status right before return, because it may - * start link configuration process in a separate thread. - */ - ixgbevf_dev_link_update(dev, 0); - hw->adapter_stopped = false; return 0; @@ -5422,8 +5382,6 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); - ixgbe_dev_wait_setup_link_complete(dev, 0); - ixgbevf_intr_disable(dev); dev->data->dev_started = 0; -- 2.25.1