Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753198AbcKGNSW (ORCPT ); Mon, 7 Nov 2016 08:18:22 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:28927 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753008AbcKGNRd (ORCPT ); Mon, 7 Nov 2016 08:17:33 -0500 X-AuditID: cbfec7ef-f79e76d000005b57-c2-58207c530bb3 From: Marek Szyprowski To: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Marek Szyprowski , Robin Murphy , Joerg Roedel Subject: [PATCH] iommu/dma-iommu: properly respect configured address space size Date: Mon, 07 Nov 2016 14:06:13 +0100 Message-id: <1478523973-8828-1-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrOIsWRmVeSWpSXmKPExsWy7djPc7rBNQoRBjvWiVos2G9t0Tl7A7vF psfXWC0u75rDZrH2yF12i4MfnrA6sHk8OTiPyWPNvDWMHpuX1HtMvrGc0aNvyypGj8+b5ALY orhsUlJzMstSi/TtErgy2g+wFpziqthy+j5zA+NTji5GTg4JAROJTV2LWCFsMYkL99azdTFy cQgJLGOUOHjtE5TzmVHi1uLDjDAdb7adYIGr2jV9FiuE08Ak8aKjjwWkik3AUKLrbRcbiC0i kCUx/+IcsB3MAmUS5+8/AqsRFgiSeHr0BDOIzSKgKnFi60OgDRwcvALuEjN2lEIsk5M4eWwy 2HwJgetsEq1P3zKB1EgIyEpsOsAMUeMi8fF+O9RxwhKvjm9hh7BlJDo7DjJB2P2MEk2t2hD2 DEaJc295IWxricPHL0Kdxicxadt0ZojxvBIdbUIQpofEzz/JENWOEmfWvgA7XkggVmLr02nM ExilFzAyrGIUSS0tzk1PLTbUK07MLS7NS9dLzs/dxAiMztP/jr/fwfi0OeQQowAHoxIPb4ad fIQQa2JZcWXuIUYJDmYlEd7ICoUIId6UxMqq1KL8+KLSnNTiQ4zSHCxK4rx7F1wJFxJITyxJ zU5NLUgtgskycXBKNTCWtMuf1Qm7HXyq/JHXLY+dlw4X/oj2N4xyWy5XXqoxY7volC2CYg2T Ht57tOi/dY3fkakHppYqXPdh/zHt79cok0esu1c/neC5ratH/2dh+Uu7oN/9R6/P/tvevoX5 f2IDj3Jr3YnEL5cuxyytOCpj7xscv1Or+M32F7tmKq02vXl5/cu261uYlFiKMxINtZiLihMB 5wbEAcoCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLLMWRmVeSWpSXmKPExsVy+t/xK7oBNQoRBsumC1ss2G9t0Tl7A7vF psfXWC0u75rDZrH2yF12i4MfnrA6sHk8OTiPyWPNvDWMHpuX1HtMvrGc0aNvyypGj8+b5ALY otxsMlITU1KLFFLzkvNTMvPSbZVCQ9x0LZQU8hJzU22VInR9Q4KUFMoSc0qBPCMDNODgHOAe rKRvl+CW0X6AteAUV8WW0/eZGxifcnQxcnJICJhIvNl2ggXCFpO4cG89WxcjF4eQwBJGiQNL ZrFAOE1MEquX/WECqWITMJToetvFBmKLCGRJ7Hz1FSzOLFAm8eNDJ9gkYYEAiYetP9lBbBYB VYkTWx8ydjFycPAKuEvM2FEKsUxO4uSxyawTGLkXMDKsYhRJLS3OTc8tNtQrTswtLs1L10vO z93ECAzKbcd+bt7BeGlj8CFGAQ5GJR5eARv5CCHWxLLiytxDjBIczEoivJEVChFCvCmJlVWp RfnxRaU5qcWHGE2Bdk9klhJNzgdGTF5JvKGJobmloZGxhYW5kZGSOG/JhyvhQgLpiSWp2amp BalFMH1MHJxSDYwTz5wLKZH9xKn6L/LSPe6rtvZCDNuehGzyrjdtV2N7HH7K5OiDvqM86+TO P7vSGarE/+XSdbbbX1wqFINvyl+cUzsr72fjzeZN2iZTV81R61Nd4JKTFcn0/cbivwJTdrzp iYvzKFxpOKF51d94g+XWbccN1l18pGGy6Z3/VkamxuMFZYfbhfmVWIozEg21mIuKEwF+0CXy YAIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161107130625eucas1p2dd23c07010b4f3eddb6c6540ed802246 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161107130625eucas1p2dd23c07010b4f3eddb6c6540ed802246 X-RootMTR: 20161107130625eucas1p2dd23c07010b4f3eddb6c6540ed802246 References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1319 Lines: 33 When one called iommu_dma_init_domain() with size smaller than device's DMA mask, the alloc_iova() will not respect it and always assume that all IOVA addresses will be allocated from the the (base ... dev->dma_mask) range. This patch fixes this issue by taking the configured address space size parameter into account (if it is smaller than the device's dma_mask). Signed-off-by: Marek Szyprowski --- drivers/iommu/dma-iommu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index c5ab8667e6f2..8b4b72654359 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -212,11 +212,13 @@ static struct iova *__alloc_iova(struct iommu_domain *domain, size_t size, if (domain->geometry.force_aperture) dma_limit = min(dma_limit, domain->geometry.aperture_end); + + dma_limit = min(dma_limit >> shift, (dma_addr_t)iovad->dma_32bit_pfn); /* * Enforce size-alignment to be safe - there could perhaps be an * attribute to control this per-device, or at least per-domain... */ - return alloc_iova(iovad, length, dma_limit >> shift, true); + return alloc_iova(iovad, length, dma_limit, true); } /* The IOVA allocator knows what we mapped, so just unmap whatever that was */ -- 1.9.1