Commit eccd83e1 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

dma_alloc_coherent: clean it up

This thing was rather stupidly coded.  Rework it all prior to making
changes.

Also, rename local variable `page': kernel readers expect something called
`page' to have type `struct page *'.

Cc: Guennadi Liakhovetski <lg@denx.de>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0bef3c2d
...@@ -109,18 +109,23 @@ EXPORT_SYMBOL(dma_mark_declared_memory_occupied); ...@@ -109,18 +109,23 @@ EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
int dma_alloc_from_coherent(struct device *dev, ssize_t size, int dma_alloc_from_coherent(struct device *dev, ssize_t size,
dma_addr_t *dma_handle, void **ret) dma_addr_t *dma_handle, void **ret)
{ {
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; struct dma_coherent_mem *mem;
int order = get_order(size); int order = get_order(size);
int pageno;
if (mem) { if (!dev)
int page = bitmap_find_free_region(mem->bitmap, mem->size, return 0;
order); mem = dev->dma_mem;
if (page >= 0) { if (!mem)
return 0;
pageno = bitmap_find_free_region(mem->bitmap, mem->size, order);
if (pageno >= 0) {
/* /*
* Memory was found in the per-device arena. * Memory was found in the per-device arena.
*/ */
*dma_handle = mem->device_base + (page << PAGE_SHIFT); *dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
*ret = mem->virt_base + (page << PAGE_SHIFT); *ret = mem->virt_base + (pageno << PAGE_SHIFT);
memset(*ret, 0, size); memset(*ret, 0, size);
} else if (mem->flags & DMA_MEMORY_EXCLUSIVE) { } else if (mem->flags & DMA_MEMORY_EXCLUSIVE) {
/* /*
...@@ -135,8 +140,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size, ...@@ -135,8 +140,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size,
*/ */
return 0; return 0;
} }
} return 1;
return (mem != NULL);
} }
EXPORT_SYMBOL(dma_alloc_from_coherent); EXPORT_SYMBOL(dma_alloc_from_coherent);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment