Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3699147pxv; Mon, 28 Jun 2021 10:34:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy6xbcM/e3eN7DbsCt4KnbXhhq7bKAZ/uGr1nC99Cu4ThZv6S7LZ43Vn35LaC4zd/s352HZ X-Received: by 2002:a17:906:39d7:: with SMTP id i23mr25161727eje.121.1624901684560; Mon, 28 Jun 2021 10:34:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624901684; cv=none; d=google.com; s=arc-20160816; b=Abg+oggzPzpvCxlpwIpK+yIlnNmBBG2/E15TM5HGXXeqDRNtCuHrfIwJxRNTxf26jx yc0yiPCRWuSvKUV1zPI/PRxKoS2NB57aUOlrEhLs60j2MdCX5fJsiy7ZSwJZXqraJrVe i//x+rK/VFcjtzNXunUeDCjzqKi89EjKmA7PDK50JbYiMtTvrPVXB0QXnE8M4fQXIIvb RKElSWQNIt7MGTfcTVbQO14dDI1EvkVLOfhk8+T9TEF1ccDmwW4MrCOEslqRcgJ87jFS 5zztOk6GnTqusuS3rXFDAYJ2YQdq1X2NOsjBugqITie7NNwgama8O624uVLfFbUxBcoT 5H7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=SyK5YWW2HuoMvIgIOXiLJUSUw2DAdH7LUhPSifMk03w=; b=Ihq3+q8tUyTaB/6oJVB8cmeS+JBAAImMwo0UhwWNVov1rwesTyoUDwBsdzQrSsvCrr 4USl+aivEx28KwMDa7XKYxAPzEBSXW6LK9WXOKqzqyVKfM4qxeDbYcTIC4Vy3JxAPCTU u4xtk8i2ymX8jk/KoKRGoWun1riM4aTQMfqj2HcYLvHUN8k+hNVeaaiVIqQKXcjsV6hs mxvUETVIV9m7LDUloNKxzDR9ixEUyVOesyTf0hRbEF73KFTVBOyFJgvG+vx4hS0sPaAo fuNgLAhyyOu5rumt9GuCALynl+3n5S2it6E3Ojm5xlIDY8rOXL/K48/k3X9BTzIiNdyx BnNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=kTbpEfpv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id d2si14286731ejl.35.2021.06.28.10.34.19; Mon, 28 Jun 2021 10:34:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=kTbpEfpv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S233235AbhF1OZ6 (ORCPT + 99 others); Mon, 28 Jun 2021 10:25:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:54978 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233253AbhF1OVs (ORCPT ); Mon, 28 Jun 2021 10:21:48 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 572BA61C88; Mon, 28 Jun 2021 14:19:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624889958; bh=stz5r8xqtps6azfB/g+KpMjwljvXV6hjgWBN+qI08/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kTbpEfpvS4/ovVx0WtsbuRnDDzl3EVYNFnofsNE3dl9bDFB/p9rnLLtAnBARA9Re+ Xr6mXl7cmbv5BwVMNJDzb0U4SxUzEJyjUKY4B4101sBj1wtAoLvB5WtYuT1jIMhEcX W7PtZDhfljcWs5tKuy77gC/WfJePTqk9X57aQe7xwMITxXGa+SP2F1CxY1iwtwuchW vM6zf8a6EG/UGO/qfnRxSnJmgdcAt+DJRcy68M/FSveJl4Njqp4vw6DPaQeg/a8778 IvnJLTtTlqk3YSIcbcIzIaT+aa7gx8+z6i/bsozoMR7k5Sl26SwKUiRTZeN61TygTS FT2Eb/G36uLCQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Esben Haabendal , "David S . Miller" , Sasha Levin Subject: [PATCH 5.12 058/110] net: ll_temac: Add memory-barriers for TX BD access Date: Mon, 28 Jun 2021 10:17:36 -0400 Message-Id: <20210628141828.31757-59-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210628141828.31757-1-sashal@kernel.org> References: <20210628141828.31757-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.14-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.12.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.12.14-rc1 X-KernelTest-Deadline: 2021-06-30T14:18+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Esben Haabendal [ Upstream commit 28d9fab458b16bcd83f9dd07ede3d585c3e1a69e ] Add a couple of memory-barriers to ensure correct ordering of read/write access to TX BDs. In xmit_done, we should ensure that reading the additional BD fields are only done after STS_CTRL_APP0_CMPLT bit is set. When xmit_done marks the BD as free by setting APP0=0, we need to ensure that the other BD fields are reset first, so we avoid racing with the xmit path, which writes to the same fields. Finally, making sure to read APP0 of next BD after the current BD, ensures that we see all available buffers. Signed-off-by: Esben Haabendal Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/xilinx/ll_temac_main.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index 01bb36e7cff0..b105e1d35d15 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c @@ -774,12 +774,15 @@ static void temac_start_xmit_done(struct net_device *ndev) stat = be32_to_cpu(cur_p->app0); while (stat & STS_CTRL_APP0_CMPLT) { + /* Make sure that the other fields are read after bd is + * released by dma + */ + rmb(); dma_unmap_single(ndev->dev.parent, be32_to_cpu(cur_p->phys), be32_to_cpu(cur_p->len), DMA_TO_DEVICE); skb = (struct sk_buff *)ptr_from_txbd(cur_p); if (skb) dev_consume_skb_irq(skb); - cur_p->app0 = 0; cur_p->app1 = 0; cur_p->app2 = 0; cur_p->app3 = 0; @@ -788,6 +791,12 @@ static void temac_start_xmit_done(struct net_device *ndev) ndev->stats.tx_packets++; ndev->stats.tx_bytes += be32_to_cpu(cur_p->len); + /* app0 must be visible last, as it is used to flag + * availability of the bd + */ + smp_mb(); + cur_p->app0 = 0; + lp->tx_bd_ci++; if (lp->tx_bd_ci >= lp->tx_bd_num) lp->tx_bd_ci = 0; @@ -814,6 +823,9 @@ static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag) if (cur_p->app0) return NETDEV_TX_BUSY; + /* Make sure to read next bd app0 after this one */ + rmb(); + tail++; if (tail >= lp->tx_bd_num) tail = 0; -- 2.30.2