From: Michal Hocko <mhocko@kernel.org>
To: Lucas Stach <l.stach@pengutronix.de>
Cc: "Andrew Morton" <akpm@linux-foundation.org>,
"Russell King" <linux@armlinux.org.uk>,
"Catalin Marinas" <catalin.marinas@arm.com>,
"Will Deacon" <will.deacon@arm.com>,
"Ralf Baechle" <ralf@linux-mips.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Radim Krčmář" <rkrcmar@redhat.com>,
"Alexander Graf" <agraf@suse.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Ingo Molnar" <mingo@redhat.com>,
"H . Peter Anvin" <hpa@zytor.com>,
"Chris Zankel" <chris@zankel.net>,
"Max Filippov" <jcmvbkbc@gmail.com>,
"Joerg Roedel" <joro@8bytes.org>,
"David Woodhouse" <dwmw2@infradead.org>,
"Vlastimil Babka" <vbabka@suse.cz>,
linux-arm-kernel@lists.infradead.org, linux-mips@linux-mips.org,
kvm@vger.kernel.org, kvm-ppc@vger.kernel.org,
linux-xtensa@linux-xtensa.org, iommu@lists.linux-foundation.org,
linux-mm@kvack.org, kernel@pengutronix.de,
patchwork-lst@pengutronix.de
Subject: Re: [PATCH 3/3] mm: wire up GFP flag passing in dma_alloc_from_contiguous
Date: Fri, 27 Jan 2017 17:20:54 +0100 [thread overview]
Message-ID: <20170127162053.GC6357@dhcp22.suse.cz> (raw)
In-Reply-To: <20170119170707.31741-3-l.stach@pengutronix.de>
On Thu 19-01-17 18:07:07, Lucas Stach wrote:
> The callers of the DMA alloc functions already provide the proper
> context GFP flags. Make sure to pass them through to the CMA
> allocator, to make the CMA compaction context aware.
>
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Looks good to me
Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> arch/arm/mm/dma-mapping.c | 16 +++++++++-------
> arch/arm64/mm/dma-mapping.c | 4 ++--
> arch/mips/mm/dma-default.c | 4 ++--
> arch/x86/kernel/pci-dma.c | 3 ++-
> arch/xtensa/kernel/pci-dma.c | 3 ++-
> drivers/base/dma-contiguous.c | 5 +++--
> drivers/iommu/amd_iommu.c | 2 +-
> drivers/iommu/intel-iommu.c | 2 +-
> include/linux/dma-contiguous.h | 4 ++--
> 9 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index ab7710002ba6..4d6ec7d821c8 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -349,7 +349,7 @@ static void __dma_free_buffer(struct page *page, size_t size)
> static void *__alloc_from_contiguous(struct device *dev, size_t size,
> pgprot_t prot, struct page **ret_page,
> const void *caller, bool want_vaddr,
> - int coherent_flag);
> + int coherent_flag, gfp_t gfp);
>
> static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp,
> pgprot_t prot, struct page **ret_page,
> @@ -420,7 +420,8 @@ static int __init atomic_pool_init(void)
> */
> if (dev_get_cma_area(NULL))
> ptr = __alloc_from_contiguous(NULL, atomic_pool_size, prot,
> - &page, atomic_pool_init, true, NORMAL);
> + &page, atomic_pool_init, true, NORMAL,
> + GFP_KERNEL);
> else
> ptr = __alloc_remap_buffer(NULL, atomic_pool_size, gfp, prot,
> &page, atomic_pool_init, true);
> @@ -594,14 +595,14 @@ static int __free_from_pool(void *start, size_t size)
> static void *__alloc_from_contiguous(struct device *dev, size_t size,
> pgprot_t prot, struct page **ret_page,
> const void *caller, bool want_vaddr,
> - int coherent_flag)
> + int coherent_flag, gfp_t gfp)
> {
> unsigned long order = get_order(size);
> size_t count = size >> PAGE_SHIFT;
> struct page *page;
> void *ptr = NULL;
>
> - page = dma_alloc_from_contiguous(dev, count, order);
> + page = dma_alloc_from_contiguous(dev, count, order, gfp);
> if (!page)
> return NULL;
>
> @@ -655,7 +656,7 @@ static inline pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot)
> #define __get_dma_pgprot(attrs, prot) __pgprot(0)
> #define __alloc_remap_buffer(dev, size, gfp, prot, ret, c, wv) NULL
> #define __alloc_from_pool(size, ret_page) NULL
> -#define __alloc_from_contiguous(dev, size, prot, ret, c, wv, coherent_flag) NULL
> +#define __alloc_from_contiguous(dev, size, prot, ret, c, wv, coherent_flag, gfp) NULL
> #define __free_from_pool(cpu_addr, size) do { } while (0)
> #define __free_from_contiguous(dev, page, cpu_addr, size, wv) do { } while (0)
> #define __dma_free_remap(cpu_addr, size) do { } while (0)
> @@ -697,7 +698,8 @@ static void *cma_allocator_alloc(struct arm_dma_alloc_args *args,
> {
> return __alloc_from_contiguous(args->dev, args->size, args->prot,
> ret_page, args->caller,
> - args->want_vaddr, args->coherent_flag);
> + args->want_vaddr, args->coherent_flag,
> + args->gfp);
> }
>
> static void cma_allocator_free(struct arm_dma_free_args *args)
> @@ -1293,7 +1295,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size,
> unsigned long order = get_order(size);
> struct page *page;
>
> - page = dma_alloc_from_contiguous(dev, count, order);
> + page = dma_alloc_from_contiguous(dev, count, order, gfp);
> if (!page)
> goto error;
>
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index e04082700bb1..b998f56e6a53 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -107,7 +107,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
> void *addr;
>
> page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT,
> - get_order(size));
> + get_order(size), flags);
> if (!page)
> return NULL;
>
> @@ -379,7 +379,7 @@ static int __init atomic_pool_init(void)
>
> if (dev_get_cma_area(NULL))
> page = dma_alloc_from_contiguous(NULL, nr_pages,
> - pool_size_order);
> + pool_size_order, GFP_KERNEL);
> else
> page = alloc_pages(GFP_DMA, pool_size_order);
>
> diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> index a39c36af97ad..1895a692efd4 100644
> --- a/arch/mips/mm/dma-default.c
> +++ b/arch/mips/mm/dma-default.c
> @@ -148,8 +148,8 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
> gfp = massage_gfp_flags(dev, gfp);
>
> if (IS_ENABLED(CONFIG_DMA_CMA) && gfpflags_allow_blocking(gfp))
> - page = dma_alloc_from_contiguous(dev,
> - count, get_order(size));
> + page = dma_alloc_from_contiguous(dev, count, get_order(size),
> + gfp);
> if (!page)
> page = alloc_pages(gfp, get_order(size));
>
> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
> index d30c37750765..d5c223c9cf11 100644
> --- a/arch/x86/kernel/pci-dma.c
> +++ b/arch/x86/kernel/pci-dma.c
> @@ -91,7 +91,8 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
> page = NULL;
> /* CMA can be used only in the context which permits sleeping */
> if (gfpflags_allow_blocking(flag)) {
> - page = dma_alloc_from_contiguous(dev, count, get_order(size));
> + page = dma_alloc_from_contiguous(dev, count, get_order(size),
> + flag);
> if (page && page_to_phys(page) + size > dma_mask) {
> dma_release_from_contiguous(dev, page, count);
> page = NULL;
> diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
> index 70e362e6038e..34c1f9fa6acc 100644
> --- a/arch/xtensa/kernel/pci-dma.c
> +++ b/arch/xtensa/kernel/pci-dma.c
> @@ -158,7 +158,8 @@ static void *xtensa_dma_alloc(struct device *dev, size_t size,
> flag |= GFP_DMA;
>
> if (gfpflags_allow_blocking(flag))
> - page = dma_alloc_from_contiguous(dev, count, get_order(size));
> + page = dma_alloc_from_contiguous(dev, count, get_order(size),
> + flag);
>
> if (!page)
> page = alloc_pages(flag, get_order(size));
> diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c
> index d1a9cbabc627..b55804cac4c4 100644
> --- a/drivers/base/dma-contiguous.c
> +++ b/drivers/base/dma-contiguous.c
> @@ -181,6 +181,7 @@ int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
> * @dev: Pointer to device for which the allocation is performed.
> * @count: Requested number of pages.
> * @align: Requested alignment of pages (in PAGE_SIZE order).
> + * @gfp_mask: GFP flags to use for this allocation.
> *
> * This function allocates memory buffer for specified device. It uses
> * device specific contiguous memory area if available or the default
> @@ -188,12 +189,12 @@ int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
> * function.
> */
> struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
> - unsigned int align)
> + unsigned int align, gfp_t gfp_mask)
> {
> if (align > CONFIG_CMA_ALIGNMENT)
> align = CONFIG_CMA_ALIGNMENT;
>
> - return cma_alloc(dev_get_cma_area(dev), count, align, GFP_KERNEL);
> + return cma_alloc(dev_get_cma_area(dev), count, align, gfp_mask);
> }
>
> /**
> diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
> index 3ef0f42984f2..bd2e335cdf39 100644
> --- a/drivers/iommu/amd_iommu.c
> +++ b/drivers/iommu/amd_iommu.c
> @@ -2668,7 +2668,7 @@ static void *alloc_coherent(struct device *dev, size_t size,
> return NULL;
>
> page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT,
> - get_order(size));
> + get_order(size), flag);
> if (!page)
> return NULL;
> }
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index 8a185250ae5a..3f804eb4299a 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -3827,7 +3827,7 @@ static void *intel_alloc_coherent(struct device *dev, size_t size,
> if (gfpflags_allow_blocking(flags)) {
> unsigned int count = size >> PAGE_SHIFT;
>
> - page = dma_alloc_from_contiguous(dev, count, order);
> + page = dma_alloc_from_contiguous(dev, count, order, flags);
> if (page && iommu_no_mapping(dev) &&
> page_to_phys(page) + size > dev->coherent_dma_mask) {
> dma_release_from_contiguous(dev, page, count);
> diff --git a/include/linux/dma-contiguous.h b/include/linux/dma-contiguous.h
> index fec734df1524..b67bf6ac907d 100644
> --- a/include/linux/dma-contiguous.h
> +++ b/include/linux/dma-contiguous.h
> @@ -112,7 +112,7 @@ static inline int dma_declare_contiguous(struct device *dev, phys_addr_t size,
> }
>
> struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
> - unsigned int order);
> + unsigned int order, gfp_t gfp_mask);
> bool dma_release_from_contiguous(struct device *dev, struct page *pages,
> int count);
>
> @@ -145,7 +145,7 @@ int dma_declare_contiguous(struct device *dev, phys_addr_t size,
>
> static inline
> struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
> - unsigned int order)
> + unsigned int order, gfp_t gfp_mask)
> {
> return NULL;
> }
> --
> 2.11.0
>
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2017-01-27 16:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-19 17:07 [PATCH 1/3] mm: alloc_contig_range: allow to specify GFP mask Lucas Stach
2017-01-19 17:07 ` [PATCH 2/3] mm: cma_alloc: " Lucas Stach
2017-01-20 13:35 ` Vlastimil Babka
2017-01-27 16:19 ` Michal Hocko
2017-01-19 17:07 ` [PATCH 3/3] mm: wire up GFP flag passing in dma_alloc_from_contiguous Lucas Stach
2017-01-20 13:35 ` Vlastimil Babka
2017-01-27 16:20 ` Michal Hocko [this message]
2017-01-20 12:35 ` [PATCH 1/3] mm: alloc_contig_range: allow to specify GFP mask Vlastimil Babka
2017-01-27 16:19 ` Michal Hocko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170127162053.GC6357@dhcp22.suse.cz \
--to=mhocko@kernel.org \
--cc=agraf@suse.com \
--cc=akpm@linux-foundation.org \
--cc=catalin.marinas@arm.com \
--cc=chris@zankel.net \
--cc=dwmw2@infradead.org \
--cc=hpa@zytor.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jcmvbkbc@gmail.com \
--cc=joro@8bytes.org \
--cc=kernel@pengutronix.de \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=l.stach@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mips@linux-mips.org \
--cc=linux-mm@kvack.org \
--cc=linux-xtensa@linux-xtensa.org \
--cc=linux@armlinux.org.uk \
--cc=mingo@redhat.com \
--cc=patchwork-lst@pengutronix.de \
--cc=pbonzini@redhat.com \
--cc=ralf@linux-mips.org \
--cc=rkrcmar@redhat.com \
--cc=tglx@linutronix.de \
--cc=vbabka@suse.cz \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).