s390/kexec: fix crash on resize of reserved memory
Reducing the size of reserved memory for the crash kernel will result in an immediate crash on s390. Reason for that is that we do not create struct pages for memory that is reserved. If that memory is freed any access to struct pages which correspond to this memory will result in invalid memory accesses and a kernel panic. Fix this by properly creating struct pages when the system gets initialized. Change the code also to make use of set_memory_ro() and set_memory_rw() so page tables will be split if required. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:

committed by
Martin Schwidefsky

parent
2d0af22479
commit
4e042af463
@@ -432,6 +432,20 @@ static void __init setup_resources(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
/*
|
||||
* Re-add removed crash kernel memory as reserved memory. This makes
|
||||
* sure it will be mapped with the identity mapping and struct pages
|
||||
* will be created, so it can be resized later on.
|
||||
* However add it later since the crash kernel resource should not be
|
||||
* part of the System RAM resource.
|
||||
*/
|
||||
if (crashk_res.end) {
|
||||
memblock_add(crashk_res.start, resource_size(&crashk_res));
|
||||
memblock_reserve(crashk_res.start, resource_size(&crashk_res));
|
||||
insert_resource(&iomem_resource, &crashk_res);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init setup_memory_end(void)
|
||||
@@ -602,7 +616,6 @@ static void __init reserve_crashkernel(void)
|
||||
diag10_range(PFN_DOWN(crash_base), PFN_DOWN(crash_size));
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_res);
|
||||
memblock_remove(crash_base, crash_size);
|
||||
pr_info("Reserving %lluMB of memory at %lluMB "
|
||||
"for crashkernel (System RAM: %luMB)\n",
|
||||
|
Reference in New Issue
Block a user