Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+29 −25
Original line number Diff line number Diff line
@@ -109,18 +109,23 @@ EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
int dma_alloc_from_coherent(struct device *dev, ssize_t size,
				       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 pageno;

	if (mem) {
		int page = bitmap_find_free_region(mem->bitmap, mem->size,
						     order);
		if (page >= 0) {
	if (!dev)
		return 0;
	mem = dev->dma_mem;
	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.
		 */
			*dma_handle = mem->device_base + (page << PAGE_SHIFT);
			*ret = mem->virt_base + (page << PAGE_SHIFT);
		*dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
		*ret = mem->virt_base + (pageno << PAGE_SHIFT);
		memset(*ret, 0, size);
	} else if (mem->flags & DMA_MEMORY_EXCLUSIVE) {
		/*
@@ -135,8 +140,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size,
		 */
		 return 0;
	}
	}
	return (mem != NULL);
	return 1;
}
EXPORT_SYMBOL(dma_alloc_from_coherent);