crashkernel=x@y option may fail to reserve the required memory region if KASLR puts kernel into the region. To avoid this uncertainty, making KASLR skip the required region.
Signed-off-by: Pingfan Liu <kernelf...@gmail.com> Cc: Thomas Gleixner <t...@linutronix.de> Cc: Ingo Molnar <mi...@redhat.com> Cc: Borislav Petkov <b...@alien8.de> Cc: "H. Peter Anvin" <h...@zytor.com> Cc: Baoquan He <b...@redhat.com> Cc: Will Deacon <will.dea...@arm.com> Cc: Nicolas Pitre <n...@linaro.org> Cc: Pingfan Liu <kernelf...@gmail.com> Cc: Chao Fan <fanc.f...@cn.fujitsu.com> Cc: "Kirill A. Shutemov" <kirill.shute...@linux.intel.com> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> Cc: linux-kernel@vger.kernel.org --- v1 -> v2: fix some trival format arch/x86/boot/compressed/kaslr.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c index 9ed9709..e185318 100644 --- a/arch/x86/boot/compressed/kaslr.c +++ b/arch/x86/boot/compressed/kaslr.c @@ -109,6 +109,7 @@ enum mem_avoid_index { MEM_AVOID_BOOTPARAMS, MEM_AVOID_MEMMAP_BEGIN, MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1, + MEM_AVOID_CRASHKERNEL, MEM_AVOID_MAX, }; @@ -240,6 +241,25 @@ static void parse_gb_huge_pages(char *param, char *val) } } +/* parse crashkernel=x@y option */ +static void mem_avoid_crashkernel_simple(char *option) +{ + unsigned long long crash_size, crash_base; + char *cur = option; + + crash_size = memparse(option, &cur); + if (option == cur) + return; + + if (*cur == '@') { + option = cur + 1; + crash_base = memparse(option, &cur); + if (option == cur) + return; + mem_avoid[MEM_AVOID_CRASHKERNEL].start = crash_base; + mem_avoid[MEM_AVOID_CRASHKERNEL].size = crash_size; + } +} static void handle_mem_options(void) { @@ -250,7 +270,7 @@ static void handle_mem_options(void) u64 mem_size; if (!strstr(args, "memmap=") && !strstr(args, "mem=") && - !strstr(args, "hugepages")) + !strstr(args, "hugepages") && !strstr(args, "crashkernel=")) return; tmp_cmdline = malloc(len + 1); @@ -286,6 +306,8 @@ static void handle_mem_options(void) goto out; mem_limit = mem_size; + } else if (strstr(param, "crashkernel")) { + mem_avoid_crashkernel_simple(val); } } @@ -414,7 +436,7 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size, /* We don't need to set a mapping for setup_data. */ - /* Mark the memmap regions we need to avoid */ + /* Mark the regions we need to avoid */ handle_mem_options(); #ifdef CONFIG_X86_VERBOSE_BOOTUP -- 2.7.4