[PATCH] Load crash kernel high on x86

Minfei Huang mhuang at redhat.com
Fri Sep 18 06:25:03 PDT 2015


On 09/18/15 at 03:11pm, Petr Tesarik wrote:
> On Fri, 18 Sep 2015 19:39:02 +0800
> Minfei Huang <mhuang at redhat.com> wrote:
> 
> > 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
> 
> True. It should be now called something like get_crashk_res_location().
> I'm going to change that.
> 
> > about get_reserved_mem_limit()? Also it is appreciative, if you can
> > comment it more detail.
> 
> I'm not sure what would be more detail. Regarding the motivation, I
> have already documented why it fails and what are the symptoms of
> failure. Regarding the implementation, the code speaks for itself, IMO.
> 
> Can you explain what kind of detail you're missing, please?

Sorry, What I mean is to comment above the function why we choose the
region crash_reserved_mem[crash_reserved_mem_nr - 1].

Thanks
Minfei



More information about the kexec mailing list