Received: by 2002:a25:d783:0:0:0:0:0 with SMTP id o125csp652821ybg; Thu, 19 Mar 2020 06:27:21 -0700 (PDT) X-Google-Smtp-Source: ADFU+vs2PqRmyKaFb4VzgY9LOoolN6TWE8okGaw/6+YTT6jyxHpgY+pC88yWuxAChX3OEH5Ga51a X-Received: by 2002:a05:6830:10cc:: with SMTP id z12mr2051782oto.357.1584624441582; Thu, 19 Mar 2020 06:27:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1584624441; cv=none; d=google.com; s=arc-20160816; b=Nq8hLrOd1YaZQhhimr2c7CO2EQL9laE/5/orbjFU2SqmbD9nNiNGwVyrxqK3xzq/4R uX5yr5L5HCg32nNLub2hJL43/rOi94S2qwFdZO36HhsWG04H1FoA86WgnIn41b6duB/N Ii+Iz/ab9Psp/Mat9W/gIbeXP5JOex5iBJtm5zAw8wQcPChr+kmoCeStoLPvybJmABw2 RGiINRUT9pt+OuUGH33LacihZkZhpQOmNQlioCON7tel7ivA0YpHHUWSELfCTjoOdmAJ 6bUEAXun1INurAd5HOpJs3n7dAkOHNOc5H0d/phAMsXg3dNf2DJ+NTsZ7uv2qoWd5y+n 2G8w== 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=xTVUjb0VduIEjkrlTr3biz6LDx/hmWAGld9PGv8zkmw=; b=mEjVK/XiO7vOJtDwJwlZgnhyLa3kHUx2fdNFGQGZ+3O9zi/39FceY1Y0vStDXj4Edz 248SSEgIVQSqf3Xn9/dVyXzE3ZDRBvlnHddm3irISEhLpEIc+Da5DQFJDqRnIR1tIpWH 1VtTYbuyRDRZcD681hd9E1/Revvryz7jQESHeCt+cUttBEj88zdMsgR2Z1jsvB81BnnJ NRVX+1/LUbYzH3z85QY7Yre/hKejqwsrcO9aruXW0SbsxovfJ/p5BXqR0ft3uicYOLqp xmsdejIb1ZMzaISqV6ex3cZ1oszIo6op02i+/NwzdqepJSbJ0VW1vm56hoSpxol+lura 3xmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=E4zEvVKV; 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 k3si1005609oib.82.2020.03.19.06.27.08; Thu, 19 Mar 2020 06:27:21 -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=E4zEvVKV; 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 S1730755AbgCSN0L (ORCPT + 99 others); Thu, 19 Mar 2020 09:26:11 -0400 Received: from mail.kernel.org ([198.145.29.99]:54020 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730748AbgCSN0J (ORCPT ); Thu, 19 Mar 2020 09:26:09 -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 87879207FC; Thu, 19 Mar 2020 13:26:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1584624369; bh=wgmoLWEcseM6n7d6+U/LOI7cmzjZ0l1QeI4r/EulqzA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E4zEvVKVD8Xs1wzKC2X8X4sOLnSe9JPLvt7XREje0rxm3jftEukS/ETUdcZOvXleT A9jZWdoOO4q6DUt/oMoHkLo+4zK+DcHOJZaVM26k2ta4EVhIKS9WxgHqiLJ6kfgf9C rhBgA1EWdkJZjSneJsKhxsBUatcKz4uMthRk4Mo4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Esben Haabendal , "David S. Miller" , Sasha Levin Subject: [PATCH 5.5 30/65] net: ll_temac: Add more error handling of dma_map_single() calls Date: Thu, 19 Mar 2020 14:04:12 +0100 Message-Id: <20200319123935.928919642@linuxfoundation.org> X-Mailer: git-send-email 2.25.2 In-Reply-To: <20200319123926.466988514@linuxfoundation.org> References: <20200319123926.466988514@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 From: Esben Haabendal [ Upstream commit d07c849cd2b97d6809430dfb7e738ad31088037a ] This adds error handling to the remaining dma_map_single() calls, so that behavior is well defined if/when we run out of DMA memory. Fixes: 92744989533c ("net: add Xilinx ll_temac device driver") Signed-off-by: Esben Haabendal Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/xilinx/ll_temac_main.c | 26 +++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index fd578568b3bff..fd4231493449b 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c @@ -367,6 +367,8 @@ static int temac_dma_bd_init(struct net_device *ndev) skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data, XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE); + if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) + goto out; lp->rx_bd_v[i].phys = cpu_to_be32(skb_dma_addr); lp->rx_bd_v[i].len = cpu_to_be32(XTE_MAX_JUMBO_FRAME_SIZE); lp->rx_bd_v[i].app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); @@ -863,12 +865,13 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev) skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data, skb_headlen(skb), DMA_TO_DEVICE); cur_p->len = cpu_to_be32(skb_headlen(skb)); + if (WARN_ON_ONCE(dma_mapping_error(ndev->dev.parent, skb_dma_addr))) + return NETDEV_TX_BUSY; cur_p->phys = cpu_to_be32(skb_dma_addr); ptr_to_txbd((void *)skb, cur_p); for (ii = 0; ii < num_frag; ii++) { - lp->tx_bd_tail++; - if (lp->tx_bd_tail >= TX_BD_NUM) + if (++lp->tx_bd_tail >= TX_BD_NUM) lp->tx_bd_tail = 0; cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; @@ -876,6 +879,25 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev) skb_frag_address(frag), skb_frag_size(frag), DMA_TO_DEVICE); + if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) { + if (--lp->tx_bd_tail < 0) + lp->tx_bd_tail = TX_BD_NUM - 1; + cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; + while (--ii >= 0) { + --frag; + dma_unmap_single(ndev->dev.parent, + be32_to_cpu(cur_p->phys), + skb_frag_size(frag), + DMA_TO_DEVICE); + if (--lp->tx_bd_tail < 0) + lp->tx_bd_tail = TX_BD_NUM - 1; + cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; + } + dma_unmap_single(ndev->dev.parent, + be32_to_cpu(cur_p->phys), + skb_headlen(skb), DMA_TO_DEVICE); + return NETDEV_TX_BUSY; + } cur_p->phys = cpu_to_be32(skb_dma_addr); cur_p->len = cpu_to_be32(skb_frag_size(frag)); cur_p->app0 = 0; -- 2.20.1