aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/setup.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2016-05-31 03:14:00 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-06-13 09:58:19 -0400
commit4e042af463f806b6ef0e44048eba0964f0a5694e (patch)
tree4bd3cfb12176ee1697ee2c376164eaf28b8d23bf /arch/s390/kernel/setup.c
parent2d0af2247906cf17cd641cdb16444a8f291cd4f4 (diff)
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>
Diffstat (limited to 'arch/s390/kernel/setup.c')
-rw-r--r--arch/s390/kernel/setup.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index d4e0742b197b..9b4bb9d9275f 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -432,6 +432,20 @@ static void __init setup_resources(void)
432 } 432 }
433 } 433 }
434 } 434 }
435#ifdef CONFIG_CRASH_DUMP
436 /*
437 * Re-add removed crash kernel memory as reserved memory. This makes
438 * sure it will be mapped with the identity mapping and struct pages
439 * will be created, so it can be resized later on.
440 * However add it later since the crash kernel resource should not be
441 * part of the System RAM resource.
442 */
443 if (crashk_res.end) {
444 memblock_add(crashk_res.start, resource_size(&crashk_res));
445 memblock_reserve(crashk_res.start, resource_size(&crashk_res));
446 insert_resource(&iomem_resource, &crashk_res);
447 }
448#endif
435} 449}
436 450
437static void __init setup_memory_end(void) 451static void __init setup_memory_end(void)
@@ -602,7 +616,6 @@ static void __init reserve_crashkernel(void)
602 diag10_range(PFN_DOWN(crash_base), PFN_DOWN(crash_size)); 616 diag10_range(PFN_DOWN(crash_base), PFN_DOWN(crash_size));
603 crashk_res.start = crash_base; 617 crashk_res.start = crash_base;
604 crashk_res.end = crash_base + crash_size - 1; 618 crashk_res.end = crash_base + crash_size - 1;
605 insert_resource(&iomem_resource, &crashk_res);
606 memblock_remove(crash_base, crash_size); 619 memblock_remove(crash_base, crash_size);
607 pr_info("Reserving %lluMB of memory at %lluMB " 620 pr_info("Reserving %lluMB of memory at %lluMB "
608 "for crashkernel (System RAM: %luMB)\n", 621 "for crashkernel (System RAM: %luMB)\n",