Commit c143d43aa3149b83e4b40624a27aa2b18638afec

Authored by Ivan Kokshaysky
Committed by Linus Torvalds
1 parent 39d4c922b5

alpha: fix ALSA DMA mmap crash

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>

Showing 3 changed files with 13 additions and 5 deletions Side-by-side Diff

arch/alpha/kernel/pci_iommu.c
... ... @@ -424,12 +424,14 @@
424 424 else DMA_ADDRP is undefined. */
425 425  
426 426 void *
427   -pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
  427 +__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
  428 + dma_addr_t *dma_addrp, gfp_t gfp)
428 429 {
429 430 void *cpu_addr;
430 431 long order = get_order(size);
431   - gfp_t gfp = GFP_ATOMIC;
432 432  
  433 + gfp &= ~GFP_DMA;
  434 +
433 435 try_again:
434 436 cpu_addr = (void *)__get_free_pages(gfp, order);
435 437 if (! cpu_addr) {
... ... @@ -458,7 +460,7 @@
458 460  
459 461 return cpu_addr;
460 462 }
461   -EXPORT_SYMBOL(pci_alloc_consistent);
  463 +EXPORT_SYMBOL(__pci_alloc_consistent);
462 464  
463 465 /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must
464 466 be values that were returned from pci_alloc_consistent. SIZE must
include/asm-alpha/dma-mapping.h
... ... @@ -11,7 +11,7 @@
11 11 #define dma_unmap_single(dev, addr, size, dir) \
12 12 pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir)
13 13 #define dma_alloc_coherent(dev, size, addr, gfp) \
14   - pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr)
  14 + __pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr, gfp)
15 15 #define dma_free_coherent(dev, size, va, addr) \
16 16 pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr)
17 17 #define dma_map_page(dev, page, off, size, dir) \
include/asm-alpha/pci.h
... ... @@ -76,7 +76,13 @@
76 76 successful and sets *DMA_ADDRP to the pci side dma address as well,
77 77 else DMA_ADDRP is undefined. */
78 78  
79   -extern void *pci_alloc_consistent(struct pci_dev *, size_t, dma_addr_t *);
  79 +extern void *__pci_alloc_consistent(struct pci_dev *, size_t,
  80 + dma_addr_t *, gfp_t);
  81 +static inline void *
  82 +pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma)
  83 +{
  84 + return __pci_alloc_consistent(dev, size, dma, GFP_ATOMIC);
  85 +}
80 86  
81 87 /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must
82 88 be values that were returned from pci_alloc_consistent. SIZE must