On Fri, Jun 27, 2008 at 6:32 AM, Vivek Goyal <vgoyal at redhat.com> wrote: > On Thu, Jun 26, 2008 at 09:54:08PM +0200, Bernhard Walle wrote: >> This patch removes the need of the crashkernel=... at offset parameter to define >> a fixed offset for crashkernel reservation. That feature can be used together >> with a relocatable kernel where the kexec-tools relocate the kernel and >> get the actual offset from /proc/iomem. >> >> The use case is a kernel where the .text+.data+.bss is after 16M physical >> memory (debug kernel with lockdep on x86_64 can cause that) which caused a >> major pain in autoconfiguration in our distribution. >> >> Also, that patch unifies crashdump architectures a bit since IA64 has >> that semantics from the very beginning of the kdump port. >> >> Please provide feedback! >> > > Hi Bernhard, > > This looks like a good idea. That means distributions don't have to > hardcode the crashbase at 16MB and the decision to find a free memory > can be left on kernel. Users will also find it easy that way. > >> >> Signed-off-by: Bernhard Walle <bwalle at suse.de> >> --- >> arch/x86/kernel/setup.c | 70 +++++++++++++++++++++++++++++++++++------------ >> 1 files changed, 52 insertions(+), 18 deletions(-) >> >> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c >> index a81d82c..c30bb7b 100644 >> --- a/arch/x86/kernel/setup.c >> +++ b/arch/x86/kernel/setup.c >> @@ -435,6 +435,34 @@ static inline unsigned long long get_total_mem(void) >> } >> >> #ifdef CONFIG_KEXEC >> + >> +/** >> + * Reserve @size bytes of crashkernel memory at any suitable offset. >> + * >> + * @size: Size of the crashkernel memory to reserve. >> + * Returns the base address on success, and -1ULL on failure. >> + */ >> +unsigned long long find_and_reserve_crashkernel(unsigned long long size) >> +{ >> + const unsigned long long alignment = 16<<20; /* 16M */ >> + unsigned long long start = 0LL; >> + >> + while (1) { >> + int ret; >> + >> + start = find_e820_area(start, ULONG_MAX, size, alignment); should use min_t(u64, 1ULL<<32, max_low_pfn<<PAGE_SHIFT) replace ULONG_MAX YH