* [RFC PATCH] arm: dma: Drop GFP_COMP for DMA memory allocations
@ 2011-10-28 21:18 Stephen Warren
2011-10-31 10:36 ` Russell King - ARM Linux
0 siblings, 1 reply; 2+ messages in thread
From: Stephen Warren @ 2011-10-28 21:18 UTC (permalink / raw)
To: linux-arm-kernel
From: Sumit Bhattacharya <sumitb@nvidia.com>
dma_alloc_coherent wants to split pages after allocation in order to
reduce the memory footprint. This does not work well with GFP_COMP
pages, so drop this flag before allocation.
This patch is ported from arch/avr32
(commit 3611553ef985ef7c5863c8a94641738addd04cff).
Signed-off-by: Sumit Bhattacharya <sumitb@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
Russell, for background, please see:
http://www.spinics.net/lists/alsa-devel/msg05399.html
https://lkml.org/lkml/2006/7/8/236
I believe the patch below was once posted to solve this for ARM, but never
got picked up. Evidently, AVR32 did pick it up. I'm wondering if we should
pick this up for ARM now, or if there's some other solution?
(note: This patch is actually based on one of our older internal kernels;
I'd need to rebase it if we do decide to go ahead with it. I also haven't
tested it in mainline, and would have difficulty doing so, since the issue
this solves only shows up when using our HD-Audio controller on Tegra30,
and that isn't upstream yet.)
arch/arm/mm/dma-mapping.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 82a093c..93b86e6 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -308,6 +308,13 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
struct page *page;
void *addr;
+ /* Following is a work-around (a.k.a. hack) to prevent pages
+ * with __GFP_COMP being passed to split_page() which cannot
+ * handle them. The real problem is that this flag probably
+ * should be 0 on ARM as it is not supported on this
+ * platform--see CONFIG_HUGETLB_PAGE. */
+ gfp &= ~(__GFP_COMP);
+
*handle = ~0;
size = PAGE_ALIGN(size);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [RFC PATCH] arm: dma: Drop GFP_COMP for DMA memory allocations
2011-10-28 21:18 [RFC PATCH] arm: dma: Drop GFP_COMP for DMA memory allocations Stephen Warren
@ 2011-10-31 10:36 ` Russell King - ARM Linux
0 siblings, 0 replies; 2+ messages in thread
From: Russell King - ARM Linux @ 2011-10-31 10:36 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Oct 28, 2011 at 03:18:52PM -0600, Stephen Warren wrote:
> I believe the patch below was once posted to solve this for ARM, but never
> got picked up. Evidently, AVR32 did pick it up. I'm wondering if we should
> pick this up for ARM now, or if there's some other solution?
Well, Nick did talk about a solution using GFP_USERMAP in one of those
threads, which doesn't seem to have gone anywhere. So I guess we need
this patch.
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index 82a093c..93b86e6 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -308,6 +308,13 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
> struct page *page;
> void *addr;
>
> + /* Following is a work-around (a.k.a. hack) to prevent pages
> + * with __GFP_COMP being passed to split_page() which cannot
> + * handle them. The real problem is that this flag probably
> + * should be 0 on ARM as it is not supported on this
> + * platform--see CONFIG_HUGETLB_PAGE. */
I don't think this comment makes sense anymore - HUGETLB_PAGE doesn't
have any help text.
> + gfp &= ~(__GFP_COMP);
> +
> *handle = ~0;
> size = PAGE_ALIGN(size);
>
> --
> 1.7.0.4
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-10-31 10:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-28 21:18 [RFC PATCH] arm: dma: Drop GFP_COMP for DMA memory allocations Stephen Warren
2011-10-31 10:36 ` Russell King - ARM Linux
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox