summaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-04-30 09:36:23 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2013-05-02 15:50:25 +0200
commit67b5c3eeb4814bceb9a7e17fecb14ef59d511812 (patch)
tree3981aae6bc83fcda686865c97c4d8b55faefdf7a /arch/s390
parents390: get rid of odd global real_memory_size (diff)
downloadlinux-67b5c3eeb4814bceb9a7e17fecb14ef59d511812.tar.xz
linux-67b5c3eeb4814bceb9a7e17fecb14ef59d511812.zip
s390/kdump,bootmem: fix bootmem allocator bitmap size
When in kdump mode the kernel may access only the first couple of megabytes for execution, the rest contains the dump. However the size of the bitmap used by the bootmem allocator was calculated for the whole amount of memory of the machine. For very large machines this can lead to the situation that the kdump kernel will not come up because not enough memory is available. So fix this and calculate the size of the bitmap only for the piece of memory that the kdump kernel actually uses. Call reserve_oldmem() before setup_memory_end() so that the memory_chunk array already has been updated with respect to oldmem chunks. Afterwards setup_memory_end() will ignore those chunks. Reviewed-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kernel/setup.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index f1e0ba5a5c3a..555f1895972e 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -527,6 +527,8 @@ static void __init setup_memory_end(void)
unsigned long align;
chunk = &memory_chunk[i];
+ if (chunk->type == CHUNK_OLDMEM)
+ continue;
align = 1UL << (MAX_ORDER + PAGE_SHIFT - 1);
start = (chunk->addr + align - 1) & ~(align - 1);
end = (chunk->addr + chunk->size) & ~(align - 1);
@@ -577,6 +579,8 @@ static void __init setup_memory_end(void)
for (i = 0; i < MEMORY_CHUNKS; i++) {
struct mem_chunk *chunk = &memory_chunk[i];
+ if (chunk->type == CHUNK_OLDMEM)
+ continue;
if (chunk->addr >= memory_end) {
memset(chunk, 0, sizeof(*chunk));
continue;
@@ -1065,9 +1069,9 @@ void __init setup_arch(char **cmdline_p)
os_info_init();
setup_ipl();
+ reserve_oldmem();
setup_memory_end();
setup_addressing_mode();
- reserve_oldmem();
reserve_crashkernel();
setup_memory();
setup_resources();