From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0062.outbound.protection.outlook.com [104.47.1.62]) by dpdk.org (Postfix) with ESMTP id C139C8E01 for ; Tue, 5 Jun 2018 02:12:59 +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=gw8JmEYTqiZlyeM8c8oNzM66o1ovruPvD1YMl+ttKHpyeEo23N2vUcdKdmWgdf73kkgdiXNu00/dK+UE0CCK78SKG//1q6y73j9r+kLthab/2mAu2nH9cXKEul+NrR9Klu5dA0erYuLG+5drIne9oADdxBNuEkBPZGFdo9d9LYg= Received: from mellanox.com (209.116.155.178) by AM5PR0501MB2036.eurprd05.prod.outlook.com (2603:10a6:203:1a::22) 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:12:57 +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:10:55 -0700 Message-Id: <20180605001129.13184-34-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180605001129.13184-1-yskoh@mellanox.com> References: <20180605001129.13184-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: CO1PR15CA0060.namprd15.prod.outlook.com (2603:10b6:101:1f::28) To AM5PR0501MB2036.eurprd05.prod.outlook.com (2603:10a6:203:1a::22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:AM5PR0501MB2036; X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2036; 3:JzW5/6g6x3hdIj2KEUpIdH59RFlVQrnVZBOS3fK1uzn+jBnFzg3gmDwFRubgG6OAE00EHOMHwMjXYoMrCgF4IgpyjNi4H/4EjBNLfO31azLmtJgGaRRT57Y3Ehz1elHdhpDMFR6pJuhKNpq7sgg+QOEvD+Ltx2mYbSZVDIrI4XpMEjwX4OvIRVLj0iwm9Spum7/MJmJ0EObyBfV1fHVPatRUUzRUEtlJjUCgotRzoT7eSTQizRRXqAVU0dNzvSke; 25:YKwFy1uoQxpOJiZSgb3eW2kI3Ug8uSWGbrl/DI8GQa1CKHMXd3Keq0XpQEcoPf4UkNtlWP41bzUsFFnp0eDFf/EXcbSLLRDavEB3IcXtnkNTt7JYpDhkbyhjKcDSv3khU5EkvRQJOcGnXfGitCekogmdKcbhdQI9sUg8tRCvMj+G9seeZx2nltWvT29q9T0usit4EOOo60frcfVy8wCr+8patG7IQieKyF3UJrU0K2HSjqiolpSmnOViu28d3RaYsdLwKZ+pefd/Z0Whm8059pjcAa9sQ4b9Ap83T//fmZKmU/iQ1NmAeVTPzV7wT/MJOqo6z4LD4sLNNjTgsY2QsQ==; 31:aJZiH+O16JxslbBC1luaJO5Ks3bJgP1Ve6E7NvL7XjPfHAQDpp2EFowx6P7qQqayTqu/+gdx/HfAOoASpSFVxC00VY/FhEH0ik2P4BeS3o+3XdEPHCIw7dfMkh5NtlviB85bqa+y+fpUagkaEYXcndzUr+TiM6r4gbJ2l8sdiw/iKpSdo+adee0GBFc/9zOtbDOUfR5qBtxdBEXY2PYgghSoA4opwPDAq/8CUBqPnQI= X-MS-TrafficTypeDiagnostic: AM5PR0501MB2036: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=yskoh@mellanox.com; X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2036; 20:fzD9opH9cgomg0Qsx4wWpZK4sU2ralEA7XYiqh5xEmqPjjyXUcc+9t3xC1ztmm+3YEE+TXV8g/1cEiRHDfvMJv8q+XtIe9mi1wlYDR22DeU/TSV/WP+53nNMoBAjPD6aYhcWGiHAJQTvygEh5ntNrETAbGuIB2x5pE78rnMRLe9hMdRUpvCuQYSQOOwCCBLQGkNSZQwJzQrBJugsu3hDkhHSZ7QCU8JwDEFphB+XaB0/cKdYxcjNsMTwKQAN4lM/n7WQrdwmEMtaPLEqnD9foOaM7t+hokNEDadbaSztfCs9HxcWgY9p2lS4FCSwa5SaKLyJxEiDUtNi6ct4me4uC+i9cpuSNMNkZOZ3LnBIroHKujfeC8R3shm+derAiGUAqTt4kZr3q3Y+SKG9ClcIbcTn6he3VZoiVAqk3vqLyrsVQD5QrfmrAwHo3Ihc0AUkZdqPDC2xYrU4fODwtYTZzn7bXAEF1NaRQaO/C/WDYeBDcjQWfczWlG19Twy/7H+j; 4:lFMHv3odk3Mi5bFFyy11M8pLPlvqmUbYp0ISpPNMirkQjKbRS9k/72fV1D5GAzJo8xopq3XPKazpUsxj/NcwPn9HegNfrc+5sdTJvLvDZgXM+8rpa4xvSfnvvfPtsBxViQhDkluqVTTqUZje3iJtcvQR7jMM6gxA5a8drVRr9rQKGUw4LznPeDCDf0GcIcxy11L6WX4Lapw3ZTlZuH1NSE0VR6NqDPnV6skiGw7+12azyPG8Ov7ykpzCg5Oyw3t9uSdvh6khsZjDyYklCmgEnA== 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)(5005006)(8121501046)(93006095)(93001095)(3231254)(944501410)(52105095)(10201501046)(3002001)(6055026)(149027)(150027)(6041310)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(6072148)(201708071742011)(7699016); SRVR:AM5PR0501MB2036; BCL:0; PCL:0; RULEID:; SRVR:AM5PR0501MB2036; X-Forefront-PRVS: 0694C54398 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(1496009)(39380400002)(366004)(396003)(39860400002)(346002)(376002)(189003)(199004)(478600001)(81156014)(76176011)(7696005)(956004)(2361001)(50226002)(305945005)(2616005)(50466002)(47776003)(486006)(97736004)(5660300001)(2351001)(106356001)(8936002)(186003)(81166006)(52116002)(6116002)(476003)(6916009)(23676004)(386003)(446003)(11346002)(59450400001)(66066001)(26005)(3846002)(8676002)(16526019)(1076002)(25786009)(21086003)(86362001)(2870700001)(575784001)(53936002)(4326008)(2906002)(316002)(55016002)(36756003)(105586002)(69596002)(68736007)(7736002)(334744003)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM5PR0501MB2036; 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?MTtBTTVQUjA1MDFNQjIwMzY7MjM6KzZLeUh6d1JSNjdzY3J6MlFHSThrTEtz?= =?utf-8?B?cGJ3NmdSMVluWXpmMEI4ak1OZGsveVN0WndTbERIRXQwZVZYSTFueGJjN29T?= =?utf-8?B?U0ZjMUhnblJDNi9wY3FMRnc0WUpQZ0U3R3lzUlQ3Qjl1aXVpWnBHWUJEOTNu?= =?utf-8?B?ZTdMbS9Xc2xpanNFSE1KaTZOWjNYUzZFL3dqMXZkVzVZbXl3ejR5VFpUZDhU?= =?utf-8?B?YXdCRXF4aVZ4RkE4ZW4yS2hqLzk4L0d3QTBxVjZFWnJsQlZXdUpkZFZrdjlm?= =?utf-8?B?UkdWMDRHeEZreTRrc3hHWHE2YTBYWUVzV2VGbFlCbEtZR0lObW9JRDBYcUpW?= =?utf-8?B?bjlXbmNZcHp0eXgzQWE0TU1mNllvdkgwa3ZWYUo1dkV3TkFuTnBsSlFheFRB?= =?utf-8?B?Nlg1VFlkSFVlVTI3cUJqVC9SK1h1OTQ1K09TbjV6eVNYM2FVNk5MRU5sYytT?= =?utf-8?B?Nm9FMlBFTWh5eUt1VzBldmIvc0VsVHhDRW1paU5BemNtUGR4d1ZiNjFWY1Ry?= =?utf-8?B?LzRldURCOXI2SWdDeE1YdnJpNU9hMnRYdEcxODVpSUU3UGJWOWVNZjlqMFlG?= =?utf-8?B?UVdNR0pKaDRDaWtlZFpVQ2NyZmtHMGI4Z29IWWhudFFKdXZSY1ppMXp5cUpO?= =?utf-8?B?OURIbFZyTXppZ3JYVUs4UWoxMzg1UndYaHRHdFE4cFlHSWFyYlNkNTZ0MDJB?= =?utf-8?B?Q1pGNjV1REViWlVtbDBoaDJ4U0c1VVQxOUFRM2RtYzJEMnNHRE9GdVRZWjA5?= =?utf-8?B?MkV1RjRiWUxZUDh4Q2wrR0wvczhaNGlMZFNOMU1RQitmWXBVempMbFQrRGpo?= =?utf-8?B?Mk9pdzZIT2FFZGQwM1VqckRQOWQrZ0Urb0hxR0VhSGZXWmtnREdsbXpvbHZO?= =?utf-8?B?U3pBWVRWNE9uYnVBM2tkSS9VVU9ZWmlWT05acG5GSy96QURJMjBobkZRaEtS?= =?utf-8?B?QUZBSThWK0xyV3VscUZZTWJscXZQbjlLdEprbncwd01GalpzakJHTndnaVpV?= =?utf-8?B?OGUxM3BudEx0cGtQczJOTitkcWRnQ0Z3dERHdng3dy9mUFBNQkNiTjBrYUJS?= =?utf-8?B?SXN4QlNzL1FFN1R1TjJTUE1ZNHpOK0NlR1hLcFdpc283Vk1uaExoNWZvVklq?= =?utf-8?B?UUFseFg1Y3k0QjFuUVJXZ2YxUHFEbnc3LytZbFlXblhFSFJqRkl3Y0JweU01?= =?utf-8?B?aUdGYUZEUC9idWFpbVdEU1BDOVVJWVBnOTZMWkdGaW8zUnVMalFiL0RWeFdy?= =?utf-8?B?bzV5YnJKUHliUjBWZUt0eUFHMXpQd0lJWU1ZTmVmdmlDbUVMRWRjdmZuNUYx?= =?utf-8?B?eWMxOHNDd0lxWWdGcitvbWcxcUw4UHJlMDZZd3ROUmhBUThtSGNMT3pBcXpM?= =?utf-8?B?SFkrM0h6c2xDNFVISVF3eVQ0cEswVVdtTXduQmltelZGWXdxK1kyYlN3T0Jh?= =?utf-8?B?N3dWQlB4THI0b2JCZDBZYTcrWDdtWXhqQUlIekFVTkMybHZlS2F6Mjhrcnhh?= =?utf-8?B?QkZ3MVBDelpQU0pjWXk3a2VYNDdWcmd4Y1Y2cTRBSUNnaURTWlpuRTVjYnlt?= =?utf-8?B?OUh1c2phemtPd0t4TXkxMjU2SXQxMEcraTJsMXpleTAzYVVPRnF5MkQzQU5C?= =?utf-8?B?SmRnbjZISTVEcHp4dm95L3dscWlFZWdHM0JWTU5SRjZPcE1QN0RMR1NMYWRv?= =?utf-8?B?TXlSWHFyWkdPZS9xaTg5RloreVNpbzBsS2wxUTBpQ1JhS0FMUXFNb1NwRlFy?= =?utf-8?B?YjVOanJEL1N3c0N1L3c3U05RRWViOS9mcVQ5WTVjdWppV1A5d1kxU2VwT1dZ?= =?utf-8?B?eHZVdE50bHhpRUNpbEJqME5tazRsR1BnRkE5VmpVN204ZDFhQT09?= X-Microsoft-Antispam-Message-Info: hBde2xawPQy0y7tff/UsaqHKKPVAomEp42dw7jOylotgUpze7UDm2+vwSENmvpBB0qBoqu4IJKovekLvTDGvDqSn8MVsqijH6CzlLJM93sxyT3NRTpeEwvk+JeUWF6RWMBrQLqpzEAWOLiSGV4GYlx/AaQSviYNjoMweSDytECTJIf36VXMA+PXJ/eYzYm+m X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2036; 6:RcA+NQYoj/R1e7mYczAdlHd7kW+wLdcWlEF3GmpwXwZrRknDCmH+b+EL0cBhE4p6Jh8SSgFPDbkdfeXBApICfyEGyxpYAHbT/kkiwcqKrAEsuISnw90HkT7Z1UJwgdeqdFGF8SOyEvw3kyeHpYeZqQUMK0eVsr3nRr5i1QmPcsccXaC9EK7+yHbycu3AVBT1GZEpACCnBPBrQluTWfsEzL7Eg32Fvo2OXuMYnnVDOF0xr+bgaYehANqV/J11P90WbkO30fiXwbSjeoQrQY5r2oIx2M1uS8WZAZMj5il5kV8X8hU4ARJvHUOkE9rBaihop2ko2szVtt+CTjDJvPS1nMLbN6EabN8x/+4+LKhHjuGFd4I2IHXiLJb98gLwdKjydIhQFKNOa8/0MsE0N4Ymdvf13nCGZYW8/lo1JsfrYzoypYo2pdMOmM2+ADjNZ8wAUZHxCj5tcfSFs4BiVu6/lg==; 5:zGveetNb8SA/yvZxXj2pOyuXkZITiODL+J3VTiSR00g0Is8GbGbWdOjUeY0RAHD4QNadyOc35BAkXHg2g3ZeEJRptHHfHEZ/uVPgD7Qe+w9NZpyi8TrnoLiSPK+S5rwbNOsxbb/ad4wOwvd90QUYV0ka/6zGf8eoZmDh54l+uP0=; 24:w401Uic2nloSJH9mpCshoZQKmUj3qNlGBUPVMX6PLO02eNJwuHRgky40+hnJTJ+POdShQBcXVM6NspuxHojQ/+h7aZDOHEplvyHVwiJjVvM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2036; 7:b/lXnIzaGteCxW8nQv4mAdPF9ytH9HivlZMXEEsyCdR0Dwjt9yKGR/g11IwW+i2kdT7upo37JO8wSLy2SDEJx52EMbrl9ZMXb4fstZZ7i7jScRIEZlXxlD0x0/Kk2WMW6f2cgBjX668rbM+7VIsxJvUcujstvO/BDyrLrWKJ/fp/3c6t9K3dlKdXqnG8wACuYz3+2bnvylXNpZe0deL7WozztaJKmBFL0W5DgMgzzH/NNZTDtk43iB+QSRbzdt4b X-MS-Office365-Filtering-Correlation-Id: c9351f77-f580-4667-f573-08d5ca791820 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jun 2018 00:12:57.3709 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c9351f77-f580-4667-f573-08d5ca791820 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0501MB2036 Subject: [dpdk-stable] [PATCH 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:13:00 -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