----- "Yinghai Lu" <yinghai at kernel.org> wrote: > Please check this one on top of tip or next. This failed for both trees. [root at localhost linux-next]# patch -Np1 <memblock.patch patching file arch/x86/kernel/setup.c Hunk #1 FAILED at 516. 1 out of 1 hunk FAILED -- saving rejects to file arch/x86/kernel/setup.c.rej > > Thanks > > Yinghai > > [PATCH] x86, memblock: Fix crashkernel allocation > > Cai Qian found that crashkernel is broken with x86 memblock changes > 1. crashkernel=128M at 32M always reported that range is used, even first > kernel is small > no one use that range > 2. always get following report when using "kexec -p" > Could not find a free area of memory of a000 bytes... > locate_hole failed > > The root cause is that generic memblock_find_in_range() will try to > get range from top_down. > But crashkernel do need from low and specified range. > > Let's limit the target range with rash_base + crash_size to make sure > that > We get range from bottom. > > Reported-and-Bisected-by: CAI Qian <caiqian at redhat.com> > Signed-off-by: Yinghai Lu <yinghai at kernel.org> > > --- > arch/x86/kernel/setup.c | 19 ++++++++++++++----- > 1 file changed, 14 insertions(+), 5 deletions(-) > > Index: linux-2.6/arch/x86/kernel/setup.c > =================================================================== > --- linux-2.6.orig/arch/x86/kernel/setup.c > +++ linux-2.6/arch/x86/kernel/setup.c > @@ -516,19 +516,28 @@ static void __init reserve_crashkernel(v > > /* 0 means: find the address automatically */ > if (crash_base <= 0) { > + unsigned long long start = 0; > const unsigned long long alignment = 16<<20; /* 16M */ > > - crash_base = memblock_find_in_range(alignment, ULONG_MAX, > crash_size, > - alignment); > - if (crash_base == MEMBLOCK_ERROR) { > + crash_base = alignment; > + while (crash_base < 0xffffffff) { > + start = memblock_find_in_range(crash_base, > + crash_base + crash_size, crash_size, alignment); > + > + if (start == crash_base) > + break; > + > + crash_base += alignment; > + } > + if (start != crash_base) { > pr_info("crashkernel reservation failed - No suitable area > found.\n"); > return; > } > } else { > unsigned long long start; > > - start = memblock_find_in_range(crash_base, ULONG_MAX, crash_size, > - 1<<20); > + start = memblock_find_in_range(crash_base, > + crash_base + crash_size, crash_size, 1<<20); > if (start != crash_base) { > pr_info("crashkernel reservation failed - memory is in use.\n"); > return; > > _______________________________________________ > kexec mailing list > kexec at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec