From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0075.outbound.protection.outlook.com [104.47.2.75]) by dpdk.org (Postfix) with ESMTP id 7194CAAC5 for ; Tue, 5 Jun 2018 02:38:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MzVyiS/EGEFJoVpWj/HzUdwsFEwAzaMiVjyTzryJ5hQ=; b=HEgFvqzKqIUAB1dMxnqJ4u4pkd9BBO2Vwoa05xmNqFIRlZtoDChQ69kAW2OToBoGFOfuLKZkuufCCa0URxRo308lIS1sNvS3WTg/09Jt727t/lBlA5zWqRKU9oXxI4rYdcD7wjbgRECV7ZrQM7X5ADPrr4LU45+QyQu17x5hFRw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=yskoh@mellanox.com; Received: from mellanox.com (209.116.155.178) by DB6PR0501MB2037.eurprd05.prod.outlook.com (2603:10a6:4:6::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.820.11; Tue, 5 Jun 2018 00:38:36 +0000 From: Yongseok Koh To: yliu@fridaylinux.org Cc: stable@dpdk.org, shahafs@mellanox.com, adrien.mazarguil@6wind.com, nelio.laranjeiro@6wind.com Date: Mon, 4 Jun 2018 17:38:05 -0700 Message-Id: <20180605003811.14448-4-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180605003811.14448-1-yskoh@mellanox.com> References: <20180605002732.13866-1-yskoh@mellanox.com> <20180605003811.14448-1-yskoh@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Originating-IP: [209.116.155.178] X-ClientProxiedBy: BYAPR02CA0008.namprd02.prod.outlook.com (2603:10b6:a02:ee::21) To DB6PR0501MB2037.eurprd05.prod.outlook.com (2603:10a6:4:6::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:DB6PR0501MB2037; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2037; 3:GcL68+T3SUh/n7VoT1CHnlJ9zmrq2qt6eAMjpLNQ78FnWLoQuCDxRItach99lwBgeMiB4mX0RwaKyDhaF62DNhFvTivVLiZDsczjUMjOhWzpOk2y7mKVunkkrDAduDnuwZMDYzNI2HBWOKW7BmaKdnuMxGQG9c9M2P5CDuoNCQ9QS6l7Bv5X9qFiCHDmpBH9k1DR9C05idyBxm2pysYJR4yFa9uGuqNGr1CKJHP/bfG1eeB7p7klBzdJ0qpiIXuR; 25:osBcE1BSOJVmEuHFf+JJ1UTGn+jnlMYJZSPrxttKLEJf5SsyWBGuIL9X+ECJGZTrKRdfdjtAs1QrUg2Zy5+mV0/pH1fc7BiCnLPSsKOyM0uR/wtCJHnJrnO2xcVvPkygxTR/gc1W4MW4woyGILfhTsD84AFBQaoSW+pZ7U+F6st3dpRDVElVwbUZ2clCpqkq4M7qHZsiLBNQ494woYNkFZ2Iys++d5i3sw9D4IP393MTi/yiyKxucTq1yTk/u7m9ZIOulIUD9Qm4Ayvn0iEVbJpETTwYm/83pnQTR6jdIyitH6807zK1b1haRWibysY3GD9gUNBePI7bqjU+f8MqSg==; 31:5WLahHki+UfEyn51efCbN2SsRIsy5FvR5qUkUkPuQtumz4vmBfUhBRKsflaptVujw3dgCkZogF08CxBTnoNfl/VKNVVtTmZ8uPKOhbU0V5Hg1CLhL+aRHZJL6V8dYkFXcI/NQF4QLtfre50eM2+EcOLYcFkY+ZUwzinBUvbwG63wjXf839s+TQrbnZ5lbH57Ax9G+ypr7g7FkWkbxPGLXLJQM4YO96SX3CqMjSLEu9E= X-MS-TrafficTypeDiagnostic: DB6PR0501MB2037: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2037; 20:L7mzViUX5/H1cJNAwPIwYS1h9U3YREqMOB49WS246+5G7MPsyW/H+tdFeoZ8R3aXVFsS0HTdNmc71pB0YJs+DpDQeDuf/j7JHKUwBjIIjZ66KJnd3vDvE9ndL9YOaQnKowLYJQwwttT4J8DfxH1w0CTnkGMwddBNMOiA1EdwUlc3In/3w2CXOsEclH7twu1oN6x/a4e5u68SCwMuc3wee0mEi3Nzr+Vdg/d1p1jo009qRpy/B6RgqR4pfwz5cw2ourSs3NLedvtFPjLDowczg/PMIZW++vTA76SQ/moG/Ecwx2jGv4urtCvcQ3nlmajyHT12V1EUNUUcCziKXU1FLUwkkpQPpNS53hI6G/oaYa7SXVgAz1zWtjGwJQ1xbQlDayXR7M/77g30mnFD5E8T2aMLpDvtL+UrNyfc/qucIlUZbN0dSSMxGbJVBQwg1n87V1uu+U8HikI4OHoYd3P3a8wAkuQJnybvdpOuflqz8jd6smM7F4UZE8/pWiComacJ; 4:5fB14T42mPG9Ov9Za7MW29Xlk5QrqE1KtFF5uJy8qmbEyvEkFXIcFdmkGSgWExcXnHJbbVQPjSulRYtuqeYWL6Qein00pHmvIUSysXv4aGCCGFCgYl9TpqTLWqAsrdy4rfWUzQrXk+C++vfZcx0sl/lICj1A3S51xvjhzx2HxioZPq23ZLCHFq2nJdGXoloqbfaxze9lz+vW3lK0T7xBDbmF85IWrNwNrZGZht7jQyIm8MH0afEMv4yV5380mlCH3UHEup7e3sZPjZt57HRAkQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(6072148)(201708071742011)(7699016); SRVR:DB6PR0501MB2037; BCL:0; PCL:0; RULEID:; SRVR:DB6PR0501MB2037; X-Forefront-PRVS: 0694C54398 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(39860400002)(366004)(346002)(39380400002)(376002)(189003)(199004)(186003)(68736007)(26005)(69596002)(21086003)(2616005)(476003)(4326008)(486006)(81166006)(81156014)(1076002)(50226002)(386003)(316002)(2870700001)(53936002)(2906002)(956004)(106356001)(105586002)(11346002)(446003)(86362001)(478600001)(575784001)(6666003)(36756003)(7736002)(23676004)(52116002)(7696005)(305945005)(6916009)(76176011)(66066001)(25786009)(55016002)(8936002)(16526019)(8676002)(2361001)(6116002)(47776003)(3846002)(59450400001)(97736004)(2351001)(5660300001)(50466002)(334744003)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0501MB2037; H:mellanox.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtEQjZQUjA1MDFNQjIwMzc7MjM6V1h6ejhRUUFNSy93emJvQzZMakVGTlpW?= =?utf-8?B?RnJKRk82TVZKNlk4dTFHQ2NpUXZBcTNvTUVicFZQVzZJamk2MVArNk5SNHZM?= =?utf-8?B?ODdYY0lKdjNsQmc2WUo2NGVnU1FrNDZXZW95dldUSmVKVHJlaWpxUUQxdUg1?= =?utf-8?B?bHkwL1JMS3NqUFI5UjlvZm9BVWNNMjF4NXBsZVdoQWVQM0FUSlR5b0hreEYr?= =?utf-8?B?MThtd1BKN29TQXRQN1RyY3AzNjlOOFU1MTE2WHppR09QZTYrNjllNFluaEd1?= =?utf-8?B?UGY1YmxtOVVwR0FEUzdvcXBGVGY5aklwVk1JdDVGR0tvNXRDQVdVaUovczJM?= =?utf-8?B?cC90cllqSndaL1UrNEJlbk1RVlk1Nzdtd244Nk90UXpoRFRENjBPTTNMYWF2?= =?utf-8?B?cEQ3S3lOeUtqcmNaSXdoRHpCZUVUU3NuQndBNG5TSG9ZbEVkcnRtYWdQR3RB?= =?utf-8?B?VUdDSEUva2E1ZGRBUTJhdWg0MHdPSzJEY1lNcys2MjNFNjhnSzhhWVZaK1pX?= =?utf-8?B?SjRSbmZkVnc4OXhRTG1KMVF2ZTYwRnpQdlduYmw4c1E3YXZENSt4MXVNZVZj?= =?utf-8?B?bEkybnJLYlNBenFSZVBpci84b1pyMXU0L2M5bXJiOHVFWUoxNVJvVnErMTl5?= =?utf-8?B?MCtLalp0cWRzcFA5M0VWNWRCRlV5T3pYRnNxWTl4dXZJZVF5SFU5bGFLZzBQ?= =?utf-8?B?WUdvblVjOUZ2N0dMM0c1dEhBbnNOVnI3VDNvRFdCb2EwS0RLd0VaRXU4UDBt?= =?utf-8?B?dW81NmNEQ3hkelBiM3RaWWxQUFplWEZFOVlxWW9DczA3cnJaNjRsTHRQT2N6?= =?utf-8?B?R3RTSUJzQlMyZ0l3OG9UU0YybGJsVUk2Y0JPZ0llRWVlYWE5WGROekUyREth?= =?utf-8?B?UWRKNldvbWsrVjdyMVRROGVUVlp6QldDejVZRHZmbytlL3o4SzZsbmxLSGFI?= =?utf-8?B?YWhiQ0lBOEpIakI0UjlDK2FPN0lrU2lXUUs2THJpVGRwQ2NUTW5HLzZVMjhs?= =?utf-8?B?ZXVzT05VQXNleUUya3Frb21VRDFKcUNEWklVNHE0YXV3T1VmeWUxSjRNY2lD?= =?utf-8?B?bFpqNkJpc1Y2ZVZMYmpNZjVOTjBUK3hjRklPZjlHbzhELzVaVkNGZ3dBd1M5?= =?utf-8?B?dURlQkkrSmluelNSYUordnRRUGxjTEpwUEdncUdYa2N0TkJHMzBzYXFsR0I0?= =?utf-8?B?QkVqUnFTZmZmWkNJdjNhVGpkS0dGaVhIS0N0cUhyS0R1N29QQTBGVUFVWmFM?= =?utf-8?B?VHlMOXRhdUJ4NjNaazNQN2M4YnlGb3BSclgwSjBlSFFNc0Y4WExtRGtjdFBZ?= =?utf-8?B?bVBTMGZJaFR2aWVyRWVETVAyampsM3dWSmo5WnRxMG0xOUVRbjkxb0d4K1NJ?= =?utf-8?B?c05Oc3prdVlrOE5URXZUT2t5OHBoVFdEMHhVSjJvU1FJdHdmQTVpQlp5VTVr?= =?utf-8?B?ZThYdXlSM2U5RWgwbGk3R3ovUkRwVHVDbmFVMWNuUzQxeEhsQUV0SngwOGlU?= =?utf-8?B?NTBJc0laczNQUm9ZNnRjUVRkL1pXMDBBbFpSUmRZZE9BdEk0VmlTam5jckg5?= =?utf-8?B?eFFKdmdjVnJSZXdJeFhHQ1dmdGVhT2c2SUp2bHhkWWF1NXZCVkVFVTV6aXAw?= =?utf-8?B?T0ZNYXl6UjhDdGQvVTV3VzJkWFVQeVZwVlFNK3NTQWx2VXdNZDdLRUV5a1Ez?= =?utf-8?B?b3orZkd2eGxLSE04dHAyMXhxWGxEV2FtbUpZYmR5MG53R1k3TjBLWFZadzk1?= =?utf-8?B?YWlDVDZmdDYyelUyVDluaklHeTRXUlNNdlNpR2NQZFhBVEJkVjg0cW1nYllI?= =?utf-8?B?aC9ZVDVuUjVDRUJtN2hoTUZHbkwxVEdhellMc3RSZHovc0lkUT09?= X-Microsoft-Antispam-Message-Info: sPAcXcSnP+kbYrfa9wiETSa2hBgwhD0BjqY0Llv523lQbLWBgjY80lG5UH9wCA82stSKDStiLWeZNdGbCH5Os3Ao7xR64dVacHB6W8y8SkiaB19Ty7stgTriP+RfH4yvmqepI5gVsP+WqoFrGlmLecsrGu4QkCZdm0sD5ooKPfJNlDbj7kQB4MCcUkAjgi+Q X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2037; 6:SF1Qx5Yd63jYHrPgFh7qdDEoLEaw/+lnl4fFty751XR8D5wt+k+50clrcd2oAL8VVDQL6T2o2aZ88eXtkLtw4qI3OGUNf6qdwsFlLmnZxjOnwAm2waMajguF+mPegVvCY+8dv2qinUxAyaM7JvMtvvlThNPaGBj/1DTRVzvNYHpDEC7yN/uAJTCE/aRx4im84iOJzJehZN1cbcf0m4PwPGYlJ/7hiz7VBTYA/nQ/TJddmWbU7XAE4XpffZUSzEriBqLrD6yy2/f+j9RDRX+JM9N9+yzUxSK35YVCeRoQYI+qvzFJB9FPFthJriVy31T41/RE8qMHXx+79KufPFIJ7VzoJaqwKKAJQg8LgO2SMXio+15kU5YWIyWBiH7iEXuOxaqVWBGFhiuqRA+saR8/gj66Oef8n5EWWOuL3NpHHtVd7IlsJEvM2k123fJhM/7GpQ+c64nD1GUR2la5X/Biqg==; 5:dwgdhJTOlCxExkq76Sa5NkT4xFiumE0uUslHlicb14BOK/vKq0LwPvrHfSQHPcnhv0RSH1eePt8lj1Qq0/5kNuO+ySnGGuxCF/ZB+hJtaZ04ev3z+wsrCJ3DxOBU79mHsdDKmWWRzvxGdjh6EVw4roTSL2qEWqsriJ23+L5ZLUs=; 24:tmNbdLVT0nnyrWB9NDwyKEg9Xot3b6JTfl3XUln3lMPhUrOeLZYSwgnX8sdyAKkdhjiz3jhsVFsCuo2VaJtfVVRw0PmvX1JXqxY0f7kcs7E= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DB6PR0501MB2037; 7:U1pS8LgEy5jGVWEcHBPUi7U3lyXQ7mDzVs5NJVHFzR7KCW56tBW/LOgEg4+J1A09KNKqTN0CAuVyFXRNHRSjU4nHaS8qvCHdFMc0WlfJsY0Kb6wqyqBH+FDoMwVV7yJFdgG7qhcjFgTPJUVug4sMNj2TYpYiOrPXeVDU9Zkb8WaPZPkRPrNUq7ZV93F+xQlTWIi9EXfi/L0It0445t67/N+JXeI6oIShHUCXvX57oop5ovvKZlped0fV4Lhh9/2O X-MS-Office365-Filtering-Correlation-Id: 7d4c5054-66df-47de-cb2a-08d5ca7cad78 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jun 2018 00:38:36.6543 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7d4c5054-66df-47de-cb2a-08d5ca7cad78 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0501MB2037 Subject: [dpdk-stable] [PATCH v2 33/67] net/mlx5: fix link status to use wait to complete 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: Tue, 05 Jun 2018 00:38:39 -0000 From: NĂ©lio Laranjeiro [ backported from upstream commit cfee94752b8f8f09b984335ae77b29af15b967fd ] Wait to complete is present to let the application get a correct status when it requires it, it should not be ignored. Fixes: e313ef4c2fe8 ("net/mlx5: fix link state on device start") Fixes: cb8faed7dde8 ("mlx5: support link status update") Cc: stable@dpdk.org Signed-off-by: Nelio Laranjeiro Acked-by: Adrien Mazarguil --- drivers/net/mlx5/mlx5.h | 1 - drivers/net/mlx5/mlx5_defs.h | 4 +- drivers/net/mlx5/mlx5_ethdev.c | 148 ++++++++++++++++------------------------- 3 files changed, 58 insertions(+), 95 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 58713a136..75aa853f2 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -128,7 +128,6 @@ struct priv { unsigned int mps:2; /* Multi-packet send mode (0: disabled). */ unsigned int mpw_hdr_dseg:1; /* Enable DSEGs in the title WQEBB. */ unsigned int cqe_comp:1; /* Whether CQE compression is enabled. */ - unsigned int pending_alarm:1; /* An alarm is pending. */ unsigned int tso:1; /* Whether TSO is supported. */ unsigned int tunnel_en:1; unsigned int isolated:1; /* Whether isolated mode is enabled. */ diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h index 9c740f5e1..d70635767 100644 --- a/drivers/net/mlx5/mlx5_defs.h +++ b/drivers/net/mlx5/mlx5_defs.h @@ -110,8 +110,8 @@ /* Supported RSS */ #define MLX5_RSS_HF_MASK (~(ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP)) -/* Maximum number of attempts to query link status before giving up. */ -#define MLX5_MAX_LINK_QUERY_ATTEMPTS 5 +/* Timeout in seconds to get a valid link status. */ +#define MLX5_LINK_STATUS_TIMEOUT 10 /* Reserved address space for UAR mapping. */ #define MLX5_UAR_SIZE (1ULL << 32) diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index d0bf5a788..18e1e534c 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -59,7 +60,6 @@ #include #include #include -#include #include #include "mlx5.h" @@ -495,12 +495,15 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * @param[out] link + * Storage for current link status. * * @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ static int -mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) +mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev, + struct rte_eth_link *link) { struct priv *priv = dev->data->dev_private; struct ethtool_cmd edata = { @@ -550,14 +553,13 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX); dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED); - if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { - /* Link status changed. */ - dev->data->dev_link = dev_link; - return 0; + if ((dev_link.link_speed && !dev_link.link_status) || + (!dev_link.link_speed && dev_link.link_status)) { + rte_errno = EAGAIN; + return -rte_errno; } - /* Link status is still the same. */ - rte_errno = EAGAIN; - return -rte_errno; + *link = dev_link; + return 0; } /** @@ -565,12 +567,16 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * @param[out] link + * Storage for current link status. * * @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ static int -mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) +mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev, + struct rte_eth_link *link) + { struct priv *priv = dev->data->dev_private; struct ethtool_link_settings gcmd = { .cmd = ETHTOOL_GLINKSETTINGS }; @@ -656,14 +662,13 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX); dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED); - if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { - /* Link status changed. */ - dev->data->dev_link = dev_link; - return 0; + if ((dev_link.link_speed && !dev_link.link_status) || + (!dev_link.link_speed && dev_link.link_status)) { + rte_errno = EAGAIN; + return -rte_errno; } - /* Link status is still the same. */ - rte_errno = EAGAIN; - return -rte_errno; + *link = dev_link; + return 0; } /** @@ -672,20 +677,43 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) * @param dev * Pointer to Ethernet device structure. * @param wait_to_complete - * Wait for request completion (ignored). + * Wait for request completion. * * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. + * 0 if link status was not updated, positive if it was, a negative errno + * value otherwise and rte_errno is set. */ int -mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused) +mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete) { int ret; + struct rte_eth_link dev_link; + time_t start_time = time(NULL); - ret = mlx5_link_update_unlocked_gset(dev); - if (ret) - ret = mlx5_link_update_unlocked_gs(dev); - return 0; + do { + ret = mlx5_link_update_unlocked_gset(dev, &dev_link); + if (ret) + ret = mlx5_link_update_unlocked_gs(dev, &dev_link); + if (ret == 0) + break; + /* Handle wait to complete situation. */ + if (wait_to_complete && ret == -EAGAIN) { + if (abs((int)difftime(time(NULL), start_time)) < + MLX5_LINK_STATUS_TIMEOUT) { + usleep(0); + continue; + } else { + rte_errno = EBUSY; + return -rte_errno; + } + } else if (ret < 0) { + return ret; + } + } while (wait_to_complete); + ret = !!memcmp(&dev->data->dev_link, &dev_link, + sizeof(struct rte_eth_link)); + dev->data->dev_link = dev_link; + return ret; } /** @@ -864,47 +892,6 @@ mlx5_ibv_device_to_pci_addr(const struct ibv_device *device, } /** - * Update the link status. - * - * @param dev - * Pointer to Ethernet device. - * - * @return - * Zero if the callback process can be called immediately, negative errno - * value otherwise and rte_errno is set. - */ -static int -mlx5_link_status_update(struct rte_eth_dev *dev) -{ - struct priv *priv = dev->data->dev_private; - struct rte_eth_link *link = &dev->data->dev_link; - int ret; - - ret = mlx5_link_update(dev, 0); - if (ret) - return ret; - if (((link->link_speed == 0) && link->link_status) || - ((link->link_speed != 0) && !link->link_status)) { - /* - * Inconsistent status. Event likely occurred before the - * kernel netdevice exposes the new status. - */ - if (!priv->pending_alarm) { - priv->pending_alarm = 1; - rte_eal_alarm_set(MLX5_ALARM_TIMEOUT_US, - mlx5_dev_link_status_handler, - priv->dev); - } - return 1; - } else if (unlikely(priv->pending_alarm)) { - /* Link interrupt occurred while alarm is already scheduled. */ - priv->pending_alarm = 0; - rte_eal_alarm_cancel(mlx5_dev_link_status_handler, priv->dev); - } - return 0; -} - -/** * Device status handler. * * @param dev @@ -922,6 +909,10 @@ mlx5_dev_status_handler(struct rte_eth_dev *dev) struct ibv_async_event event; uint32_t ret = 0; + if (mlx5_link_update(dev, 0) == -EAGAIN) { + usleep(0); + return 0; + } /* Read all message and acknowledge them. */ for (;;) { if (ibv_get_async_event(priv->ctx, &event)) @@ -939,33 +930,10 @@ mlx5_dev_status_handler(struct rte_eth_dev *dev) dev->data->port_id, event.event_type); ibv_ack_async_event(&event); } - if (ret & (1 << RTE_ETH_EVENT_INTR_LSC)) - if (mlx5_link_status_update(dev)) - ret &= ~(1 << RTE_ETH_EVENT_INTR_LSC); return ret; } /** - * Handle delayed link status event. - * - * @param arg - * Registered argument. - */ -void -mlx5_dev_link_status_handler(void *arg) -{ - struct rte_eth_dev *dev = arg; - struct priv *priv = dev->data->dev_private; - int ret; - - priv->pending_alarm = 0; - ret = mlx5_link_status_update(dev); - if (!ret) - _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL, - NULL); -} - -/** * Handle interrupts from the NIC. * * @param[in] intr_handle @@ -1020,10 +988,6 @@ mlx5_dev_interrupt_handler_uninstall(struct rte_eth_dev *dev) if (priv->primary_socket) rte_intr_callback_unregister(&priv->intr_handle_socket, mlx5_dev_handler_socket, dev); - if (priv->pending_alarm) { - priv->pending_alarm = 0; - rte_eal_alarm_cancel(mlx5_dev_link_status_handler, dev); - } priv->intr_handle.fd = 0; priv->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; priv->intr_handle_socket.fd = 0; -- 2.11.0