diff options
author | Hiroshi Doyu <hdoyu@nvidia.com> | 2012-08-28 01:13:02 -0400 |
---|---|---|
committer | Marek Szyprowski <m.szyprowski@samsung.com> | 2012-08-28 15:01:06 -0400 |
commit | 21d0a75951ccf71f671eb24b61a8ad2b497be4b4 (patch) | |
tree | bbda40740cc2c6da52dadb3482156731a09a1a02 /arch/arm | |
parent | 6b3fe47264262fa082897ebe8ae01041eae65e14 (diff) |
ARM: dma-mapping: Refactor out to introduce __in_atomic_pool
Check the given range("start", "size") is included in "atomic_pool" or not.
Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 9a21284a6ac4..882eacc6ebc1 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -482,20 +482,34 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) | |||
482 | return ptr; | 482 | return ptr; |
483 | } | 483 | } |
484 | 484 | ||
485 | static bool __in_atomic_pool(void *start, size_t size) | ||
486 | { | ||
487 | struct dma_pool *pool = &atomic_pool; | ||
488 | void *end = start + size; | ||
489 | void *pool_start = pool->vaddr; | ||
490 | void *pool_end = pool->vaddr + pool->size; | ||
491 | |||
492 | if (start < pool_start || start > pool_end) | ||
493 | return false; | ||
494 | |||
495 | if (end <= pool_end) | ||
496 | return true; | ||
497 | |||
498 | WARN(1, "Wrong coherent size(%p-%p) from atomic pool(%p-%p)\n", | ||
499 | start, end - 1, pool_start, pool_end - 1); | ||
500 | |||
501 | return false; | ||
502 | } | ||
503 | |||
485 | static int __free_from_pool(void *start, size_t size) | 504 | static int __free_from_pool(void *start, size_t size) |
486 | { | 505 | { |
487 | struct dma_pool *pool = &atomic_pool; | 506 | struct dma_pool *pool = &atomic_pool; |
488 | unsigned long pageno, count; | 507 | unsigned long pageno, count; |
489 | unsigned long flags; | 508 | unsigned long flags; |
490 | 509 | ||
491 | if (start < pool->vaddr || start > pool->vaddr + pool->size) | 510 | if (!__in_atomic_pool(start, size)) |
492 | return 0; | 511 | return 0; |
493 | 512 | ||
494 | if (start + size > pool->vaddr + pool->size) { | ||
495 | WARN(1, "freeing wrong coherent size from pool\n"); | ||
496 | return 0; | ||
497 | } | ||
498 | |||
499 | pageno = (start - pool->vaddr) >> PAGE_SHIFT; | 513 | pageno = (start - pool->vaddr) >> PAGE_SHIFT; |
500 | count = size >> PAGE_SHIFT; | 514 | count = size >> PAGE_SHIFT; |
501 | 515 | ||