summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch')
-rw-r--r--debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch135
1 files changed, 135 insertions, 0 deletions
diff --git a/debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch b/debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch
new file mode 100644
index 0000000000..63aae75ebb
--- /dev/null
+++ b/debian/patches-rt/0038-printk-nbcon-Start-printing-threads.patch
@@ -0,0 +1,135 @@
+From: John Ogness <john.ogness@linutronix.de>
+Date: Tue, 5 Dec 2023 14:09:31 +0000
+Subject: [PATCH 38/48] printk: nbcon: Start printing threads
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patches-6.8.2-rt11.tar.xz
+
+If there are no boot consoles, the printing threads are started
+in early_initcall.
+
+If there are boot consoles, the printing threads are started
+after the last boot console has unregistered. The printing
+threads do not need to be concerned about boot consoles because
+boot consoles cannot register once a non-boot console has
+registered.
+
+Until a printing thread of a console has started, that console
+will print using atomic_write() in the printk() caller context.
+
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/printk/internal.h | 2 ++
+ kernel/printk/nbcon.c | 18 +++++++++++++++++-
+ kernel/printk/printk.c | 14 ++++++++++++++
+ 3 files changed, 33 insertions(+), 1 deletion(-)
+
+--- a/kernel/printk/internal.h
++++ b/kernel/printk/internal.h
+@@ -48,6 +48,7 @@ struct printk_ringbuffer;
+ struct dev_printk_info;
+
+ extern struct printk_ringbuffer *prb;
++extern bool printk_threads_enabled;
+
+ __printf(4, 0)
+ int vprintk_store(int facility, int level,
+@@ -159,6 +160,7 @@ static inline void nbcon_kthread_wake(st
+
+ static inline void nbcon_kthread_wake(struct console *con) { }
+ static inline void nbcon_kthread_create(struct console *con) { }
++#define printk_threads_enabled (false)
+
+ /*
+ * In !PRINTK builds we still export console_sem
+--- a/kernel/printk/nbcon.c
++++ b/kernel/printk/nbcon.c
+@@ -213,6 +213,8 @@ static void nbcon_seq_try_update(struct
+ }
+ }
+
++bool printk_threads_enabled __ro_after_init;
++
+ /**
+ * nbcon_context_try_acquire_direct - Try to acquire directly
+ * @ctxt: The context of the caller
+@@ -1436,7 +1438,7 @@ void nbcon_kthread_create(struct console
+ if (!(con->flags & CON_NBCON) || !con->write_thread)
+ return;
+
+- if (con->kthread)
++ if (!printk_threads_enabled || con->kthread)
+ return;
+
+ /*
+@@ -1462,6 +1464,19 @@ void nbcon_kthread_create(struct console
+ sched_set_normal(con->kthread, -20);
+ }
+
++static int __init printk_setup_threads(void)
++{
++ struct console *con;
++
++ console_list_lock();
++ printk_threads_enabled = true;
++ for_each_console(con)
++ nbcon_kthread_create(con);
++ console_list_unlock();
++ return 0;
++}
++early_initcall(printk_setup_threads);
++
+ /**
+ * nbcon_alloc - Allocate buffers needed by the nbcon console
+ * @con: Console to allocate buffers for
+@@ -1510,6 +1525,7 @@ void nbcon_init(struct console *con)
+ init_irq_work(&con->irq_work, nbcon_irq_work);
+ nbcon_seq_force(con, 0);
+ nbcon_state_set(con, &state);
++ nbcon_kthread_create(con);
+ }
+
+ /**
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -2402,6 +2402,9 @@ asmlinkage int vprintk_emit(int facility
+ *
+ * - When this CPU is in panic.
+ *
++ * - When booting, before the printing threads have been
++ * started.
++ *
+ * - During shutdown, since the printing threads may not get
+ * a chance to print the final messages.
+ *
+@@ -2410,6 +2413,7 @@ asmlinkage int vprintk_emit(int facility
+ * consoles cannot print simultaneously with boot consoles.
+ */
+ if (is_panic_context ||
++ !printk_threads_enabled ||
+ (system_state > SYSTEM_RUNNING)) {
+ nbcon_atomic_flush_pending();
+ }
+@@ -3726,6 +3730,7 @@ EXPORT_SYMBOL(register_console);
+ /* Must be called under console_list_lock(). */
+ static int unregister_console_locked(struct console *console)
+ {
++ bool is_boot_con = (console->flags & CON_BOOT);
+ bool found_legacy_con = false;
+ bool found_nbcon_con = false;
+ bool found_boot_con = false;
+@@ -3797,6 +3802,15 @@ static int unregister_console_locked(str
+ if (!found_nbcon_con)
+ have_nbcon_console = found_nbcon_con;
+
++ /*
++ * When the last boot console unregisters, start up the
++ * printing threads.
++ */
++ if (is_boot_con && !have_boot_console) {
++ for_each_console(c)
++ nbcon_kthread_create(c);
++ }
++
+ return res;
+ }
+