mm: fix is_mem_section_removable() page_order BUG_ON check
[pandora-kernel.git] / mm / memblock.c
index d5d63ac..400dc62 100644 (file)
@@ -99,19 +99,24 @@ long __init_memblock memblock_overlaps_region(struct memblock_type *type, phys_a
  * are top-down.
  */
 
-static phys_addr_t __init memblock_find_region(phys_addr_t start, phys_addr_t end,
+static phys_addr_t __init_memblock memblock_find_region(phys_addr_t start, phys_addr_t end,
                                          phys_addr_t size, phys_addr_t align)
 {
        phys_addr_t base, res_base;
        long j;
 
+       /* In case, huge size is requested */
+       if (end < size)
+               return MEMBLOCK_ERROR;
+
+       base = memblock_align_down((end - size), align);
+
        /* Prevent allocations returning 0 as it's also used to
         * indicate an allocation failure
         */
        if (start == 0)
                start = PAGE_SIZE;
 
-       base = memblock_align_down((end - size), align);
        while (start <= base) {
                j = memblock_overlaps_region(&memblock.reserved, base, size);
                if (j < 0)
@@ -648,7 +653,7 @@ void __init memblock_enforce_memory_limit(phys_addr_t memory_limit)
        }
 }
 
-static int memblock_search(struct memblock_type *type, phys_addr_t addr)
+static int __init_memblock memblock_search(struct memblock_type *type, phys_addr_t addr)
 {
        unsigned int left = 0, right = type->cnt;
 
@@ -747,6 +752,12 @@ void __init memblock_analyze(void)
 
 void __init memblock_init(void)
 {
+       static int init_done __initdata = 0;
+
+       if (init_done)
+               return;
+       init_done = 1;
+
        /* Hookup the initial arrays */
        memblock.memory.regions = memblock_memory_init_regions;
        memblock.memory.max             = INIT_MEMBLOCK_REGIONS;