Skip to content

Commit e7fd8b6

Browse files
khfengrafaeljw
authored andcommitted
kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode
Add SYS_OFF_MODE_RESTART_PREPARE callbacks to be invoked before a system restart. Suggested-by: Dmitry Osipenko <[email protected]> Reviewed-by: Dmitry Osipenko <[email protected]> Signed-off-by: Kai-Heng Feng <[email protected]> [ rjw: Changelog edits ] Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent f76349c commit e7fd8b6

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

include/linux/reboot.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ enum sys_off_mode {
105105
*/
106106
SYS_OFF_MODE_POWER_OFF,
107107

108+
/**
109+
* @SYS_OFF_MODE_RESTART_PREPARE:
110+
*
111+
* Handlers prepare system to be restarted. Handlers are
112+
* allowed to sleep.
113+
*/
114+
SYS_OFF_MODE_RESTART_PREPARE,
115+
108116
/**
109117
* @SYS_OFF_MODE_RESTART:
110118
*

kernel/reboot.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,17 @@ void migrate_to_reboot_cpu(void)
243243
set_cpus_allowed_ptr(current, cpumask_of(cpu));
244244
}
245245

246+
/*
247+
* Notifier list for kernel code which wants to be called
248+
* to prepare system for restart.
249+
*/
250+
static BLOCKING_NOTIFIER_HEAD(restart_prep_handler_list);
251+
252+
static void do_kernel_restart_prepare(void)
253+
{
254+
blocking_notifier_call_chain(&restart_prep_handler_list, 0, NULL);
255+
}
256+
246257
/**
247258
* kernel_restart - reboot the system
248259
* @cmd: pointer to buffer containing command to execute for restart
@@ -254,6 +265,7 @@ void migrate_to_reboot_cpu(void)
254265
void kernel_restart(char *cmd)
255266
{
256267
kernel_restart_prepare(cmd);
268+
do_kernel_restart_prepare();
257269
migrate_to_reboot_cpu();
258270
syscore_shutdown();
259271
if (!cmd)
@@ -396,6 +408,11 @@ register_sys_off_handler(enum sys_off_mode mode,
396408
handler->list = &power_off_handler_list;
397409
break;
398410

411+
case SYS_OFF_MODE_RESTART_PREPARE:
412+
handler->list = &restart_prep_handler_list;
413+
handler->blocking = true;
414+
break;
415+
399416
case SYS_OFF_MODE_RESTART:
400417
handler->list = &restart_handler_list;
401418
break;

0 commit comments

Comments
 (0)