mm/cma: provide option to opt out from exposing pages on activation failure
[linux-2.6-block.git] / mm / cma.c
index 5a2cd58516589132ae79c5b650823f429bcaf7ae..eaa4b5c920a20b53cf819a541ebdd652e0a14987 100644 (file)
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -131,8 +131,10 @@ not_in_zone:
        bitmap_free(cma->bitmap);
 out_error:
        /* Expose all pages to the buddy, they are useless for CMA. */
-       for (pfn = base_pfn; pfn < base_pfn + cma->count; pfn++)
-               free_reserved_page(pfn_to_page(pfn));
+       if (!cma->reserve_pages_on_error) {
+               for (pfn = base_pfn; pfn < base_pfn + cma->count; pfn++)
+                       free_reserved_page(pfn_to_page(pfn));
+       }
        totalcma_pages -= cma->count;
        cma->count = 0;
        pr_err("CMA area %s could not be activated\n", cma->name);
@@ -150,6 +152,11 @@ static int __init cma_init_reserved_areas(void)
 }
 core_initcall(cma_init_reserved_areas);
 
+void __init cma_reserve_pages_on_error(struct cma *cma)
+{
+       cma->reserve_pages_on_error = true;
+}
+
 /**
  * cma_init_reserved_mem() - create custom contiguous area from reserved memory
  * @base: Base address of the reserved area