alpha: fix ALSA DMA mmap crash
authorIvan Kokshaysky <ink@jurassic.park.msu.ru>
Wed, 2 Apr 2008 20:04:43 +0000 (13:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 2 Apr 2008 22:28:19 +0000 (15:28 -0700)
Make dma_alloc_coherent respect gfp flags (__GFP_COMP is one that
matters).

Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Tested-by: Michael Cree <mcree@orcon.net.nz>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/alpha/kernel/pci_iommu.c
include/asm-alpha/dma-mapping.h
include/asm-alpha/pci.h

index 4e1c08636edd66b4c08b58aee5c358b55a0c382c..dd6e334ab9e127d61338f27bb28de710689aa6ab 100644 (file)
@@ -424,11 +424,13 @@ EXPORT_SYMBOL(pci_unmap_page);
    else DMA_ADDRP is undefined.  */
 
 void *
-pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
+__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
+                      dma_addr_t *dma_addrp, gfp_t gfp)
 {
        void *cpu_addr;
        long order = get_order(size);
-       gfp_t gfp = GFP_ATOMIC;
+
+       gfp &= ~GFP_DMA;
 
 try_again:
        cpu_addr = (void *)__get_free_pages(gfp, order);
@@ -458,7 +460,7 @@ try_again:
 
        return cpu_addr;
 }
-EXPORT_SYMBOL(pci_alloc_consistent);
+EXPORT_SYMBOL(__pci_alloc_consistent);
 
 /* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
    be values that were returned from pci_alloc_consistent.  SIZE must
index 75a1aff5b57b2980ec7c8e46a7367615cf0b41d6..db351d1296f4bb13a9dfab082c7ce2dc66969e62 100644 (file)
@@ -11,7 +11,7 @@
 #define dma_unmap_single(dev, addr, size, dir)         \
                pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir)
 #define dma_alloc_coherent(dev, size, addr, gfp)       \
-               pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr)
+             __pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr, gfp)
 #define dma_free_coherent(dev, size, va, addr)         \
                pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr)
 #define dma_map_page(dev, page, off, size, dir)                \
index d5b10ef643642b292c7baad6098d06175520f8e9..d31fd49ff79a40fc7d00d22528f9b955739786e9 100644 (file)
@@ -76,7 +76,13 @@ extern inline void pcibios_penalize_isa_irq(int irq, int active)
    successful and sets *DMA_ADDRP to the pci side dma address as well,
    else DMA_ADDRP is undefined.  */
 
-extern void *pci_alloc_consistent(struct pci_dev *, size_t, dma_addr_t *);
+extern void *__pci_alloc_consistent(struct pci_dev *, size_t,
+                                   dma_addr_t *, gfp_t);
+static inline void *
+pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma)
+{
+       return __pci_alloc_consistent(dev, size, dma, GFP_ATOMIC);
+}
 
 /* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
    be values that were returned from pci_alloc_consistent.  SIZE must