Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <dmitry.osipenko@collabora.com>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
[ rjw: Changelog edits ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Kai-Heng Feng and committed by
Rafael J. Wysocki
e7fd8b68 f76349cf

+25
+8
include/linux/reboot.h
··· 106 106 SYS_OFF_MODE_POWER_OFF, 107 107 108 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 + 116 + /** 109 117 * @SYS_OFF_MODE_RESTART: 110 118 * 111 119 * Handlers restart system. Handlers are disallowed to sleep.
+17
kernel/reboot.c
··· 243 243 set_cpus_allowed_ptr(current, cpumask_of(cpu)); 244 244 } 245 245 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 + 246 257 /** 247 258 * kernel_restart - reboot the system 248 259 * @cmd: pointer to buffer containing command to execute for restart ··· 265 254 void kernel_restart(char *cmd) 266 255 { 267 256 kernel_restart_prepare(cmd); 257 + do_kernel_restart_prepare(); 268 258 migrate_to_reboot_cpu(); 269 259 syscore_shutdown(); 270 260 if (!cmd) ··· 406 394 407 395 case SYS_OFF_MODE_POWER_OFF: 408 396 handler->list = &power_off_handler_list; 397 + break; 398 + 399 + case SYS_OFF_MODE_RESTART_PREPARE: 400 + handler->list = &restart_prep_handler_list; 401 + handler->blocking = true; 409 402 break; 410 403 411 404 case SYS_OFF_MODE_RESTART: