Messages in this thread | | | From | Pingfan Liu <> | Date | Fri, 22 Mar 2019 15:47:31 +0800 | Subject | Re: [PATCHv2] x86/boot/KASLR: skip the specified crashkernel reserved region |
| |
On Thu, Mar 21, 2019 at 2:38 PM Chao Fan <fanc.fnst@cn.fujitsu.com> wrote: > > On Wed, Mar 13, 2019 at 12:19:31PM +0800, Pingfan Liu wrote: > > I tested it in Qemu test with 12G memory, and set crashkernel=6G@6G. > Without this PATCH, it successed to reserve memory just 4 times(total > 10 times). > With this PATCH, it successed to reserve memory 15 times(total 15 > times). > > So I think if you post new version, you can add: > > Tested-by: Chao Fan <fanc.fnst@cn.fujitsu.com> > Appreciate for your testing. I had done some test on a real machine with a private patch to narrow down the KASLR range. I think your test method is more simple and I will add the tested-by you.
Regards, Pingfan
> Thanks, > Chao Fan > > >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 <kernelfans@gmail.com> > >Cc: Thomas Gleixner <tglx@linutronix.de> > >Cc: Ingo Molnar <mingo@redhat.com> > >Cc: Borislav Petkov <bp@alien8.de> > >Cc: "H. Peter Anvin" <hpa@zytor.com> > >Cc: Baoquan He <bhe@redhat.com> > >Cc: Will Deacon <will.deacon@arm.com> > >Cc: Nicolas Pitre <nico@linaro.org> > >Cc: Pingfan Liu <kernelfans@gmail.com> > >Cc: Chao Fan <fanc.fnst@cn.fujitsu.com> > >Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> > >Cc: Ard Biesheuvel <ard.biesheuvel@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 > > > > > > > >
| |