These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / mm / nobootmem.c
index 90b5046..e57cf24 100644 (file)
@@ -37,11 +37,20 @@ static void * __init __alloc_memory_core_early(int nid, u64 size, u64 align,
 {
        void *ptr;
        u64 addr;
+       ulong flags = choose_memblock_flags();
 
        if (limit > memblock.current_limit)
                limit = memblock.current_limit;
 
-       addr = memblock_find_in_range_node(size, align, goal, limit, nid);
+again:
+       addr = memblock_find_in_range_node(size, align, goal, limit, nid,
+                                          flags);
+       if (!addr && (flags & MEMBLOCK_MIRROR)) {
+               flags &= ~MEMBLOCK_MIRROR;
+               pr_warn("Could not allocate %pap bytes of mirrored memory\n",
+                       &size);
+               goto again;
+       }
        if (!addr)
                return NULL;
 
@@ -77,7 +86,7 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size)
        end = PFN_DOWN(addr + size);
 
        for (; cursor < end; cursor++) {
-               __free_pages_bootmem(pfn_to_page(cursor), 0);
+               __free_pages_bootmem(pfn_to_page(cursor), cursor, 0);
                totalram_pages++;
        }
 }
@@ -92,7 +101,7 @@ static void __init __free_pages_memory(unsigned long start, unsigned long end)
                while (start + (1UL << order) > end)
                        order--;
 
-               __free_pages_bootmem(pfn_to_page(start), order);
+               __free_pages_bootmem(pfn_to_page(start), start, order);
 
                start += (1UL << order);
        }
@@ -121,7 +130,11 @@ static unsigned long __init free_low_memory_core_early(void)
 
        memblock_clear_hotplug(0, -1);
 
-       for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL)
+       for_each_reserved_mem_region(i, &start, &end)
+               reserve_bootmem_region(start, end);
+
+       for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end,
+                               NULL)
                count += __free_memory_core(start, end);
 
 #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK