From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by dpdk.org (Postfix) with ESMTP id 965D61B2D3 for ; Fri, 26 Jan 2018 14:16:41 +0100 (CET) Received: by mail-wr0-f193.google.com with SMTP id e41so506546wre.9 for ; Fri, 26 Jan 2018 05:16:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pmXq/Z9Pb6ylUOe8eTqgpL2YuNFh2Obq3jRRVK02TRI=; b=NXJ4maGy91KT2XNql7EnYNBr1Eb2tCVdd9oCkOmgrok1B2yNLn9bpRhtYb7eyXlJ6V Y8RBu59A2WoXVbYabjBIaPl6YtEDxKFiqcVGFyn1d/cSaRTel5TqukSSoxS41MdKyQst 77m3V9/pHm+xNreaDAwr4UDn32ZpH12UTygzfcHZjvvcPcmuBpYhPXBvbywKd0tf1+Yz THLgYCcBYt0l73g3PNzOcjbXLLvS1qF711qmQH3+nH+7F0TtILbeg7fAhTtqchxEsEhH v68+Yz3kO3xiYrMhSEFgrudWGS2cYHvvHfc2r2bBGhbPhRr3ZTK0CaEkQpAc1vNMtWlc yWLg== 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=pmXq/Z9Pb6ylUOe8eTqgpL2YuNFh2Obq3jRRVK02TRI=; b=ChyDmBt1wSwPYKavc/yjl+tS6RhwArLGL6yZLHrxXIgHe/t7xjPfXAy4rf+w3grLZ/ yYi1zlMU7q58xm2wTcna1E5OIt3SzIqhfB8l5AkJG7nUml71KC4SwhQiHO23hWCvZjvw 1faHzm791yH/QiRZCA/sX6FKJm9oJCmVgr9rNsd1t6oWo3mKU4W2KsCRQswjy9j3f5gG C2wzRpwYwXfYPC8/BrOj2FfakbSGT6Dou5FOWhxT1qjNm5K3MJgvexjesvdhBQoOO8mr csWJNlxMgc7psCj07y5zvocX/sQWwEscIuy/ZqzrU2W3LPVSz2gUNicvHDS9MBn646Wm uz9Q== X-Gm-Message-State: AKwxytcPMMa0UIcmbjwKoWNYvsx2IEJaSfjzv3J/o2p64/Zug4deUuOQ Ack0SA35Ast2oJOVZhWFEyY= X-Google-Smtp-Source: AH8x227l0XBnGL6r0Kld7GU4APs0XihbSJd6R5u8XYavUpr1/JspUmvG8N7pJzGHhR20Xr6qrIYCfA== X-Received: by 10.223.186.194 with SMTP id w2mr11196881wrg.154.1516972601338; Fri, 26 Jan 2018 05:16:41 -0800 (PST) Received: from localhost ([2a00:23c5:bef3:400:9531:588b:44ae:bec4]) by smtp.gmail.com with ESMTPSA id e15sm4397187wmd.26.2018.01.26.05.16.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 26 Jan 2018 05:16:40 -0800 (PST) From: luca.boccassi@gmail.com To: Yongseok Koh Cc: Nelio Laranjeiro , dpdk stable Date: Fri, 26 Jan 2018 13:13:18 +0000 Message-Id: <20180126131332.15346-48-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180126131332.15346-1-luca.boccassi@gmail.com> References: <20180126131332.15346-1-luca.boccassi@gmail.com> Subject: [dpdk-stable] patch 'net/mlx5: fix deadlock of link status alarm' has been queued to LTS release 16.11.5 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: Fri, 26 Jan 2018 13:16:41 -0000 Hi, FYI, your patch has been queued to LTS release 16.11.5 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 01/28/18. So please shout if anyone has objections. Thanks. Luca Boccassi --- >>From f6f2470ea69cc55b3cd33da7e39d3d3176fb8cf0 Mon Sep 17 00:00:00 2001 From: Yongseok Koh Date: Wed, 10 Jan 2018 09:46:49 -0800 Subject: [PATCH] net/mlx5: fix deadlock of link status alarm [ upstream commit 6817ad38718451849b672b0584176c14a8b55b88 ] If mlx5_dev_link_status_handler() is executed while canceling the alarm, deadlock can happen because rte_eal_alarm_cancel() waits for all callbackes to finish execution and both calls are protected by priv->lock. Fixes: 198a3c339a8f ("mlx5: handle link status interrupts") Signed-off-by: Yongseok Koh Acked-by: Nelio Laranjeiro --- drivers/net/mlx5/mlx5.h | 16 ++++++++++++++++ drivers/net/mlx5/mlx5_ethdev.c | 13 +++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 79b7a6008..0ffb94019 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -160,6 +160,22 @@ priv_lock(struct priv *priv) rte_spinlock_lock(&priv->lock); } +/** + * Try to lock private structure to protect it from concurrent access in the + * control path. + * + * @param priv + * Pointer to private structure. + * + * @return + * 1 if the lock is successfully taken; 0 otherwise. + */ +static inline int +priv_trylock(struct priv *priv) +{ + return rte_spinlock_trylock(&priv->lock); +} + /** * Unlock private structure. * diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 2ea995f89..c7822835d 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -1239,8 +1239,12 @@ mlx5_dev_link_status_handler(void *arg) struct priv *priv = dev->data->dev_private; int ret; - priv_lock(priv); - assert(priv->pending_alarm == 1); + while (!priv_trylock(priv)) { + /* Alarm is being canceled. */ + if (priv->pending_alarm == 0) + return; + rte_pause(); + } priv->pending_alarm = 0; ret = priv_dev_link_status_handler(priv, dev); priv_unlock(priv); @@ -1287,9 +1291,10 @@ priv_dev_interrupt_handler_uninstall(struct priv *priv, struct rte_eth_dev *dev) rte_intr_callback_unregister(&priv->intr_handle, mlx5_dev_interrupt_handler, dev); - if (priv->pending_alarm) + if (priv->pending_alarm) { + priv->pending_alarm = 0; rte_eal_alarm_cancel(mlx5_dev_link_status_handler, dev); - priv->pending_alarm = 0; + } priv->intr_handle.fd = 0; priv->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; } -- 2.14.2