diff options
Diffstat (limited to 'kexec/arch')
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 21 | ||||
-rw-r--r-- | kexec/arch/i386/kexec-x86-common.c | 4 |
2 files changed, 9 insertions, 16 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; } |