diff options
Diffstat (limited to 'kexec')
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 21 | ||||
-rw-r--r-- | kexec/arch/i386/kexec-x86-common.c | 4 | ||||
-rw-r--r-- | kexec/kexec.h | 2 |
3 files changed, 10 insertions, 17 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index 63959b7..d4969c5 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -1026,24 +1026,17 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, return 0; } -int get_max_crash_kernel_limit(uint64_t *start, uint64_t *end) +/* On x86, the kernel may make a low reservation in addition to the + * normal reservation. However, the kernel refuses to load the panic + * kernel to low memory, so always choose the highest range. + */ +int get_crash_kernel_load_range(uint64_t *start, uint64_t *end) { - int i, idx = -1; - unsigned long sz_max = 0, sz; - if (!crash_reserved_mem_nr) return -1; - for (i = crash_reserved_mem_nr - 1; i >= 0; i--) { - sz = crash_reserved_mem[i].end - crash_reserved_mem[i].start +1; - if (sz <= sz_max) - continue; - sz_max = sz; - idx = i; - } - - *start = crash_reserved_mem[idx].start; - *end = crash_reserved_mem[idx].end; + *start = crash_reserved_mem[crash_reserved_mem_nr - 1].start; + *end = crash_reserved_mem[crash_reserved_mem_nr - 1].end; return 0; } diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c index 041c8ec..484d712 100644 --- a/kexec/arch/i386/kexec-x86-common.c +++ b/kexec/arch/i386/kexec-x86-common.c @@ -371,9 +371,9 @@ int get_memory_ranges(struct memory_range **range, int *ranges, !(kexec_flags & KEXEC_PRESERVE_CONTEXT)) { uint64_t start, end; - ret = get_max_crash_kernel_limit(&start, &end); + ret = get_crash_kernel_load_range(&start, &end); if (ret != 0) { - fprintf(stderr, "get_max_crash_kernel_limit failed.\n"); + fprintf(stderr, "get_crash_kernel_load_range failed.\n"); return -1; } diff --git a/kexec/kexec.h b/kexec/kexec.h index 0fa977f..7c97b25 100644 --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -288,7 +288,7 @@ int arch_process_options(int argc, char **argv); int arch_compat_trampoline(struct kexec_info *info); void arch_update_purgatory(struct kexec_info *info); int is_crashkernel_mem_reserved(void); -int get_max_crash_kernel_limit(uint64_t *start, uint64_t *end); +int get_crash_kernel_load_range(uint64_t *start, uint64_t *end); char *get_command_line(void); int kexec_iomem_for_each_line(char *match, |