在 2019年10月15日 19:11, Eric W. Biederman 写道: > lijiang <lijiang@xxxxxxxxxx> writes: > >> 在 2019年10月12日 20:16, Dave Young 写道: >>> Hi Eric, >>> >>> On 10/12/19 at 06:26am, Eric W. Biederman wrote: >>>> Lianbo Jiang <lijiang@xxxxxxxxxx> writes: >>>> >>>>> When the crashkernel kernel command line option is specified, the >>>>> low 1MiB memory will always be reserved, which makes that the memory >>>>> allocated later won't fall into the low 1MiB area, thereby, it's not >>>>> necessary to create a backup region and also no need to copy the first >>>>> 640k content to a backup region. >>>>> >>>>> Currently, the code related to the backup region can be safely removed, >>>>> so lets clean up. >>>>> >>>>> Signed-off-by: Lianbo Jiang <lijiang@xxxxxxxxxx> >>>>> --- >>>> >>>>> diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c >>>>> index eb651fbde92a..cc5774fc84c0 100644 >>>>> --- a/arch/x86/kernel/crash.c >>>>> +++ b/arch/x86/kernel/crash.c >>>>> @@ -173,8 +173,6 @@ void native_machine_crash_shutdown(struct pt_regs *regs) >>>>> >>>>> #ifdef CONFIG_KEXEC_FILE >>>>> >>>>> -static unsigned long crash_zero_bytes; >>>>> - >>>>> static int get_nr_ram_ranges_callback(struct resource *res, void *arg) >>>>> { >>>>> unsigned int *nr_ranges = arg; >>>>> @@ -234,9 +232,15 @@ static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg) >>>>> { >>>>> struct crash_mem *cmem = arg; >>>>> >>>>> - cmem->ranges[cmem->nr_ranges].start = res->start; >>>>> - cmem->ranges[cmem->nr_ranges].end = res->end; >>>>> - cmem->nr_ranges++; >>>>> + if (res->start >= SZ_1M) { >>>>> + cmem->ranges[cmem->nr_ranges].start = res->start; >>>>> + cmem->ranges[cmem->nr_ranges].end = res->end; >>>>> + cmem->nr_ranges++; >>>>> + } else if (res->end > SZ_1M) { >>>>> + cmem->ranges[cmem->nr_ranges].start = SZ_1M; >>>>> + cmem->ranges[cmem->nr_ranges].end = res->end; >>>>> + cmem->nr_ranges++; >>>>> + } >>>> >>>> What is going on with this chunk? I can guess but this needs a clear >>>> comment. >>> >>> Indeed it needs some code comment, this is based on some offline >>> discussion. cat /proc/vmcore will give a warning because ioremap is >>> mapping the system ram. >>> >>> We pass the first 1M to kdump kernel in e820 as system ram so that 2nd >>> kernel can use the low 1M memory because for example the trampoline >>> code. >>> >> Thank you, Eric and Dave. I will add the code comment as below if it would be OK. >> >> @@ -234,9 +232,20 @@ static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg) >> { >> struct crash_mem *cmem = arg; >> >> - cmem->ranges[cmem->nr_ranges].start = res->start; >> - cmem->ranges[cmem->nr_ranges].end = res->end; >> - cmem->nr_ranges++; >> + /* >> + * Currently, pass the low 1MiB range to kdump kernel in e820 >> + * as system ram so that kdump kernel can also use the low 1MiB >> + * memory due to the real mode trampoline code. >> + * And later, the low 1MiB range will be exclued from elf header, >> + * which will avoid remapping the 1MiB system ram when dumping >> + * vmcore. >> + */ >> + if (res->start >= SZ_1M) { >> + cmem->ranges[cmem->nr_ranges].start = res->start; >> + cmem->ranges[cmem->nr_ranges].end = res->end; >> + cmem->nr_ranges++; >> + } else if (res->end > SZ_1M) { >> + cmem->ranges[cmem->nr_ranges].start = SZ_1M; >> + cmem->ranges[cmem->nr_ranges].end = res->end; >> + cmem->nr_ranges++; >> + } >> >> return 0; >> } > > I just read through the appropriate section of crash.c and the way > things are structured doing this work in > prepare_elf64_ram_headers_callback is wrong. > > This can be done in a simpler manner in elf_header_exclude_ranges. > Something like: > Thank you, Eric. It seems that here is a more reasonable place, i will make a test about it and improve it in next post. Lianbo > /* The low 1MiB is always reserved */ > ret = crash_exclude_mem_range(cmem, 0, 1024*1024); > if (ret) > return ret; > > Eric > _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec