From patchwork Thu May 19 19:37:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Daly X-Patchwork-Id: 111444 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7DF5BA0503; Thu, 19 May 2022 21:38:01 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2751840223; Thu, 19 May 2022 21:38:01 +0200 (CEST) Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00095.outbound.protection.outlook.com [40.107.0.95]) by mails.dpdk.org (Postfix) with ESMTP id CE35E40156 for ; Thu, 19 May 2022 21:37:59 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=corHFgrZm0SH4VOVseSgtG62xyDkQRLX7wWaHiBCnEkmz6ekf3Hh4Sd6XK10fot4boMQzjtdmX+805Lf4G9St13ua+oe/C2mn3HBCb/nw/WCvF1YiO16oHYLdojMVjaLuFb9gSwKviDrBrGC8nU7QQwXT1MLdAeboJ1bP/kTfyWVWGTvrGRmKlmT+SD+G+yLzYubUZuHqaLMfASGqEDvpbADJRf0/YpZxZAdFk4HoapXt9wOnEMAo5TNM0EWc9OL0T/tGkhWVx1mawDoB+1lTLlqJNe1poATa67fI6u8uGctI8PqaB2IdDlu0KIq1do5yl7Dz/xHL3qEJju1sd41Hg== 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=O8VZnZsHaGRBjYJ4Uhj45f9cEFWOD2IWXCHQEYhN/BA=; b=R/HvGtuvQfD8GuKg4434hW9UTVsBjAGe95yMZOFrhD9camTIYCG1C1U+xJEygY/PuaAYRC91UdAZDkpr6zI373M+1/7QWyiNO/DEkhKznH9dqxTwQH3Nxie/oVeGkx58sz7F9Shp1tqPgY56NZ8SfTIdmxGS725sOOuANuXtsQ5J6XImiua+pZWx2s983LSI/AEdU6ghfwDx69T0XgmWXoFjbwChBN28G0B4/QntHxF1x6+3hQ90IeeKxyF7XQtTIPYgpKF+3B34NbZyHj9Ixj96exVD+NXD5vGUqGMSXwuVWoTbVwTDohEM+ynXVWvb/0tGxHImiHaBQGzJtyF0nQ== 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=O8VZnZsHaGRBjYJ4Uhj45f9cEFWOD2IWXCHQEYhN/BA=; b=g3Ubgde2sKZcJULTh97TLwE3jkrpYtO5Csv0co1n3ebLybQBjM/RetXqIe4WMPJ9POnIoJLgii3pNEnkPu5bEkOb4tJmxa4ANXXw4WrNlARG5tRVutpVlAabSEUYXecxZqMXSbu7h/gvvI27PE4RP39Xcd3HXb82x5kdgAMlHew= 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 AS8PR04MB8530.eurprd04.prod.outlook.com (2603:10a6:20b:421::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5250.18; Thu, 19 May 2022 19:37:58 +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 19:37:58 +0000 From: Jeff Daly To: dev@dpdk.org Cc: Stephen Douthit , Qiming Yang , Wenjun Wu Subject: [PATCH v2 1/3] ixgbe: make link update thread periodic Date: Thu, 19 May 2022 15:37:36 -0400 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: X-ClientProxiedBy: BL1PR13CA0105.namprd13.prod.outlook.com (2603:10b6:208:2b9::20) 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: 94cc8d45-95c5-47c4-24f2-08da39cf13b1 X-MS-TrafficTypeDiagnostic: AS8PR04MB8530: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: tUi5tTlc7Os7LVQzZDWR4y8UsPQ807qf6WdYV85FvSNgSyMsHiTlDhXwjDFQ9WxpsKnM4WbaZiN3PWB1BCvJ3YwosY53AyvUtyhurXuOXHkpKp7AHmRr4kSu1AeIZpQtIo8ZEyi4uUp2jRpFNLFR65LbS29mGdaCvM2qP/zPpdJDk6ZHzrY0lq+Cb8VMzMnzDW93gE0yHv0XZBGbHbSZ0SO/hCVbSIY6bSEwEnhtdkvWs2PR76geFTTMtnpgzpAR/SuZ6pnTtvKzB5bHXSXXi0UXZf18sMIr4gMuTSE6FPpTolui9d+vHZG+nR8Z1lFOYSGpq/6HTLMmLOb70zWW7Id+mj5Xj8y0/kv6o7xL7Jw9MiLo+pw7LOdQ8HrattzxaiWaU5WnwBJ8kiwtd9Ok7MlQD4Z7crWvreKHodiSWQ3WYONatyCQt1LCchHo74TL5ugaKNEKinmkAf+WK/9bwgW3XoH738UYGc8nLX6CkgkIE9FQUhs8G/+zpQJYG2YCecUsaiAUM8RTQNpjhNQXL1LrzTSUEW+YpCV56OkmdsGnFvrwTjbN7TbsFPP3df5xXNsoTT8NAFvbwFtspVJBecbiOQLBMj1O5yGaqVC6WEx0t+pQ/3aryv3dsU4VUR2yS8HFnkvP/ifjVcCXc7naemurHqbyr6Coxw4SxXsRxClLFSmjFVAYGSYESJHgxXCgF6uC8ufO7eJLLJ2deJY9jw== 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)(15650500001)(2616005)(66556008)(6486002)(2906002)(8676002)(8936002)(83380400001)(6506007)(6666004)(52116002)(6512007)(38350700002)(508600001)(5660300002)(86362001)(66476007)(316002)(36756003)(186003)(30864003)(66946007)(4326008)(54906003)(6916009)(26005)(38100700002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wKI3JnXezWFT6Qdvnx15LH2aGIr05G5yxvw3VrPhNiwTBAZ4+IkeppMvMZ9AEBC26AiYnHmJ6FZH2sYQqU/nvXlyhSoV+oUSHQxMv3/ghOWoQCrScrwFsTviZMFaD6Y5hpoG2VeWBFeBBFIOJPj6qXhFgqexvMyKakocOLDqck2W40WT6NcBwdZtDygk5/dBwNkyuHmIIcOk6Jmu+USR0DKwEt2rDKouJ5aW9+m/5ZWFB+wm1LSR4Fczu7fAHbwgM8p8GDc8IaM5c6ScCe3kPLuCt4tPVFqSrP7GlquKWOBnSsbtUHgooC91E8+PPfxS1XkPhTEzdJbWPpvH3EUu3smdN8IY++J5bpeT+Xgsh3h+dM7+GfxKWEiVhx9jSRgdviD2qJ4sRjuTiz9Jc8U7y060e0x7quGkv+bJ3gzwJPBg9/TI1Qo3H58bUEH6XNIR2Zujx6vA3//lCElKjB6thhDcFUOap0HH2AsX8vKxxslepl2fteX4WKhKSrQPPoUEpNB7IODxpKxXGFSva7ZZ+VPD8PbRFqzXztMRSYocWsGigRLKP5B2fbJumJairHbtWCLP6TUdeplK0MSWDCwTtIpDoweou8bYWb5vx+kEOTaqNjMJf09SOXkrujPvFj2YJT2WPgTYrYHOIMBGd1LXxMbMsnb4WE+Pukj8LhD6op88IUP4Vk/JEW8eVDU08AxmwK/rJSrR0n7MbyIA6EEsZMwpBgaaE6KzCMEQtjQDG7XvxMTZjs4VB6o+YUQ0U+2twIzLazWeA00zKGR++RNvPJeiADNgmF6hgMdFFlXM5rf03Vhp/NpBZ5f4Nqd7FpF+BjjYgOXvaqo3MGdw0ir/a7jS8KfIldLscIY7NYaM9wekpUSaNDK3uh/Z3lpDbqITmMDgjJEowINrZrPURQWC2eDI5QvkVsUK0ri/rUSBUf6ZeEBhLJQFxuHRGL8/xJPn/Fk5DIbQrUg9Li6SupPfEaJEc423PnlGAveamqy9LlXFrXUnKczQGuqterYAk1gXw9PIrkUTjMysMMGDkCPZ6p0H8r5PmohlyqXALI1VzowzBOI9c2/y6MXLsyw/FKImStNLCOP/89ybaxetuuORMTmKIBOivhV/lhQEkYkRPfR2c0BZWqhDszJBCuxT69mL+YMHKv+n07tHUijGRCtrEElk/fRYwPZCmMF1uBxMvjRIP6UWFj/0qfPambCEmnJpagayV0nqvrH8y3h/cZGBJTZzG6ssp29mRFwzsJ3NNkB6TOfNwjy3+HQfOvK9ftZz3W7XpQCgIoepB72gv5CLQGWDl6U8UkuJatE1Ssfrui+Ziibi7ZZ/xqdfLpp92FJghbd8XEQOe9vLx4kUMnFwxggeR1MzgCQcuGsOEB4r0AGdqDgtyasQLVsRUFcnOa/ikNjWuVV0pEWLM9kLPLMnpzbp7aP0yxpBZkSeW31JACmaIwlsI67itNhZnq/AnUy+01czS+qD+JuhcXrDldpcKyD4X/3kl6NyZvaNFzv0hBfG3rqOlJ6sHVRXy3p7MG1NLHT0MBKW2fJy6n6RePsEdDNiIG7+4wJMlkgjWJqLrY2IfF0EH50ogtUScYav7uPexnCb8uIqNzlbz19wR8yxm/qfp1q8GuOrXR2RGT6J8xTVdIgNYVr40XFiVFELI6RwWpDdyT+3dEkH4QJ52+5bcti1O7Gnr8EMz/KxASPHpQ0LZrYlaLHtrCq7XiMhZ7pixmmgT8vbcwEHeV+AZ1PvqA== X-OriginatorOrg: silicom-usa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 94cc8d45-95c5-47c4-24f2-08da39cf13b1 X-MS-Exchange-CrossTenant-AuthSource: VI1PR0402MB3517.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 19:37:58.0705 (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: M8vcWNyAkI3ekXM23HmWO9FhRPf7z0X0DT42MR44YxciZtyzSo7qTCsCUj1H3dU/5RVirEBvkUC6q/t5qvw2YQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8530 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: , 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 Suggested-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;