Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp930766imu; Fri, 7 Dec 2018 11:08:56 -0800 (PST) X-Google-Smtp-Source: AFSGD/VaLIjfA+wpQTR2ciawT+uYTM7EPkZfKADwXZs8oPQXKvzcI0ajntYyF/470SfTGyQQBq70 X-Received: by 2002:a63:7f4f:: with SMTP id p15mr3030946pgn.296.1544209736379; Fri, 07 Dec 2018 11:08:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544209736; cv=none; d=google.com; s=arc-20160816; b=OQBmZ3w17dD7/WHMbWX88RGQYWerXBs+Tv2hNXv67muZ3HDl705iWrLJDpa+lvfQOZ vF317JGFS5eUfbh1p11BP4BQh6+jW7lasxcAFBekLAuwRvl7Rcb7UIhlGAEvjkmT5a2E xcNcxRb4ptlphPk+wpKb1x9xEsoYnaa3088ftdalbTHvNmOEGqkZCocdjfSilDFw37Pt IDKRhrZ0/SGhNGbFK58IMldywvq1J+hnZa8jH+3/9C2zxbT+ElDa8h2t+ln70o9SwQvm M9m5l5khnkNzyoRLNFCq8wkqrU7XKTsZJL8ZDZ4j1F+h5eWbiy11aF15s0ysy/LjI+ya sOXQ== 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=KDUsWhqtiK68OQ6enzSKjeJHX/RuYZSLZlpmVulYSRQ=; b=OtWTU2wndc1tU8PyqhnpGMAihrbLG4YTNKVSR7Cqw2r6WMG+kkFE5/mTgfDLKrLco6 NNOI6bH0bmq4r3uAoUZikVBSgUDz7juIAvkn8qaeVOhgNzA6mAfhuvkstXzx/SscPr3M EvY6vhXzIrlKfP08tvZetLYJdydi1aa9B1O+njjCn1YUP1RtxSHjWqyg1aoUAf5AhsGp 68h+0yM2E7Ys2SDkq3Sjq5AnBbPCwtbQdPn1rGofL0twhMPKJeA7KC8zxnWRz4QZK2kF MxKKfTOwkRDa2syGaXDWhXXHFqHfRY7xlK5n2ZvkjU/K81H0m6jnHvXS/Mq4SnJMjig3 +BUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=Kp7OnWOc; 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 c17si3465765pgl.385.2018.12.07.11.08.41; Fri, 07 Dec 2018 11:08:56 -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=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=Kp7OnWOc; 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 S1726230AbeLGTHy (ORCPT + 99 others); Fri, 7 Dec 2018 14:07:54 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:48386 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726203AbeLGTHx (ORCPT ); Fri, 7 Dec 2018 14:07:53 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KDUsWhqtiK68OQ6enzSKjeJHX/RuYZSLZlpmVulYSRQ=; b=Kp7OnWOcPAfso13DkIHpnvUoeb yBZ0GnhBTC1QpVIupludR0Da2qdzCXvvZpb546JiNQqkbCl+gY7jkiv7aYWsdmLKFYHH6JbX1xFi9 lcChq0dEV6Aw/F8OXtK519/BcQYw5ncoPQnOJqVcKJ4zOY9EnmQiKvpfeTmTfAoUsMJWOHWxfzGQU KSREG1v6Wr5UQzYRwogODSDjDjD2/WcSzP0IwWpPKKLWUpAL4Hij6cgGq7ALXRQQMwYZZ4zoNqWoe CmnmSo2ceqC9MU8bIwd8rXjt6fKaiZG9gf2pZcK6dYy6sOCZrssj+6ZQ/uPazcWC+UCBdVUQJNc5R E+WH3m4g==; Received: from [199.255.44.128] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.90_1 #2 (Red Hat Linux)) id 1gVLTT-0006ga-91; Fri, 07 Dec 2018 19:07:43 +0000 From: Christoph Hellwig To: iommu@lists.linux-foundation.org, Linus Torvalds , Jesper Dangaard Brouer Cc: Tariq Toukan , Ilias Apalodimas , =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , Robin Murphy , Konrad Rzeszutek Wilk , Tony Luck , Fenghua Yu , Marek Szyprowski , Keith Busch , Jonathan Derrick , linux-pci@vger.kernel.org, linux-ia64@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 03/15] dma-direct: improve addressability error reporting Date: Fri, 7 Dec 2018 11:07:08 -0800 Message-Id: <20181207190720.18517-4-hch@lst.de> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181207190720.18517-1-hch@lst.de> References: <20181207190720.18517-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Only report report a DMA addressability report once to avoid spewing the kernel log with repeated message. Also provide a stack trace to make it easy to find the actual caller that caused the problem. Last but not least move the actual check into the fast path and only leave the error reporting in a helper. Signed-off-by: Christoph Hellwig --- kernel/dma/direct.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 308f88a750c8..edb24f94ea1e 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -30,27 +30,16 @@ static inline bool force_dma_unencrypted(void) return sev_active(); } -static bool -check_addr(struct device *dev, dma_addr_t dma_addr, size_t size, - const char *caller) +static void report_addr(struct device *dev, dma_addr_t dma_addr, size_t size) { - if (unlikely(dev && !dma_capable(dev, dma_addr, size))) { - if (!dev->dma_mask) { - dev_err(dev, - "%s: call on device without dma_mask\n", - caller); - return false; - } - - if (*dev->dma_mask >= DMA_BIT_MASK(32) || dev->bus_dma_mask) { - dev_err(dev, - "%s: overflow %pad+%zu of device mask %llx bus mask %llx\n", - caller, &dma_addr, size, - *dev->dma_mask, dev->bus_dma_mask); - } - return false; + if (!dev->dma_mask) { + dev_err_once(dev, "DMA map on device without dma_mask\n"); + } else if (*dev->dma_mask >= DMA_BIT_MASK(32) || dev->bus_dma_mask) { + dev_err_once(dev, + "overflow %pad+%zu of DMA mask %llx bus mask %llx\n", + &dma_addr, size, *dev->dma_mask, dev->bus_dma_mask); } - return true; + WARN_ON_ONCE(1); } static inline dma_addr_t phys_to_dma_direct(struct device *dev, @@ -288,8 +277,10 @@ dma_addr_t dma_direct_map_page(struct device *dev, struct page *page, phys_addr_t phys = page_to_phys(page) + offset; dma_addr_t dma_addr = phys_to_dma(dev, phys); - if (!check_addr(dev, dma_addr, size, __func__)) + if (unlikely(dev && !dma_capable(dev, dma_addr, size))) { + report_addr(dev, dma_addr, size); return DMA_MAPPING_ERROR; + } if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) dma_direct_sync_single_for_device(dev, dma_addr, size, dir); @@ -306,8 +297,11 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, BUG_ON(!sg_page(sg)); sg_dma_address(sg) = phys_to_dma(dev, sg_phys(sg)); - if (!check_addr(dev, sg_dma_address(sg), sg->length, __func__)) + if (unlikely(dev && !dma_capable(dev, sg_dma_address(sg), + sg->length))) { + report_addr(dev, sg_dma_address(sg), sg->length); return 0; + } sg_dma_len(sg) = sg->length; } -- 2.19.1