|
@@ -333,7 +333,7 @@ static void __init finalize_initrd(void)
|
|
|
|
|
|
maybe_bswap_initrd();
|
|
|
|
|
|
- reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT);
|
|
|
+ memblock_reserve(__pa(initrd_start), size);
|
|
|
initrd_below_start_ok = 1;
|
|
|
|
|
|
pr_info("Initial ramdisk at: 0x%lx (%lu bytes)\n",
|
|
@@ -370,20 +370,10 @@ static void __init bootmem_init(void)
|
|
|
|
|
|
#else /* !CONFIG_SGI_IP27 */
|
|
|
|
|
|
-static unsigned long __init bootmap_bytes(unsigned long pages)
|
|
|
-{
|
|
|
- unsigned long bytes = DIV_ROUND_UP(pages, 8);
|
|
|
-
|
|
|
- return ALIGN(bytes, sizeof(long));
|
|
|
-}
|
|
|
-
|
|
|
static void __init bootmem_init(void)
|
|
|
{
|
|
|
unsigned long reserved_end;
|
|
|
- unsigned long mapstart = ~0UL;
|
|
|
- unsigned long bootmap_size;
|
|
|
phys_addr_t ramstart = PHYS_ADDR_MAX;
|
|
|
- bool bootmap_valid = false;
|
|
|
int i;
|
|
|
|
|
|
/*
|
|
@@ -395,6 +385,8 @@ static void __init bootmem_init(void)
|
|
|
init_initrd();
|
|
|
reserved_end = (unsigned long) PFN_UP(__pa_symbol(&_end));
|
|
|
|
|
|
+ memblock_reserve(PHYS_OFFSET, reserved_end << PAGE_SHIFT);
|
|
|
+
|
|
|
/*
|
|
|
* max_low_pfn is not a number of pages. The number of pages
|
|
|
* of the system is given by 'max_low_pfn - min_low_pfn'.
|
|
@@ -442,9 +434,6 @@ static void __init bootmem_init(void)
|
|
|
if (initrd_end && end <= (unsigned long)PFN_UP(__pa(initrd_end)))
|
|
|
continue;
|
|
|
#endif
|
|
|
- if (start >= mapstart)
|
|
|
- continue;
|
|
|
- mapstart = max(reserved_end, start);
|
|
|
}
|
|
|
|
|
|
if (min_low_pfn >= max_low_pfn)
|
|
@@ -456,9 +445,11 @@ static void __init bootmem_init(void)
|
|
|
/*
|
|
|
* Reserve any memory between the start of RAM and PHYS_OFFSET
|
|
|
*/
|
|
|
- if (ramstart > PHYS_OFFSET)
|
|
|
+ if (ramstart > PHYS_OFFSET) {
|
|
|
add_memory_region(PHYS_OFFSET, ramstart - PHYS_OFFSET,
|
|
|
BOOT_MEM_RESERVED);
|
|
|
+ memblock_reserve(PHYS_OFFSET, ramstart - PHYS_OFFSET);
|
|
|
+ }
|
|
|
|
|
|
if (min_low_pfn > ARCH_PFN_OFFSET) {
|
|
|
pr_info("Wasting %lu bytes for tracking %lu unused pages\n",
|
|
@@ -483,52 +474,6 @@ static void __init bootmem_init(void)
|
|
|
max_low_pfn = PFN_DOWN(HIGHMEM_START);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_BLK_DEV_INITRD
|
|
|
- /*
|
|
|
- * mapstart should be after initrd_end
|
|
|
- */
|
|
|
- if (initrd_end)
|
|
|
- mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end)));
|
|
|
-#endif
|
|
|
-
|
|
|
- /*
|
|
|
- * check that mapstart doesn't overlap with any of
|
|
|
- * memory regions that have been reserved through eg. DTB
|
|
|
- */
|
|
|
- bootmap_size = bootmap_bytes(max_low_pfn - min_low_pfn);
|
|
|
-
|
|
|
- bootmap_valid = memory_region_available(PFN_PHYS(mapstart),
|
|
|
- bootmap_size);
|
|
|
- for (i = 0; i < boot_mem_map.nr_map && !bootmap_valid; i++) {
|
|
|
- unsigned long mapstart_addr;
|
|
|
-
|
|
|
- switch (boot_mem_map.map[i].type) {
|
|
|
- case BOOT_MEM_RESERVED:
|
|
|
- mapstart_addr = PFN_ALIGN(boot_mem_map.map[i].addr +
|
|
|
- boot_mem_map.map[i].size);
|
|
|
- if (PHYS_PFN(mapstart_addr) < mapstart)
|
|
|
- break;
|
|
|
-
|
|
|
- bootmap_valid = memory_region_available(mapstart_addr,
|
|
|
- bootmap_size);
|
|
|
- if (bootmap_valid)
|
|
|
- mapstart = PHYS_PFN(mapstart_addr);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!bootmap_valid)
|
|
|
- panic("No memory area to place a bootmap bitmap");
|
|
|
-
|
|
|
- /*
|
|
|
- * Initialize the boot-time allocator with low memory only.
|
|
|
- */
|
|
|
- if (bootmap_size != init_bootmem_node(NODE_DATA(0), mapstart,
|
|
|
- min_low_pfn, max_low_pfn))
|
|
|
- panic("Unexpected memory size required for bootmap");
|
|
|
-
|
|
|
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
|
|
unsigned long start, end;
|
|
|
|
|
@@ -577,9 +522,9 @@ static void __init bootmem_init(void)
|
|
|
default:
|
|
|
/* Not usable memory */
|
|
|
if (start > min_low_pfn && end < max_low_pfn)
|
|
|
- reserve_bootmem(boot_mem_map.map[i].addr,
|
|
|
- boot_mem_map.map[i].size,
|
|
|
- BOOTMEM_DEFAULT);
|
|
|
+ memblock_reserve(boot_mem_map.map[i].addr,
|
|
|
+ boot_mem_map.map[i].size);
|
|
|
+
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -602,15 +547,9 @@ static void __init bootmem_init(void)
|
|
|
size = end - start;
|
|
|
|
|
|
/* Register lowmem ranges */
|
|
|
- free_bootmem(PFN_PHYS(start), size << PAGE_SHIFT);
|
|
|
memory_present(0, start, end);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * Reserve the bootmap memory.
|
|
|
- */
|
|
|
- reserve_bootmem(PFN_PHYS(mapstart), bootmap_size, BOOTMEM_DEFAULT);
|
|
|
-
|
|
|
#ifdef CONFIG_RELOCATABLE
|
|
|
/*
|
|
|
* The kernel reserves all memory below its _end symbol as bootmem,
|
|
@@ -907,21 +846,29 @@ static void __init arch_mem_init(char **cmdline_p)
|
|
|
early_init_fdt_scan_reserved_mem();
|
|
|
|
|
|
bootmem_init();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Prevent memblock from allocating high memory.
|
|
|
+ * This cannot be done before max_low_pfn is detected, so up
|
|
|
+ * to this point is possible to only reserve physical memory
|
|
|
+ * with memblock_reserve; memblock_virt_alloc* can be used
|
|
|
+ * only after this point
|
|
|
+ */
|
|
|
+ memblock_set_current_limit(PFN_PHYS(max_low_pfn));
|
|
|
+
|
|
|
#ifdef CONFIG_PROC_VMCORE
|
|
|
if (setup_elfcorehdr && setup_elfcorehdr_size) {
|
|
|
printk(KERN_INFO "kdump reserved memory at %lx-%lx\n",
|
|
|
setup_elfcorehdr, setup_elfcorehdr_size);
|
|
|
- reserve_bootmem(setup_elfcorehdr, setup_elfcorehdr_size,
|
|
|
- BOOTMEM_DEFAULT);
|
|
|
+ memblock_reserve(setup_elfcorehdr, setup_elfcorehdr_size);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
mips_parse_crashkernel();
|
|
|
#ifdef CONFIG_KEXEC
|
|
|
if (crashk_res.start != crashk_res.end)
|
|
|
- reserve_bootmem(crashk_res.start,
|
|
|
- crashk_res.end - crashk_res.start + 1,
|
|
|
- BOOTMEM_DEFAULT);
|
|
|
+ memblock_reserve(crashk_res.start,
|
|
|
+ crashk_res.end - crashk_res.start + 1);
|
|
|
#endif
|
|
|
device_tree_init();
|
|
|
sparse_init();
|
|
@@ -931,7 +878,7 @@ static void __init arch_mem_init(char **cmdline_p)
|
|
|
/* Tell bootmem about cma reserved memblock section */
|
|
|
for_each_memblock(reserved, reg)
|
|
|
if (reg->size != 0)
|
|
|
- reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
|
|
|
+ memblock_reserve(reg->base, reg->size);
|
|
|
|
|
|
reserve_bootmem_region(__pa_symbol(&__nosave_begin),
|
|
|
__pa_symbol(&__nosave_end)); /* Reserve for hibernation */
|