From: Christoph Lameter Slab pages obtained via kmalloc are not cachline aligned. Nor is it advisable to perform VM operations designed for page allocator pages on memory obtained via kmalloc. So replace the page sized allocations in kernel/pci-dma.c with page allocator pages. Signed-off-by: Christoph Lameter Cc: Hugh Dickins Cc: Kyle McMartin Cc: Grant Grundler , Cc: Matthew Wilcox Signed-off-by: Andrew Morton --- arch/parisc/kernel/pci-dma.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff -puN arch/parisc/kernel/pci-dma.c~pa-risc-use-page-allocator-instead-of-slab-allocator arch/parisc/kernel/pci-dma.c --- a/arch/parisc/kernel/pci-dma.c~pa-risc-use-page-allocator-instead-of-slab-allocator +++ a/arch/parisc/kernel/pci-dma.c @@ -569,11 +569,10 @@ static void *fail_alloc_consistent(struc static void *pa11_dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) { - void *addr = NULL; + void *addr; - /* rely on kmalloc to be cacheline aligned */ - addr = kmalloc(size, flag); - if(addr) + addr = (void *)__get_free_pages(flag, get_order(size)); + if (addr) *dma_handle = (dma_addr_t)virt_to_phys(addr); return addr; @@ -582,7 +581,7 @@ static void *pa11_dma_alloc_noncoherent( static void pa11_dma_free_noncoherent(struct device *dev, size_t size, void *vaddr, dma_addr_t iova) { - kfree(vaddr); + free_pages((unsigned long)vaddr, get_order(size)); return; } _