[PATCH] x86: fix nommu_alloc_coherent allocation with NULL device argument

From: FUJITA Tomonori
Date: Fri Sep 05 2008 - 05:03:41 EST


We need to use __GFP_DMA for NULL device argument (fallback_dev) with
pci-nommu. It's a hack for ISA (and some old code) so we need to use
GFP_DMA.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>
---
arch/x86/kernel/pci-nommu.c | 5 +----
include/asm-x86/dma-mapping.h | 2 ++
2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c
index 73853d3..526b2db 100644
--- a/arch/x86/kernel/pci-nommu.c
+++ b/arch/x86/kernel/pci-nommu.c
@@ -83,7 +83,6 @@ nommu_alloc_coherent(struct device *hwdev, size_t size,
if (hwdev->dma_mask == NULL)
return NULL;

- gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
gfp |= __GFP_ZERO;

dma_mask = hwdev->coherent_dma_mask;
@@ -96,14 +95,12 @@ nommu_alloc_coherent(struct device *hwdev, size_t size,
node = dev_to_node(hwdev);

#ifdef CONFIG_X86_64
- if (dma_mask <= DMA_32BIT_MASK)
+ if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA))
gfp |= GFP_DMA32;
#endif
-
/* No alloc-free penalty for ISA devices */
if (dma_mask == DMA_24BIT_MASK)
gfp |= GFP_DMA;
-
again:
page = alloc_pages_node(node, gfp, get_order(size));
if (!page)
diff --git a/include/asm-x86/dma-mapping.h b/include/asm-x86/dma-mapping.h
index 3a9a6f5..de4495e 100644
--- a/include/asm-x86/dma-mapping.h
+++ b/include/asm-x86/dma-mapping.h
@@ -246,6 +246,8 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
struct dma_mapping_ops *ops = get_dma_ops(dev);
void *memory;

+ gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
+
if (dma_alloc_from_coherent(dev, size, dma_handle, &memory))
return memory;

--
1.5.4.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/