summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0126-printk-nbcon-Start-printing-threads.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches-rt/0126-printk-nbcon-Start-printing-threads.patch135
1 files changed, 135 insertions, 0 deletions
diff --git a/debian/patches-rt/0126-printk-nbcon-Start-printing-threads.patch b/debian/patches-rt/0126-printk-nbcon-Start-printing-threads.patch
new file mode 100644
index 000000000..ec4122163
--- /dev/null
+++ b/debian/patches-rt/0126-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 126/134] printk: nbcon: Start printing threads
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6.7-rt18.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
+@@ -44,6 +44,7 @@ enum printk_info_flags {
+ };
+
+ extern struct printk_ringbuffer *prb;
++extern bool printk_threads_enabled;
+ extern bool have_legacy_console;
+ extern bool have_boot_console;
+
+@@ -161,6 +162,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)
+ #define printing_via_unlock (false)
+
+ /*
+--- a/kernel/printk/nbcon.c
++++ b/kernel/printk/nbcon.c
+@@ -205,6 +205,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
+@@ -1401,7 +1403,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;
+
+ /*
+@@ -1427,6 +1429,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
+@@ -1477,6 +1492,7 @@ void nbcon_init(struct console *con)
+ init_irq_work(&con->irq_work, nbcon_irq_work);
+ nbcon_seq_force(con, con->seq);
+ nbcon_state_set(con, &state);
++ nbcon_kthread_create(con);
+ }
+
+ /**
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -2389,6 +2389,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.
+ *
+@@ -2398,6 +2401,7 @@ asmlinkage int vprintk_emit(int facility
+ * with boot consoles.
+ */
+ if (is_panic_context ||
++ !printk_threads_enabled ||
+ (system_state > SYSTEM_RUNNING)) {
+ nbcon_atomic_flush_all();
+ }
+@@ -3685,6 +3689,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;
+@@ -3756,6 +3761,15 @@ static int unregister_console_locked(str
+ if (!found_nbcon_con)
+ have_nbcon_console = false;
+
++ /*
++ * 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;
+ }
+