drivers: dma-coherent: Move spinlock in dma_alloc_from_coherent()
We don't need to hold the spinlock while zeroing the allocated memory. In case we handle big buffers this is a severe issue as other CPUs might be spinning half a second or longer. Signed-off-by: Bastian Hecht <bhecht@de.adit-jv.com> Signed-off-by: George G. Davis <george_davis@mentor.com> Signed-off-by: Mark Craske <Mark_Craske@mentor.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9ca5d4fd08
commit
dd01c75f1d
|
@ -165,6 +165,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size,
|
|||
int order = get_order(size);
|
||||
unsigned long flags;
|
||||
int pageno;
|
||||
int dma_memory_map;
|
||||
|
||||
if (!dev)
|
||||
return 0;
|
||||
|
@ -187,11 +188,12 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size,
|
|||
*/
|
||||
*dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
|
||||
*ret = mem->virt_base + (pageno << PAGE_SHIFT);
|
||||
if (mem->flags & DMA_MEMORY_MAP)
|
||||
dma_memory_map = (mem->flags & DMA_MEMORY_MAP);
|
||||
spin_unlock_irqrestore(&mem->spinlock, flags);
|
||||
if (dma_memory_map)
|
||||
memset(*ret, 0, size);
|
||||
else
|
||||
memset_io(*ret, 0, size);
|
||||
spin_unlock_irqrestore(&mem->spinlock, flags);
|
||||
|
||||
return 1;
|
||||
|
||||
|
|
Loading…
Reference in New Issue