Commit c143d43aa3149b83e4b40624a27aa2b18638afec
Committed by
Linus Torvalds
1 parent
39d4c922b5
Exists in
master
and in
39 other branches
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 |