Introduce a flag, initrd_not_reserved, that when set will disable the logic of moving the reserved_end to the end of the initrd. This allows the initrd to be placed anywhere in memory and have its memory reclaimed if it is placed in a BOOT_MEM_INIT_RAM region. Signed-off-by: David Daney <ddaney@xxxxxxxxxxxxxxxxxx> --- arch/mips/include/asm/bootinfo.h | 1 + arch/mips/kernel/setup.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/mips/include/asm/bootinfo.h b/arch/mips/include/asm/bootinfo.h index 7a51d87..0a4fd82 100644 --- a/arch/mips/include/asm/bootinfo.h +++ b/arch/mips/include/asm/bootinfo.h @@ -102,6 +102,7 @@ struct boot_mem_map { }; extern struct boot_mem_map boot_mem_map; +extern int initrd_not_reserved; extern void add_memory_region(phys_t start, phys_t size, long type); diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 2d4eb68..8e65480 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -59,6 +59,9 @@ EXPORT_SYMBOL(mips_machtype); struct boot_mem_map boot_mem_map; +/* Set if the initrd memory is BOOT_MEM_INIT_RAM */ +int initrd_not_reserved; + static char __initdata command_line[COMMAND_LINE_SIZE]; char __initdata arcs_cmdline[COMMAND_LINE_SIZE]; @@ -267,8 +270,13 @@ static void __init bootmem_init(void) * not selected. Once that done we can determine the low bound * of usable memory. */ - reserved_end = max(init_initrd(), - (unsigned long) PFN_UP(__pa_symbol(&_end))); + if (initrd_not_reserved) { + init_initrd(); + reserved_end = PFN_UP(__pa_symbol(&_end)); + } else { + reserved_end = max(init_initrd(), + (unsigned long) PFN_UP(__pa_symbol(&_end))); + } /* * max_low_pfn is not a number of pages. The number of pages -- 1.7.2.3