Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp5908090ybf; Thu, 5 Mar 2020 09:16:19 -0800 (PST) X-Google-Smtp-Source: ADFU+vsX1q6ksReqOxoW6jCqzuaQkk2YCh1YxGdHQ/SRU7ALgPlWBVZEVtZ3+rDBcGcJX/t57exF X-Received: by 2002:a9d:3f8:: with SMTP id f111mr7720450otf.204.1583428579137; Thu, 05 Mar 2020 09:16:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583428579; cv=none; d=google.com; s=arc-20160816; b=yhx3bg6sQK7CN5F4q5gDo6mNzWE2JWO8UvAPijCDe2BaGF4srUwz5fUBXIKkHHBCpO H+8qi0FYEcNW33ouLlT/d384EsBqsryaCt6G0/S1hVPU9CIZb5izz1lxGnPDwXNj3K+C sI1+LovVKJ46HnXp96JvZGZO41BCyPjt8/yzhcZ+nYALA9/1t3HNICMtoEU21bb2SdIB omJaQCR7/qEnnM109+4ER6QP/DwC5M0HM8Qtna4xRynUdrWoTzanaHJymhuRoNcGJKNw F2096nd4Zdvebdr9Eol73MRc306UNI2G0zGCMjqRXuLys0B2uII5MPOKIQ0OtjEPKabY vA5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=000pEIfDItdC7xwxu6AqHK5dNIX9QSyVCKb8dUNJGLw=; b=q6OxoqBKJD43ZWYG6sk63Ce8buMlCy8uzOvGataOTyOf8NWNE6PFOCdyHSX8T5+ZIF 9Mk7PJB1hNBWeh/OQG+F2AEJl2gdaZPeyCZjeINRkfnclLOksa17hjPVh2YcmDE95UTN 55nfPqjSmrOA8vw3SEt4FFb7PGtHVzA/FGDR1DrFYzX1ZV6mIipdDkO/g0FK/5tS2rWZ tdiMuSx1fW1xveTv42RbjwflaJ5F7vxWIgh02RURMu2uT2vrBalBwxOX6oQkek1jNkIw DNs0IK+xhEOmrRLMEYrW2CEI5GcmeZxs9NnNqCJkrPfPtc4OTBL90v/WyaSR6vEJj9nF fM/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=CoZOH9iO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r12si3401928oij.113.2020.03.05.09.16.07; Thu, 05 Mar 2020 09:16:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=CoZOH9iO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728004AbgCERPS (ORCPT + 99 others); Thu, 5 Mar 2020 12:15:18 -0500 Received: from mail.kernel.org ([198.145.29.99]:41518 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727902AbgCERPA (ORCPT ); Thu, 5 Mar 2020 12:15:00 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3977121744; Thu, 5 Mar 2020 17:14:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583428500; bh=apxNGTTawxO88AhaRt5S23Z7rTLns5Lk95jgyvF3/SA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CoZOH9iOeGrfO+vDOpcrnzac+irrY91dazaVwZriKToLGNwtlgUi3DDUWiMnFSbQD Tfl9c25LxVyTRVCOkQBMx3g1by2Q7nL570oWIpqwKaG+Kq4ZuI75/Bc2wpDxuwcIO8 KM0OIfun/IBvIVsibjBjFowDy/nTBbj9aVhBcj0E= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Esben Haabendal , "David S . Miller" , Sasha Levin , netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH AUTOSEL 5.4 31/58] net: ll_temac: Fix race condition causing TX hang Date: Thu, 5 Mar 2020 12:13:52 -0500 Message-Id: <20200305171420.29595-31-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200305171420.29595-1-sashal@kernel.org> References: <20200305171420.29595-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Esben Haabendal [ Upstream commit 84823ff80f7403752b59e00bb198724100dc611c ] It is possible that the interrupt handler fires and frees up space in the TX ring in between checking for sufficient TX ring space and stopping the TX queue in temac_start_xmit. If this happens, the queue wake from the interrupt handler will occur before the queue is stopped, causing a lost wakeup and the adapter's transmit hanging. To avoid this, after stopping the queue, check again whether there is sufficient space in the TX ring. If so, wake up the queue again. This is a port of the similar fix in axienet driver, commit 7de44285c1f6 ("net: axienet: Fix race condition causing TX hang"). Fixes: 23ecc4bde21f ("net: ll_temac: fix checksum offload logic") Signed-off-by: Esben Haabendal Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/xilinx/ll_temac_main.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index 21c1b4322ea78..fd578568b3bff 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c @@ -788,6 +788,9 @@ static void temac_start_xmit_done(struct net_device *ndev) stat = be32_to_cpu(cur_p->app0); } + /* Matches barrier in temac_start_xmit */ + smp_mb(); + netif_wake_queue(ndev); } @@ -830,9 +833,19 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev) cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; if (temac_check_tx_bd_space(lp, num_frag + 1)) { - if (!netif_queue_stopped(ndev)) - netif_stop_queue(ndev); - return NETDEV_TX_BUSY; + if (netif_queue_stopped(ndev)) + return NETDEV_TX_BUSY; + + netif_stop_queue(ndev); + + /* Matches barrier in temac_start_xmit_done */ + smp_mb(); + + /* Space might have just been freed - check again */ + if (temac_check_tx_bd_space(lp, num_frag)) + return NETDEV_TX_BUSY; + + netif_wake_queue(ndev); } cur_p->app0 = 0; -- 2.20.1