From 4f2007eb86e3b52a23991ba3313cf998b77446f7 Mon Sep 17 00:00:00 2001 From: Glauber Costa Date: Wed, 9 Apr 2008 13:18:08 -0300 Subject: [PATCH] x86: return conditional to mmu Just return our allocation if we don't have an mmu. For i386, where this patch is being applied, we never have. So our goal is just to have the code to look like x86_64's. Signed-off-by: Glauber Costa Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner --- arch/x86/kernel/pci-dma_32.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/pci-dma_32.c b/arch/x86/kernel/pci-dma_32.c index 5450bd142cb0a..f134de3833a25 100644 --- a/arch/x86/kernel/pci-dma_32.c +++ b/arch/x86/kernel/pci-dma_32.c @@ -116,12 +116,42 @@ again: gfp = (gfp & ~GFP_DMA32) | GFP_DMA; goto again; } + + /* Let low level make its own zone decisions */ + gfp &= ~(GFP_DMA32|GFP_DMA); + + if (dma_ops->alloc_coherent) + return dma_ops->alloc_coherent(dev, size, + dma_handle, gfp); + return NULL; + } memset(ret, 0, size); - *dma_handle = bus; + if (!mmu) { + *dma_handle = bus; + return ret; + } + } + + if (dma_ops->alloc_coherent) { + free_pages((unsigned long)ret, get_order(size)); + gfp &= ~(GFP_DMA|GFP_DMA32); + return dma_ops->alloc_coherent(dev, size, dma_handle, gfp); + } + + if (dma_ops->map_simple) { + *dma_handle = dma_ops->map_simple(dev, virt_to_phys(ret), + size, + PCI_DMA_BIDIRECTIONAL); + if (*dma_handle != bad_dma_address) + return ret; } - return ret; + if (panic_on_overflow) + panic("dma_alloc_coherent: IOMMU overflow by %lu bytes\n", + (unsigned long)size); + free_pages((unsigned long)ret, get_order(size)); + return NULL; } EXPORT_SYMBOL(dma_alloc_coherent); -- 2.39.5