From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757682AbcC2RCT (ORCPT ); Tue, 29 Mar 2016 13:02:19 -0400 Received: from foss.arm.com ([217.140.101.70]:41788 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751229AbcC2RCS (ORCPT ); Tue, 29 Mar 2016 13:02:18 -0400 Date: Tue, 29 Mar 2016 18:02:39 +0100 From: Will Deacon To: Yong Wu Cc: Joerg Roedel , Catalin Marinas , Matthias Brugger , Robin Murphy , Douglas Anderson , Daniel Kurtz , Tomasz Figa , Arnd Bergmann , Lucas Stach , Marek Szyprowski , linux-mediatek@lists.infradead.org, srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux-foundation.org Subject: Re: [PATCH v2 1/2] dma/iommu: Add pgsize_bitmap confirmation in __iommu_dma_alloc_pages Message-ID: <20160329170238.GK6745@arm.com> References: <1459146732-15620-1-git-send-email-yong.wu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459146732-15620-1-git-send-email-yong.wu@mediatek.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 28, 2016 at 02:32:11PM +0800, Yong Wu wrote: > Currently __iommu_dma_alloc_pages assumes that all the IOMMU support > the granule of PAGE_SIZE. It call alloc_page to try allocating memory > in the last time. Fortunately the mininum pagesize in all the > current IOMMU is SZ_4K, so this works well. > > But there may be a case in which the mininum granule of IOMMU may be > larger than PAGE_SIZE, then it will abort as the IOMMU cann't map the > discontinuous memory within a granule. For example, the pgsize_bitmap > of the IOMMU only has SZ_16K while the PAGE_SIZE is SZ_4K, then we > have to prepare SZ_16K continuous memory at least for each a granule > iommu mapping. Did you find a driver/platform that actually needs this? I certainly think it's possible, but we don't necessarily need to fix it if it's not broken yet! Just adding a comment would be enough. Either way, a couple of review comments inline. > > Signed-off-by: Yong Wu > > --- > v2: > -rebase on v4.6-rc1. > -add a new patch([1/2] add pgsize_bitmap) here. > > drivers/iommu/dma-iommu.c | 22 +++++++++++++--------- > 1 file changed, 13 insertions(+), 9 deletions(-) > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index 72d6182..75ce71e 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -190,11 +190,13 @@ static void __iommu_dma_free_pages(struct page **pages, int count) > kvfree(pages); > } > > -static struct page **__iommu_dma_alloc_pages(unsigned int count, gfp_t gfp) > +static struct page **__iommu_dma_alloc_pages(unsigned int count, gfp_t gfp, > + unsigned long pgsize_bitmap) > { > struct page **pages; > unsigned int i = 0, array_size = count * sizeof(*pages); > - unsigned int order = MAX_ORDER; > + int min_order = get_order(1 << __ffs(pgsize_bitmap)); 1UL > + int order = MAX_ORDER; > > if (array_size <= PAGE_SIZE) > pages = kzalloc(array_size, GFP_KERNEL); > @@ -213,13 +215,16 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, gfp_t gfp) > /* > * Higher-order allocations are a convenience rather > * than a necessity, hence using __GFP_NORETRY until > - * falling back to single-page allocations. > + * falling back to min size allocations. > */ > - for (order = min_t(unsigned int, order, __fls(count)); > - order > 0; order--) { > - page = alloc_pages(gfp | __GFP_NORETRY, order); > + for (order = min_t(int, order, __fls(count)); > + order >= min_order; order--) { > + page = alloc_pages((order == min_order) ? gfp : > + gfp | __GFP_NORETRY, order); > if (!page) > continue; > + if (!order) > + break; Isn't this handled by the loop condition? Will