Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Ports
kexec-tools
kexec-tools-load-crash-kernel-high.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File kexec-tools-load-crash-kernel-high.patch of Package kexec-tools
From: Petr Tesarik <ptesarik@suse.com> Date: Thu Sep 24 08:48:52 2015 +0200 Subject: Load crash kernel high on x86 References: bsc#946365 Patch-mainline: post-v2.0.10 Git-commit: 4fbf781eb0383a491906d3851b066657b29c2816 There may be more than one crash kernel regions on x86. Currently, kexec-tools picks the largest one. If high reservation is smaller than low, it will try to load panic kernel low. However, the kexec syscall checks that target address is within crashk_res boundaries, so attempts to load crash kernel low result in -EADDRNOTAVAIL, and kexec prints out this error message: kexec_load failed: Cannot assign requested address Looking at the logic in arch/x86/kernel/setup.c, there are only two possible layouts: 1. crashk_res is below 4G, and there is only one region, 2. crashk_res is above 4G, and crashk_low_res is below 4G In either case, kexec-tools must pick the highest region. Changelog: * v3: rename function to get_crash_kernel_load_range * v2: remove unnecessary local variables Signed-off-by: Petr Tesarik <ptesarik@suse.com> Signed-off-by: Simon Horman <horms@verge.net.au> --- kexec/arch/i386/crashdump-x86.c | 21 +++++++-------------- kexec/arch/i386/kexec-x86-common.c | 4 ++-- kexec/kexec.h | 2 +- 3 files changed, 10 insertions(+), 17 deletions(-) --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -1063,24 +1063,17 @@ int load_crashdump_segments(struct kexec 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; } --- a/kexec/arch/i386/kexec-x86-common.c +++ b/kexec/arch/i386/kexec-x86-common.c @@ -362,9 +362,9 @@ int get_memory_ranges(struct memory_rang !(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; } --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -281,7 +281,7 @@ int arch_process_options(int argc, char 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,
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor