From: John Ogness Date: Tue, 26 Sep 2023 13:04:15 +0000 Subject: [PATCH 37/48] printk: nbcon: Stop threads on shutdown/reboot Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patches-6.8.2-rt11.tar.xz Register a syscore_ops shutdown function to stop all threaded printers on shutdown/reboot. This allows printk to transition back to atomic printing in order to provide a robust mechanism for outputting the final messages. Signed-off-by: John Ogness Signed-off-by: Sebastian Andrzej Siewior --- kernel/printk/nbcon.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "internal.h" #include "printk_ringbuffer.h" @@ -1577,3 +1578,33 @@ void nbcon_driver_release(struct console nbcon_context_release(ctxt); } EXPORT_SYMBOL_GPL(nbcon_driver_release); + +/** + * printk_kthread_shutdown - shutdown all threaded printers + * + * On system shutdown all threaded printers are stopped. This allows printk + * to transition back to atomic printing, thus providing a robust mechanism + * for the final shutdown/reboot messages to be output. + */ +static void printk_kthread_shutdown(void) +{ + struct console *con; + + console_list_lock(); + for_each_console(con) { + if (con->flags & CON_NBCON) + nbcon_kthread_stop(con); + } + console_list_unlock(); +} + +static struct syscore_ops printk_syscore_ops = { + .shutdown = printk_kthread_shutdown, +}; + +static int __init printk_init_ops(void) +{ + register_syscore_ops(&printk_syscore_ops); + return 0; +} +device_initcall(printk_init_ops);