From patchwork Wed Aug 22 12:52:28 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hiroshi DOYU X-Patchwork-Id: 1361181 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork2.kernel.org (Postfix) with ESMTP id 455E2DF280 for ; Wed, 22 Aug 2012 12:56:33 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1T4AQu-0000wT-FY; Wed, 22 Aug 2012 12:53:16 +0000 Received: from hqemgate04.nvidia.com ([216.228.121.35]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1T4AQm-0000wF-LY for linux-arm-kernel@lists.infradead.org; Wed, 22 Aug 2012 12:53:13 +0000 Received: from hqnvupgp06.nvidia.com (Not Verified[216.228.121.13]) by hqemgate04.nvidia.com id ; Wed, 22 Aug 2012 05:52:01 -0700 Received: from hqemhub01.nvidia.com ([172.17.108.22]) by hqnvupgp06.nvidia.com (PGP Universal service); Wed, 22 Aug 2012 05:52:40 -0700 X-PGP-Universal: processed; by hqnvupgp06.nvidia.com on Wed, 22 Aug 2012 05:52:40 -0700 Received: from deemhub02.nvidia.com (10.21.69.138) by hqemhub01.nvidia.com (172.20.150.30) with Microsoft SMTP Server (TLS) id 8.3.264.0; Wed, 22 Aug 2012 05:52:40 -0700 Received: from DEMAIL01.nvidia.com ([10.21.69.140]) by deemhub02.nvidia.com ([10.21.69.138]) with mapi; Wed, 22 Aug 2012 14:52:36 +0200 From: Hiroshi Doyu To: "m.szyprowski@samsung.com" Date: Wed, 22 Aug 2012 14:52:28 +0200 Subject: Re: [RFC 2/4] ARM: dma-mapping: IOMMU allocates pages from pool with GFP_ATOMIC Thread-Topic: [RFC 2/4] ARM: dma-mapping: IOMMU allocates pages from pool with GFP_ATOMIC Thread-Index: Ac2AZQDahdqmGf/JQJyv1KfuJ++hkQ== Message-ID: <20120822.155228.1203479129187316092.hdoyu@nvidia.com> References: <1345630830-9586-1-git-send-email-hdoyu@nvidia.com><1345630830-9586-3-git-send-email-hdoyu@nvidia.com><005a01cd8061$d58998c0$809cca40$%szyprowski@samsung.com> In-Reply-To: <005a01cd8061$d58998c0$809cca40$%szyprowski@samsung.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-nvconfidentiality: public acceptlanguage: en-US MIME-Version: 1.0 X-Spam-Note: CRM114 invocation failed X-Spam-Score: -7.1 (-------) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-7.1 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at http://www.dnswl.org/, high trust [216.228.121.35 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.2 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: "linux@arm.linux.org.uk" , "arnd@arndb.de" , "konrad.wilk@oracle.com" , "chunsang.jeong@linaro.org" , "minchan@kernel.org" , "linux-kernel@vger.kernel.org" , "subashrp@gmail.com" , "linaro-mm-sig@lists.linaro.org" , "linux-mm@kvack.org" , "kyungmin.park@samsung.com" , "linux-arm-kernel@lists.infradead.org" X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Marek Szyprowski wrote @ Wed, 22 Aug 2012 14:29:47 +0200: > Hello, > > On Wednesday, August 22, 2012 12:20 PM Hiroshi Doyu wrote: > > > Makes use of the same atomic pool from DMA, and skips kernel page > > mapping which can involves sleep'able operation at allocating a kernel > > page table. > > > > Signed-off-by: Hiroshi Doyu > > --- > > arch/arm/mm/dma-mapping.c | 22 ++++++++++++++++++---- > > 1 files changed, 18 insertions(+), 4 deletions(-) > > > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c > > index aec0c06..9260107 100644 > > --- a/arch/arm/mm/dma-mapping.c > > +++ b/arch/arm/mm/dma-mapping.c > > @@ -1028,7 +1028,6 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t > > size, > > struct page **pages; > > int count = size >> PAGE_SHIFT; > > int array_size = count * sizeof(struct page *); > > - int err; > > > > if (array_size <= PAGE_SIZE) > > pages = kzalloc(array_size, gfp); > > @@ -1037,9 +1036,20 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t > > size, > > if (!pages) > > return NULL; > > > > - err = __alloc_fill_pages(&pages, count, gfp); > > - if (err) > > - goto error > > + if (gfp & GFP_ATOMIC) { > > + struct page *page; > > + int i; > > + void *addr = __alloc_from_pool(size, &page); > > + if (!addr) > > + goto err_out; > > + > > + for (i = 0; i < count; i++) > > + pages[i] = page + i; > > + } else { > > + int err = __alloc_fill_pages(&pages, count, gfp); > > + if (err) > > + goto error; > > + } > > > > return pages; > > error: > > @@ -1055,6 +1065,10 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, > > size_t s > > int count = size >> PAGE_SHIFT; > > int array_size = count * sizeof(struct page *); > > int i; > > + > > + if (__free_from_pool(page_address(pages[0]), size)) > > + return 0; > > You leak memory here. pages array should be also freed. Right, I'll fix as below: Modified arch/arm/mm/dma-mapping.c diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 47c4978..4656c0f 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -1121,11 +1121,12 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t s int i; if (__free_from_pool(page_address(pages[0]), size)) - return 0; + goto out; for (i = 0; i < count; i++) if (pages[i]) __free_pages(pages[i], 0); +out: if (array_size <= PAGE_SIZE) kfree(pages); else