|
@@ -43,13 +43,13 @@ static int machine_kdump_pm_cb(struct notifier_block *nb, unsigned long action,
|
|
|
switch (action) {
|
|
|
case PM_SUSPEND_PREPARE:
|
|
|
case PM_HIBERNATION_PREPARE:
|
|
|
- if (crashk_res.start)
|
|
|
- crash_map_reserved_pages();
|
|
|
+ if (kexec_crash_image)
|
|
|
+ arch_kexec_unprotect_crashkres();
|
|
|
break;
|
|
|
case PM_POST_SUSPEND:
|
|
|
case PM_POST_HIBERNATION:
|
|
|
- if (crashk_res.start)
|
|
|
- crash_unmap_reserved_pages();
|
|
|
+ if (kexec_crash_image)
|
|
|
+ arch_kexec_protect_crashkres();
|
|
|
break;
|
|
|
default:
|
|
|
return NOTIFY_DONE;
|
|
@@ -60,6 +60,8 @@ static int machine_kdump_pm_cb(struct notifier_block *nb, unsigned long action,
|
|
|
static int __init machine_kdump_pm_init(void)
|
|
|
{
|
|
|
pm_notifier(machine_kdump_pm_cb, 0);
|
|
|
+ /* Create initial mapping for crashkernel memory */
|
|
|
+ arch_kexec_unprotect_crashkres();
|
|
|
return 0;
|
|
|
}
|
|
|
arch_initcall(machine_kdump_pm_init);
|
|
@@ -146,6 +148,8 @@ static int kdump_csum_valid(struct kimage *image)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_CRASH_DUMP
|
|
|
+
|
|
|
/*
|
|
|
* Map or unmap crashkernel memory
|
|
|
*/
|
|
@@ -167,21 +171,25 @@ static void crash_map_pages(int enable)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Map crashkernel memory
|
|
|
+ * Unmap crashkernel memory
|
|
|
*/
|
|
|
-void crash_map_reserved_pages(void)
|
|
|
+void arch_kexec_protect_crashkres(void)
|
|
|
{
|
|
|
- crash_map_pages(1);
|
|
|
+ if (crashk_res.end)
|
|
|
+ crash_map_pages(0);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Unmap crashkernel memory
|
|
|
+ * Map crashkernel memory
|
|
|
*/
|
|
|
-void crash_unmap_reserved_pages(void)
|
|
|
+void arch_kexec_unprotect_crashkres(void)
|
|
|
{
|
|
|
- crash_map_pages(0);
|
|
|
+ if (crashk_res.end)
|
|
|
+ crash_map_pages(1);
|
|
|
}
|
|
|
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Give back memory to hypervisor before new kdump is loaded
|
|
|
*/
|