[RFC PATCH] arm: dma-mapping: fallback allocation for cma failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for your advise, Michal Nazarewicz.

Having discuss with Joonsoo, I'm adding fallback allocation after __alloc_from_contiguous().
The fallback allocation works if CMA kernel options is turned on but CMA size is zero.

--------------------- 8< ------------------------

>From 05e389683ddd07027e8acb61c25f3284f762300e Mon Sep 17 00:00:00 2001
From: Gioh Kim <gioh.kim@xxxxxxx>
Date: Tue, 20 May 2014 14:16:20 +0900
Subject: [PATCH] arm: dma-mapping: fallback allocation for cma failure

If CMA is turned on and CMA size is set to zero, kernel should
behave as if CMA was not enabled at compile time.
Fallback allocation is added for CMA allocation failure.

Signed-off-by: Gioh Kim <gioh.kim@xxxxxxx>
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx>
---
 arch/arm/mm/dma-mapping.c |   11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 18e98df..2a6c883 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -379,7 +379,7 @@ static int __init atomic_pool_init(void)
        unsigned long *bitmap;
        struct page *page;
        struct page **pages;
-       void *ptr;
+       void *ptr = NULL;
        int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long);

        bitmap = kzalloc(bitmap_size, GFP_KERNEL);
@@ -393,9 +393,10 @@ static int __init atomic_pool_init(void)
        if (IS_ENABLED(CONFIG_DMA_CMA))
                ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page,
                                              atomic_pool_init);
-       else
+       if (!ptr)
                ptr = __alloc_remap_buffer(NULL, pool->size, gfp, prot, &page,
                                           atomic_pool_init);
+
        if (ptr) {
                int i;

@@ -703,8 +704,12 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
                addr = __alloc_from_pool(size, &page);
        else if (!IS_ENABLED(CONFIG_DMA_CMA))
                addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);
-       else
+       else {
                addr = __alloc_from_contiguous(dev, size, prot, &page, caller);
+               if (!addr)
+                       addr = __alloc_remap_buffer(dev, size, gfp, prot,
+                                                   &page, caller);
+       }

        if (addr)
                *handle = pfn_to_dma(dev, page_to_pfn(page));
--
1.7.9.5

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]