[IA64] Merge overlapping reserved regions at boot
authorPetr Tesarik <ptesarik@suse.cz>
Tue, 29 Nov 2011 14:01:51 +0000 (15:01 +0100)
committerTony Luck <tony.luck@intel.com>
Fri, 9 Dec 2011 23:06:42 +0000 (15:06 -0800)
commit76d71ebddf23e8195dd5f7889cb2844530689907
tree28521f44fbda9fbda89b8ab64641447682f6d954
parent5611cc4572e889b62a7b4c72a413536bf6a9c416
[IA64] Merge overlapping reserved regions at boot

While working on the upcoming SLES11 SP2, I ran into an issue with booting the
panic kernel on a kernel crash. In the first iteration I found out that the
initial register backing store gets overwritten with zeroes, causing a kernel
crash shortly afterwards.

Further investigation revealed that rsvd_region[] contains overlapping
entries: find_memmap_space() returns a pointer which lies between KERNEL_START
and _end. This is correct with the EFI memmap as patched by the kexec
purgatory code. That code removes vmlinux LOAD segments from the usable map,
but there is a pretty large hole between the gate section and the per-cpu
section.

This happens because reserve_memory() blindly marks [KERNEL_START, __end]
as reserved, even though there is a free block in the middle in the kexec
case because it noticed a large gap between sections and modified the
efi_memory_map to account for this.

Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/kernel/setup.c