Commit 67b5c3ee authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

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: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 118131a2
...@@ -527,6 +527,8 @@ static void __init setup_memory_end(void) ...@@ -527,6 +527,8 @@ static void __init setup_memory_end(void)
unsigned long align; unsigned long align;
chunk = &memory_chunk[i]; chunk = &memory_chunk[i];
if (chunk->type == CHUNK_OLDMEM)
continue;
align = 1UL << (MAX_ORDER + PAGE_SHIFT - 1); align = 1UL << (MAX_ORDER + PAGE_SHIFT - 1);
start = (chunk->addr + align - 1) & ~(align - 1); start = (chunk->addr + align - 1) & ~(align - 1);
end = (chunk->addr + chunk->size) & ~(align - 1); end = (chunk->addr + chunk->size) & ~(align - 1);
...@@ -577,6 +579,8 @@ static void __init setup_memory_end(void) ...@@ -577,6 +579,8 @@ static void __init setup_memory_end(void)
for (i = 0; i < MEMORY_CHUNKS; i++) { for (i = 0; i < MEMORY_CHUNKS; i++) {
struct mem_chunk *chunk = &memory_chunk[i]; struct mem_chunk *chunk = &memory_chunk[i];
if (chunk->type == CHUNK_OLDMEM)
continue;
if (chunk->addr >= memory_end) { if (chunk->addr >= memory_end) {
memset(chunk, 0, sizeof(*chunk)); memset(chunk, 0, sizeof(*chunk));
continue; continue;
...@@ -1065,9 +1069,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -1065,9 +1069,9 @@ void __init setup_arch(char **cmdline_p)
os_info_init(); os_info_init();
setup_ipl(); setup_ipl();
reserve_oldmem();
setup_memory_end(); setup_memory_end();
setup_addressing_mode(); setup_addressing_mode();
reserve_oldmem();
reserve_crashkernel(); reserve_crashkernel();
setup_memory(); setup_memory();
setup_resources(); setup_resources();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment