Merge tag 'tags/restart-handler-for-v3.18' into next
Immutable branch with restart handler patches for v3.18
This commit is contained in:
@@ -104,6 +104,87 @@ int unregister_reboot_notifier(struct notifier_block *nb)
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_reboot_notifier);
|
||||
|
||||
/*
|
||||
* Notifier list for kernel code which wants to be called
|
||||
* to restart the system.
|
||||
*/
|
||||
static ATOMIC_NOTIFIER_HEAD(restart_handler_list);
|
||||
|
||||
/**
|
||||
* register_restart_handler - Register function to be called to reset
|
||||
* the system
|
||||
* @nb: Info about handler function to be called
|
||||
* @nb->priority: Handler priority. Handlers should follow the
|
||||
* following guidelines for setting priorities.
|
||||
* 0: Restart handler of last resort,
|
||||
* with limited restart capabilities
|
||||
* 128: Default restart handler; use if no other
|
||||
* restart handler is expected to be available,
|
||||
* and/or if restart functionality is
|
||||
* sufficient to restart the entire system
|
||||
* 255: Highest priority restart handler, will
|
||||
* preempt all other restart handlers
|
||||
*
|
||||
* Registers a function with code to be called to restart the
|
||||
* system.
|
||||
*
|
||||
* Registered functions will be called from machine_restart as last
|
||||
* step of the restart sequence (if the architecture specific
|
||||
* machine_restart function calls do_kernel_restart - see below
|
||||
* for details).
|
||||
* Registered functions are expected to restart the system immediately.
|
||||
* If more than one function is registered, the restart handler priority
|
||||
* selects which function will be called first.
|
||||
*
|
||||
* Restart handlers are expected to be registered from non-architecture
|
||||
* code, typically from drivers. A typical use case would be a system
|
||||
* where restart functionality is provided through a watchdog. Multiple
|
||||
* restart handlers may exist; for example, one restart handler might
|
||||
* restart the entire system, while another only restarts the CPU.
|
||||
* In such cases, the restart handler which only restarts part of the
|
||||
* hardware is expected to register with low priority to ensure that
|
||||
* it only runs if no other means to restart the system is available.
|
||||
*
|
||||
* Currently always returns zero, as atomic_notifier_chain_register()
|
||||
* always returns zero.
|
||||
*/
|
||||
int register_restart_handler(struct notifier_block *nb)
|
||||
{
|
||||
return atomic_notifier_chain_register(&restart_handler_list, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(register_restart_handler);
|
||||
|
||||
/**
|
||||
* unregister_restart_handler - Unregister previously registered
|
||||
* restart handler
|
||||
* @nb: Hook to be unregistered
|
||||
*
|
||||
* Unregisters a previously registered restart handler function.
|
||||
*
|
||||
* Returns zero on success, or %-ENOENT on failure.
|
||||
*/
|
||||
int unregister_restart_handler(struct notifier_block *nb)
|
||||
{
|
||||
return atomic_notifier_chain_unregister(&restart_handler_list, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_restart_handler);
|
||||
|
||||
/**
|
||||
* do_kernel_restart - Execute kernel restart handler call chain
|
||||
*
|
||||
* Calls functions registered with register_restart_handler.
|
||||
*
|
||||
* Expected to be called from machine_restart as last step of the restart
|
||||
* sequence.
|
||||
*
|
||||
* Restarts the system immediately if a restart handler function has been
|
||||
* registered. Otherwise does nothing.
|
||||
*/
|
||||
void do_kernel_restart(char *cmd)
|
||||
{
|
||||
atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
|
||||
}
|
||||
|
||||
void migrate_to_reboot_cpu(void)
|
||||
{
|
||||
/* The boot cpu is always logical cpu 0 */
|
||||
|
||||
Reference in New Issue
Block a user