Messages in this thread Patch in this message | | | From | John Ogness <> | Subject | [PATCH printk v1 15/18] printk: nobkl: Stop threads on shutdown/reboot | Date | Thu, 2 Mar 2023 21:02:15 +0106 |
| |
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 <john.ogness@linutronix.de> --- kernel/printk/printk_nobkl.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
diff --git a/kernel/printk/printk_nobkl.c b/kernel/printk/printk_nobkl.c index 001a1ca9793f..53989c8f1dbc 100644 --- a/kernel/printk/printk_nobkl.c +++ b/kernel/printk/printk_nobkl.c @@ -7,6 +7,7 @@ #include <linux/delay.h> #include <linux/kthread.h> #include <linux/slab.h> +#include <linux/syscore_ops.h> #include "printk_ringbuffer.h" #include "internal.h" /* @@ -1763,3 +1764,33 @@ void cons_nobkl_cleanup(struct console *con) cons_state_set(con, CON_STATE_REQ, &state); cons_free_percpu_data(con); } + +/** + * 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_NO_BKL) + cons_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); -- 2.30.2
| |