From dd361f53c025299e1282104aab64c4edd959e1a7 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Fri, 10 Aug 2007 13:10:27 -0700 Subject: [PATCH] --- yaml --- r: 68023 b: refs/heads/master c: aa24886e379d2b641c5117e178b15ce1d5d366ba h: refs/heads/master i: 68021: b701f9b3cb4c87ca3492ba0c6c469a8308ce854b 68019: ab59d67ce6570aafbf7293889b1344f066b15bbe 68015: 6076df725035dbd885207b51fe98ebd7f6e9041a v: v3 --- [refs] | 2 +- trunk/Documentation/DMA-API.txt | 3 +++ trunk/arch/x86/kernel/pci-dma_32.c | 3 ++- trunk/arch/x86/kernel/pci-dma_64.c | 1 + trunk/lib/swiotlb.c | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 517d409f03d5..1071c7445f35 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fa007d8bebc5d812a445c48664b5bcad81f1351c +refs/heads/master: aa24886e379d2b641c5117e178b15ce1d5d366ba diff --git a/trunk/Documentation/DMA-API.txt b/trunk/Documentation/DMA-API.txt index cc7a8c39fb6f..b939ebb62871 100644 --- a/trunk/Documentation/DMA-API.txt +++ b/trunk/Documentation/DMA-API.txt @@ -68,6 +68,9 @@ size and dma_handle must all be the same as those passed into the consistent allocate. cpu_addr must be the virtual address returned by the consistent allocate. +Note that unlike their sibling allocation calls, these routines +may only be called with IRQs enabled. + Part Ib - Using small dma-coherent buffers ------------------------------------------ diff --git a/trunk/arch/x86/kernel/pci-dma_32.c b/trunk/arch/x86/kernel/pci-dma_32.c index 048f09b62553..0aae2f3847a5 100644 --- a/trunk/arch/x86/kernel/pci-dma_32.c +++ b/trunk/arch/x86/kernel/pci-dma_32.c @@ -63,7 +63,8 @@ void dma_free_coherent(struct device *dev, size_t size, { struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; int order = get_order(size); - + + WARN_ON(irqs_disabled()); /* for portability */ if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) { int page = (vaddr - mem->virt_base) >> PAGE_SHIFT; diff --git a/trunk/arch/x86/kernel/pci-dma_64.c b/trunk/arch/x86/kernel/pci-dma_64.c index 29711445c818..9576a2eb375e 100644 --- a/trunk/arch/x86/kernel/pci-dma_64.c +++ b/trunk/arch/x86/kernel/pci-dma_64.c @@ -167,6 +167,7 @@ EXPORT_SYMBOL(dma_alloc_coherent); void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t bus) { + WARN_ON(irqs_disabled()); /* for portability */ if (dma_ops->unmap_single) dma_ops->unmap_single(dev, bus, size, 0); free_pages((unsigned long)vaddr, get_order(size)); diff --git a/trunk/lib/swiotlb.c b/trunk/lib/swiotlb.c index a7381d55663a..30c1400e749e 100644 --- a/trunk/lib/swiotlb.c +++ b/trunk/lib/swiotlb.c @@ -497,6 +497,7 @@ void swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) { + WARN_ON(irqs_disabled()); if (!(vaddr >= (void *)io_tlb_start && vaddr < (void *)io_tlb_end)) free_pages((unsigned long) vaddr, get_order(size));