On 09/18/15 at 08:03am, Petr Tesarik wrote: > Hello, > > There may be more than one crash kernel regions on x86. However, the kexec > syscall checks that target address is within crashk_res boundaries. 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. > > Currently, kexec-tools picks the largest region. If high reservation is > smaller than low, kexec(2) returns -EADDRNOTAVAIL, and kexec prints out > this error message: > > kexec_load failed: Cannot assign requested address > > Signed-off-by: Petr Tesarik <ptesarik at suse.com> > --- > kexec/arch/i386/crashdump-x86.c | 12 ++---------- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c > index 63959b7..2710a9e 100644 > --- a/kexec/arch/i386/crashdump-x86.c > +++ b/kexec/arch/i386/crashdump-x86.c > @@ -1034,16 +1034,8 @@ int get_max_crash_kernel_limit(uint64_t *start, uint64_t *end) > 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; It is not a proper function name for what it does in your patch. How about get_reserved_mem_limit()? Also it is appreciative, if you can comment it more detail. Thanks Minfei