diff options
Diffstat (limited to 'arch/s390/kernel/machine_kexec.c')
| -rw-r--r-- | arch/s390/kernel/machine_kexec.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c index b3de2770001..ac2178161ec 100644 --- a/arch/s390/kernel/machine_kexec.c +++ b/arch/s390/kernel/machine_kexec.c @@ -13,6 +13,7 @@  #include <linux/reboot.h>  #include <linux/ftrace.h>  #include <linux/debug_locks.h> +#include <linux/suspend.h>  #include <asm/cio.h>  #include <asm/setup.h>  #include <asm/pgtable.h> @@ -67,6 +68,35 @@ void setup_regs(void)  	memcpy((void *) SAVE_AREA_BASE, (void *) sa, sizeof(struct save_area));  } +/* + * PM notifier callback for kdump + */ +static int machine_kdump_pm_cb(struct notifier_block *nb, unsigned long action, +			       void *ptr) +{ +	switch (action) { +	case PM_SUSPEND_PREPARE: +	case PM_HIBERNATION_PREPARE: +		if (crashk_res.start) +			crash_map_reserved_pages(); +		break; +	case PM_POST_SUSPEND: +	case PM_POST_HIBERNATION: +		if (crashk_res.start) +			crash_unmap_reserved_pages(); +		break; +	default: +		return NOTIFY_DONE; +	} +	return NOTIFY_OK; +} + +static int __init machine_kdump_pm_init(void) +{ +	pm_notifier(machine_kdump_pm_cb, 0); +	return 0; +} +arch_initcall(machine_kdump_pm_init);  #endif  /*  |