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 6687AA0503; Thu, 19 May 2022 20:03:22 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AD28442B79; Thu, 19 May 2022 20:03:20 +0200 (CEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2119.outbound.protection.outlook.com [40.107.22.119]) by mails.dpdk.org (Postfix) with ESMTP id 2CB3F40156 for ; Thu, 19 May 2022 20:03:20 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mN3mWXNDkyy9+I94Q7BXzyRBOLhymsUe0Wv0amN+afsShlE5VYJHNH2B2b7XhPltcgh0TtXjGdytXWWF2BnpQQ9PR5+UaWPb2VUQi5/wXCbEWCgg9y5MpapOYkUBn1wFDvBCCMs3+o4MxYbe2r++XD2nvMb4zGwRb/0nfSc4DG9jcQCmEwFR903c7mjHsHvYzJC/b7KX203+0koN+JpznQpwbLY/IqMIGET1jGQBRO5LSx9qlwsxUsrJc/o5fGv7LwTVcp/oFSGsvuiYMypsnZi+Z1cOv/qOvj38VHGgGEdGJPMRPTgDoZq5n6qZbRQ9FySrSg7CjE1NFJQhJo5vjQ== 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=BgC5dZfQDyu1Uf+zsrEYnVb+lNiQEqVEZPuhFmb4Gc4VYXYoAkGgU9R2vn7bDuCzvhOMlBP02MgMRBZPMiCi+FG9Db+b12ZMBRs7q9DKCE3nk8qBFEO8a4Yh4jQE84kD65wRE0E46w9Aanzhf+GEptnB4TSiYwx153NkcTL8tW5lZctBFY2beOKh7J3hv2u18Y6g6XBQs/3+1Bb8IVqXDUueRms5UKL9WojhQBgGU2hbhzueNeYze5vdrM3goKA1bbCb08c4yboGEhNak4JB59N1FaJiaGcfeErCpbEaqNjGNReTdZqRz5JsXYWGvjvH62/GeuC3vIQwmVQg0xSuKA== 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=rHlqw6maAFZS7Fn/7pPrRc3Te7R2XEmTuAjpGFVh4nOelTzmIIjt+VO2Jn9j2bD+TtwstmCYhME7G4pr1Dg61AKbuFK16n/Ux3qx0ovFLYHyQ4Q38YnJ1747xxtcrgvhkDCHDKAzo38jFndm+3POkZfSlby0rRjGmKH2EtHxqH8= 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 AM9PR04MB9001.eurprd04.prod.outlook.com (2603:10a6:20b:408::24) 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 18:03:16 +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 18:03:16 +0000 From: Jeff Daly To: dev@dpdk.org, Qiming Yang , Wenjun Wu Cc: Stephen Douthit Subject: [PATCH 1/3] ixgbe: make link update thread periodic Date: Thu, 19 May 2022 14:02:46 -0400 Message-Id: <20220519180248.23831-2-jeffd@silicom-usa.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220519180248.23831-1-jeffd@silicom-usa.com> References: <20220519180248.23831-1-jeffd@silicom-usa.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MN2PR03CA0006.namprd03.prod.outlook.com (2603:10b6:208:23a::11) 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: 241a9687-ecaa-41cc-6766-08da39c1d915 X-MS-TrafficTypeDiagnostic: AM9PR04MB9001: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: p/IC0rDggVJmA7AOPB8mX4TDYPJbFIwdJxbfGsyzVpRg1xenAREBCMJt151NdK/yWgnNcQFc/SoRPExDPfr4ZhGk7tFnYnO5XljpBh5S7k1d3xEDqE9gaqiSWjxJhCrYMX9RSjkTYyR/OSWGcbMdPbTaOgh3eL5HQ5kJSU5+uV5JJ0SSM+JaWU9UAKPkpkZN2483ORvxiW/Wo7jdl/dET9mhwlZOBr8jKGryqI697gc+VAo/ppuJOpXTCHi87hpExWLK62RgjJmZBPm8G8/fA98l6AF2Q859gW5kDpUiJc2ZU13d/Dp7VFVC4VcGnPUrW+riP8fgDgE13K38y3skcq5qRXKf6E7Wp+e9MGunUxtJ/+XIxJ6PyLRb99NVEcDoF+8Ebj+n6vA58XfL9+4p7FTFNUgXlkIs8u7Ie+IvTAyLgm5GfNUo1UsabSw5gVMPm4n8lhCo5C/wbMcQ1CpiRsXpt5woWrSyxU8zJKlMKB8LDwTxdauuuPNsjS/vFknfmt6/4f3TixbaicH6Yamzb4Lv9KcgHq6EsMkLzgX3czkXNSWpP6tufBn+cymwDi8ILbUrejNrqUiazTHZeUDOrtUQlSI6NeRdagdOoW7SHfjKzRuBsf1x+4p09IF9nAcS9GqRxKZJ0r2uR0gxM3lXEe6bqw8NXrXLTKVCBcOqYPlIzd5+4X1Kgri+cr6dEtYBymlhex0YHksc1YYSqfjVbw== 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)(83380400001)(2906002)(15650500001)(52116002)(6666004)(1076003)(107886003)(186003)(26005)(6512007)(6506007)(2616005)(30864003)(110136005)(316002)(8936002)(36756003)(66556008)(4326008)(66946007)(66476007)(8676002)(86362001)(5660300002)(508600001)(38100700002)(6486002)(38350700002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?L6KQbZDRiLIG6yrSPgMkNty/LqI4qLKfO1qaJkWti8jXcpn09Ql/7AT6RMQV?= =?us-ascii?Q?VrfaAbLRhBzAteeb4U3yU6lhMQn9KffBgQ6xrYMxuA9rqn5LIEy+WSfk4Bn2?= =?us-ascii?Q?1m2qDtu3P8pj/HGPSp3KP/e4LVWeDjoIlQ0QMvaUnzTdcXIkh7mswqDOWrGt?= =?us-ascii?Q?daBNeOTLbh5lHMWzh5X8iHrhXaAzYdLw1/AC8XLFr556e0t8isYpLuJkazl4?= =?us-ascii?Q?IJsxcamahb/0vBHf2zcEtT0x5Jj2oTNudjmmT8vL/zW/L+58I1GxvFrL5q2n?= =?us-ascii?Q?tvdnSMiMMoj4NvlNey+p4QVsiVdII0SjjhWsJjY6u+ONZcBAU4AaJddVju0q?= =?us-ascii?Q?Pod1cFWpk//4Ziy0n0e6j+jvP5FNnNfsTjRz6vCDoipiNcbeL5lCfJX1IodT?= =?us-ascii?Q?CJgk5/U8kEXYxvT7zUmdC6CNFaF2JFpiCpZor6pDzesj82W4v9frCX4LnB2C?= =?us-ascii?Q?5cbEH0BJUQq3oZE/hgZhbqM7xabwaqL0HgB16AGwUEgaVNu+SqhcPJUpq52S?= =?us-ascii?Q?YxLRp3jdyIe3faYXFDI4obz35yCU+VBOPpTQKMbutvEDLi//NigN9dSx3Ybo?= =?us-ascii?Q?3WHapcgl5TuuB8lbx8iiFgCXUPQJOgotyCBMrVo2MpJtsbGlopWXiLWCU8Tt?= =?us-ascii?Q?zgMRlRlMcI8nemp3owi9N/HMz39RZEpBAYSzPon4oeRDI86jxq8JtQiAAH63?= =?us-ascii?Q?ItKs9ij5nGpTqDHuKfhIQRYzDCdfn3V2mDjdXdTwrDt36TkeYkAudEAmL4Jg?= =?us-ascii?Q?sCf6T90QohUJMDbgPqKwTnhsZ+pcQ8DiLNRD6pPHn6QmDn5j+YasjHOQ1XTh?= =?us-ascii?Q?VBjHb0Mv9wSB6dlNzJwJ5jNjXMYYWti44dL9axWsTgWqhN56qgZTa8BKva7A?= =?us-ascii?Q?nxoRAmnrtZtzetkQnbwCAb5xcJqPaKK9NJ5ryaCWXOPOtGr8jXlJrdL2a5WX?= =?us-ascii?Q?9LmQSae82YYkQQASYYZ0mDrYpCMNFn1AaU/Kx06KDoGZ0ZzgUZvRdQdVEHpT?= =?us-ascii?Q?9DleCC8m0ptZlb2o0mb2FcRbOKgwKU6VJEPBt8qivjKxLNPpN85gpC/ARLod?= =?us-ascii?Q?fLLjL7mipDUnI7FbsT+ECBop4VDvav8lm7RkCe6mI15TEP5O/xYl31uPqeNV?= =?us-ascii?Q?YIhpddvNYV3t+ZcoDOwA3t3uyWYuBz1h/BADaSahYwHQh/7vi2sxojTAVa9o?= =?us-ascii?Q?4h7hqtuRuLUppnag+pTJ29QlkptMo9kxP0KQdvwQTlgPzFKcOU/LF22wP3hp?= =?us-ascii?Q?M/EhEN65TaUyYxpri06crNWN45hId1c1salJJGxTGO3pocFJ+0JqXSclfqjA?= =?us-ascii?Q?M4qnmC4U+7QZ8mWGYRozkMGRqg5un/Scve8Iv3UKpT/0fn7+gb92j4mkLofL?= =?us-ascii?Q?XwvJPRwd/GYewwMm//nu0nJ87wXPz1WEE3JnFyRwci/LTPzYrPtN4PXY9m7y?= =?us-ascii?Q?Bb5ctrAgNF6mmKNlLixA2ooPAfhkHDBCUuTyEOkEDEy91YTGaa7mshilLj6D?= =?us-ascii?Q?iTKvtJxNwVOI0YA0kOqZRoXMgLXEav9oHu8hA6PVdcgswiDag26bF6qBRA6r?= =?us-ascii?Q?EE7hFFs8QiJ3wmEf6QaCc1H5tchroFH9xlLVfj9oWq0K0TLYye+ulfX0PmEr?= =?us-ascii?Q?wCmiiMlBTPoqT4Q9AYRtl/Ucf22fe4cx5p7UkM5O6qVlsrYRjl8ag/p/g/7i?= =?us-ascii?Q?EeQSyIF8GrXh5LcWpJVu96y66ku0cZY1rD5p7IeqzzylXsflu68Vi4weJIWe?= =?us-ascii?Q?3qILCkGgcQ=3D=3D?= X-OriginatorOrg: silicom-usa.com X-MS-Exchange-CrossTenant-Network-Message-Id: 241a9687-ecaa-41cc-6766-08da39c1d915 X-MS-Exchange-CrossTenant-AuthSource: VI1PR0402MB3517.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2022 18:03:16.3313 (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: a3Suteunk0vrMWn8FY0/slBmwawh0SCj3WQYBFHwBrRohNdkqQOWkmEaB78wFVD91+tD0j53EinqVk582+gb9w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB9001 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 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