Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752518AbdIVPoy (ORCPT ); Fri, 22 Sep 2017 11:44:54 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:37080 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752496AbdIVPox (ORCPT ); Fri, 22 Sep 2017 11:44:53 -0400 X-Google-Smtp-Source: AOwi7QAXuGcE7luM8me3xYBJ8BiJZQulZmouTlq2tbK8s/R6lBTMd1+jZU8g5UkoGREHCoQR/z8aUaqZ4ys5tUPV7BM= MIME-Version: 1.0 In-Reply-To: <9d65676f-e4e8-e0a6-602c-361d83ce83c1@arm.com> References: <20170921085922.11659-1-ganapatrao.kulkarni@cavium.com> <20170921085922.11659-5-ganapatrao.kulkarni@cavium.com> <9d65676f-e4e8-e0a6-602c-361d83ce83c1@arm.com> From: Ganapatrao Kulkarni Date: Fri, 22 Sep 2017 21:14:51 +0530 Message-ID: Subject: Re: [PATCH 4/4] iommu/dma, numa: Use NUMA aware memory allocations in __iommu_dma_alloc_pages To: Robin Murphy Cc: Ganapatrao Kulkarni , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux-foundation.org, linux-mm@kvack.org, Will Deacon , Lorenzo Pieralisi , Hanjun Guo , Joerg Roedel , vbabka@suse.cz, akpm@linux-foundation.org, mhocko@suse.com, Tomasz.Nowicki@cavium.com, Robert.Richter@cavium.com, jnair@caviumnetworks.com Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3055 Lines: 83 Hi Robin, On Thu, Sep 21, 2017 at 5:11 PM, Robin Murphy wrote: > On 21/09/17 09:59, Ganapatrao Kulkarni wrote: >> Change function __iommu_dma_alloc_pages to allocate memory/pages >> for dma from respective device numa node. >> >> Signed-off-by: Ganapatrao Kulkarni >> --- >> drivers/iommu/dma-iommu.c | 17 ++++++++++------- >> 1 file changed, 10 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c >> index 9d1cebe..0626b58 100644 >> --- a/drivers/iommu/dma-iommu.c >> +++ b/drivers/iommu/dma-iommu.c >> @@ -428,20 +428,21 @@ static void __iommu_dma_free_pages(struct page **pages, int count) >> kvfree(pages); >> } >> >> -static struct page **__iommu_dma_alloc_pages(unsigned int count, >> - unsigned long order_mask, gfp_t gfp) >> +static struct page **__iommu_dma_alloc_pages(struct device *dev, >> + unsigned int count, unsigned long order_mask, gfp_t gfp) >> { >> struct page **pages; >> unsigned int i = 0, array_size = count * sizeof(*pages); >> + int numa_node = dev_to_node(dev); >> >> order_mask &= (2U << MAX_ORDER) - 1; >> if (!order_mask) >> return NULL; >> >> if (array_size <= PAGE_SIZE) >> - pages = kzalloc(array_size, GFP_KERNEL); >> + pages = kzalloc_node(array_size, GFP_KERNEL, numa_node); >> else >> - pages = vzalloc(array_size); >> + pages = vzalloc_node(array_size, numa_node); > > kvzalloc{,_node}() didn't exist when this code was first written, but it > does now - since you're touching it you may as well get rid of the whole > if-else and array_size local. thanks, i will update in next version. > > Further nit: some of the indentation below is a bit messed up. ok, will fix it. > > Robin. > >> if (!pages) >> return NULL; >> >> @@ -462,8 +463,9 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, >> unsigned int order = __fls(order_mask); >> >> order_size = 1U << order; >> - page = alloc_pages((order_mask - order_size) ? >> - gfp | __GFP_NORETRY : gfp, order); >> + page = alloc_pages_node(numa_node, >> + (order_mask - order_size) ? >> + gfp | __GFP_NORETRY : gfp, order); >> if (!page) >> continue; >> if (!order) >> @@ -548,7 +550,8 @@ struct page **iommu_dma_alloc(struct device *dev, size_t size, gfp_t gfp, >> alloc_sizes = min_size; >> >> count = PAGE_ALIGN(size) >> PAGE_SHIFT; >> - pages = __iommu_dma_alloc_pages(count, alloc_sizes >> PAGE_SHIFT, gfp); >> + pages = __iommu_dma_alloc_pages(dev, count, alloc_sizes >> PAGE_SHIFT, >> + gfp); >> if (!pages) >> return NULL; >> >> > thanks Ganapat