Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp3783950ybi; Mon, 29 Jul 2019 12:33:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqwDMcRgWzx7qOOho0R6+IuCMtLV51mULLXTIfaXOoCCucbdHyo83PjiokHlym/JxLAIRvac X-Received: by 2002:a63:6086:: with SMTP id u128mr41923596pgb.158.1564428796747; Mon, 29 Jul 2019 12:33:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564428796; cv=none; d=google.com; s=arc-20160816; b=UXbBZBm+n6m/yJGFD66x26a48Kyy581IsfjNAl+KKgT3ICX04WaDAK9DaTK/DMlbjH iDq7qwJAnhBLnWa2JPvImupYggJGLKayE4Sywb3aOK7GdRn7nqTdqTxdM2NYUhpVEoDE LJmHhC+czEpW8kptnbea8jGTf8qH/6PLQgSu0RSUiIk33Rm7w5ah1suiJz87rI6lCPoQ kPEU0trs70R4cY364jQ7kz6jqXS/6Q0CAAuiU91n3bHYDAW9mVlVhdSUpLeqlM7ZZaIV ZxIzSaadVFI+GlGjhtzZOH1Zbk3WZAJoFsJctsffkpSVvzyGiIEYclaaSwfNHn66Zucy hp8g== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=vUzdk7qeQwZudRsijq+h36Kc/GJ6gg5b6DfiYWDMkck=; b=WZZN0kmUGovBkdGb8a9y+MzjN4zPlmYASLKNy7paNlVnTTg2LyUpxB/qsW3hzw7ixm ARqphZ7y51AqFTwW7WEDWoaxzIObaUvmFlqissgGL11siZnvqIkqs5PI1tfu8Jnh4HGT l5T+GPBzQ4jlupl9mQEUx+uHpWoh5H6vTA25ooazHdszj4uoNp3QuUxMGfCCWMMZWX8v AcDOd1JLBJlYIQUPYIgmUAmadKmXxv3DaDSDu91l8FMJZ3S/zjB8rkBW8NSvs3xD+4gE F5j/836QSIZJ8KIfQvtaGwoFgvPv1Ixu/UjWm9LEOQ9d1YgwXV0SJveq00zpf3XxK5nn PusQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Zb6+FJ3A; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l64si24128173pjb.93.2019.07.29.12.33.01; Mon, 29 Jul 2019 12:33:16 -0700 (PDT) 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=Zb6+FJ3A; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388265AbfG2TZS (ORCPT + 99 others); Mon, 29 Jul 2019 15:25:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:37546 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388138AbfG2TZP (ORCPT ); Mon, 29 Jul 2019 15:25:15 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B3FCD20C01; Mon, 29 Jul 2019 19:25:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564428314; bh=8Ie5Xw53bMiiM6/Q6Ge+iLo/VCKw3UW9XdVJk2rAF60=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zb6+FJ3AufPB2gzzmK7i2MGbTI4b2vggwQCM6mkybgOrLrtGzTKFBzcnmntlwWpnF vREsxhbgAotfDxQj+OnIGKRLxHh1NPj7RkCmSPfbFOrHQZKirs2OeLcuKPdstlPLEh k+zhKUq1Yl6cXaxmtA7V7zJTSIjvWwW1SiYwhDXA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Robert Hancock , "David S. Miller" , Sasha Levin Subject: [PATCH 4.14 036/293] net: axienet: Fix race condition causing TX hang Date: Mon, 29 Jul 2019 21:18:47 +0200 Message-Id: <20190729190825.012472396@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190729190820.321094988@linuxfoundation.org> References: <20190729190820.321094988@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 7de44285c1f69ccfbe8be1d6a16fcd956681fee6 ] 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 axienet_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. Signed-off-by: Robert Hancock Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- .../net/ethernet/xilinx/xilinx_axienet_main.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index d46dc8cd1670..b481cb174b23 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -614,6 +614,10 @@ static void axienet_start_xmit_done(struct net_device *ndev) ndev->stats.tx_packets += packets; ndev->stats.tx_bytes += size; + + /* Matches barrier in axienet_start_xmit */ + smp_mb(); + netif_wake_queue(ndev); } @@ -668,9 +672,19 @@ static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; if (axienet_check_tx_bd_space(lp, num_frag)) { - 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 axienet_start_xmit_done */ + smp_mb(); + + /* Space might have just been freed - check again */ + if (axienet_check_tx_bd_space(lp, num_frag)) + return NETDEV_TX_BUSY; + + netif_wake_queue(ndev); } if (skb->ip_summed == CHECKSUM_PARTIAL) { -- 2.20.1