From patchwork Tue Sep 5 12:56:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 28376 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id E357437A0; Tue, 5 Sep 2017 14:57:00 +0200 (CEST) Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by dpdk.org (Postfix) with ESMTP id 36C23378E for ; Tue, 5 Sep 2017 14:56:58 +0200 (CEST) Received: by mail-wm0-f54.google.com with SMTP id u26so18958024wma.0 for ; Tue, 05 Sep 2017 05:56:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=c2VkEKS2e/Iaf5n575dkqmL9JOy6/I6f3QdINGvYtA8=; b=n7/LX5fnuBZABgZcNCM08021OxykFiala4zzNdefskFRu4sYz+gCk5GP0BZcLDrKte pxFSUIX3X1ry5qG/DyZfaPlsuNg1MwfGPMsI9R7xG6I+DV0BikV8eURWX87KZ0KtHLGa K/VyC5fd28aHrnvsjlEWcff0e5GJ9bRIaEPI0X+vmtHqNZ0kPW41sxsm2fNESW0SH4i4 cNcNbAKY+6Pc55pq3VnyfVfD95KwLHtAWE2wGOCpt6tOJcW1KdP1jqE00hkiuFQpBTHy f7O/pXMzNzEiCFVwuU+joLJb7CbDlXm+dw2MD7D2zMSKOyCkiDourisSF3JYTJC/SByO ZGPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=c2VkEKS2e/Iaf5n575dkqmL9JOy6/I6f3QdINGvYtA8=; b=TOWh08Pg4QFUepQ/XtAn98WMRgrZAMhaauhrdFuxIM04lvhPVnER7pI8HeQyaBHscw 8gmnim3UZADqs8zf0N3fpZVlkg3DuEr0MMShQS49CFwNFWHJOJzf6YDyeAnp83jiAvNn w7fwFIlJH6xAsoJlPoO+psMQNohxzAmKyjWKdwAkdlZBi6dbG3BLdVe9B3T2kymPUd45 8N6C5W1Choaev70aElGLqODpOVMPuahOurbtNgcejO/+5tXFkFcRC51n2WigE632jsFW ClZQCsM/cJIP6+uRfdyOyF8+sEgLRHwi5AAvSEdBQOrDGpD9ISpBoTF2Fuy8qtbsp0ld OhSg== X-Gm-Message-State: AHPjjUiz65ziVC+6UnX+sKdiYad9+g/iUGajH8hFeYPq3LarN4bmfJYV jfIIbDkZfI67YS7h X-Google-Smtp-Source: ADKCNb59yYu6qn+cFDJko+DTYzkeCC9WGD/yy/qos7002gY3KQDuHZdgmMsylFI1vXqT2KeHBqnBYg== X-Received: by 10.28.227.68 with SMTP id a65mr2439134wmh.88.1504616217892; Tue, 05 Sep 2017 05:56:57 -0700 (PDT) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id b53sm579089wrd.40.2017.09.05.05.56.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Sep 2017 05:56:56 -0700 (PDT) From: Adrien Mazarguil To: Gaetan Rivet , Matan Azrad Cc: dev@dpdk.org, stable@dpdk.org Date: Tue, 5 Sep 2017 14:56:38 +0200 Message-Id: <37eb55eea3810bebde392d934e7366efaeb0f0a8.1504614801.git.adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v1 2/3] net/mlx4: fix rescheduled link status check X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Link status is sometimes inconsistent during a LSC event. When it occurs, the PMD refrains from immediately notifying the application; instead, an alarm is scheduled to check link status later and notify the application once it has settled. The problem is that subsequent link status checks are only performed if additional LSC events occur in the meantime, which is not always the case. Worse, since support for removal events was added, rescheduled link status checks may consume them as well without notifying the application. With the right timing, a link loss occurring just before a device removal event may hide it from the application. Fixes: 6dd7b7056d7f ("net/mlx4: support device removal event") Fixes: 2d449f7c52de ("net/mlx4: fix assertion failure on link update") Cc: stable@dpdk.org Cc: Gaetan Rivet Reported-by: Matan Azrad Signed-off-by: Adrien Mazarguil --- drivers/net/mlx4/mlx4_intr.c | 71 +++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/drivers/net/mlx4/mlx4_intr.c b/drivers/net/mlx4/mlx4_intr.c index d7f1098..e1e6c05 100644 --- a/drivers/net/mlx4/mlx4_intr.c +++ b/drivers/net/mlx4/mlx4_intr.c @@ -59,7 +59,7 @@ #include "mlx4_rxtx.h" #include "mlx4_utils.h" -static void mlx4_link_status_alarm(struct priv *priv); +static int mlx4_link_status_check(struct priv *priv); /** * Clean up Rx interrupts handler. @@ -149,8 +149,6 @@ static int mlx4_collect_interrupt_events(struct priv *priv, uint32_t *events) { struct ibv_async_event event; - int port_change = 0; - struct rte_eth_link *link = &priv->dev->data->dev_link; const struct rte_intr_conf *const intr_conf = &priv->dev->data->dev_conf.intr_conf; int ret = 0; @@ -163,9 +161,9 @@ mlx4_collect_interrupt_events(struct priv *priv, uint32_t *events) switch (event.event_type) { case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_PORT_ERR: - if (!intr_conf->lsc) + if (!intr_conf->lsc || mlx4_link_status_check(priv)) break; - port_change = 1; + *events |= (1 << RTE_ETH_EVENT_INTR_LSC); ret++; break; case IBV_EVENT_DEVICE_FATAL: @@ -180,47 +178,70 @@ mlx4_collect_interrupt_events(struct priv *priv, uint32_t *events) } ibv_ack_async_event(&event); } - if (!port_change) - return ret; - mlx4_link_update(priv->dev, 0); - if (((link->link_speed == 0) && link->link_status) || - ((link->link_speed != 0) && !link->link_status)) { - if (!priv->intr_alarm) { - /* Inconsistent status, check again later. */ - priv->intr_alarm = 1; - rte_eal_alarm_set(MLX4_INTR_ALARM_TIMEOUT, - (void (*)(void *)) - mlx4_link_status_alarm, - priv); - } - } else { - *events |= (1 << RTE_ETH_EVENT_INTR_LSC); - } return ret; } /** * Process scheduled link status check. * + * If LSC interrupts are requested, process related callback. + * * @param priv * Pointer to private structure. */ static void mlx4_link_status_alarm(struct priv *priv) { - uint32_t events; - int ret; + const struct rte_intr_conf *const intr_conf = + &priv->dev->data->dev_conf.intr_conf; assert(priv->intr_alarm == 1); priv->intr_alarm = 0; - ret = mlx4_collect_interrupt_events(priv, &events); - if (ret > 0 && events & (1 << RTE_ETH_EVENT_INTR_LSC)) + if (intr_conf->lsc && !mlx4_link_status_check(priv)) _rte_eth_dev_callback_process(priv->dev, RTE_ETH_EVENT_INTR_LSC, NULL, NULL); } /** + * Check link status. + * + * In case of inconsistency, another check is scheduled. + * + * @param priv + * Pointer to private structure. + * + * @return + * 0 on success (link status is consistent), negative errno value + * otherwise and rte_errno is set. + */ +static int +mlx4_link_status_check(struct priv *priv) +{ + struct rte_eth_link *link = &priv->dev->data->dev_link; + int ret = mlx4_link_update(priv->dev, 0); + + if (ret) + return ret; + if ((!link->link_speed && link->link_status) || + (link->link_speed && !link->link_status)) { + if (!priv->intr_alarm) { + /* Inconsistent status, check again later. */ + ret = rte_eal_alarm_set(MLX4_INTR_ALARM_TIMEOUT, + (void (*)(void *)) + mlx4_link_status_alarm, + priv); + if (ret) + return ret; + priv->intr_alarm = 1; + } + rte_errno = EINPROGRESS; + return -rte_errno; + } + return 0; +} + +/** * Handle interrupts from the NIC. * * @param priv