1
1
mirror of https://github.com/OpenVoiceOS/OpenVoiceOS synced 2025-02-21 14:20:45 +01:00
OpenVoiceOS/buildroot-external/patches/linux/0149-printk-nbcon-Start-printing-threads.patch

145 lines
4.3 KiB
Diff

From 99e5cd49c55579243f18dfa1992dfb2e79eb53a7 Mon Sep 17 00:00:00 2001
From: John Ogness <john.ogness@linutronix.de>
Date: Tue, 5 Dec 2023 14:09:31 +0000
Subject: [PATCH 149/196] printk: nbcon: Start printing threads
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(-)
diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h
index 578623e7f0fc..dcf365635f71 100644
--- 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(struct console *con)
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)
/*
diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c
index 57ed4968a653..b866d0138fe0 100644
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -205,6 +205,8 @@ static void nbcon_seq_try_update(struct nbcon_context *ctxt, u64 new_seq)
}
}
+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 *con)
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 *con)
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);
}
/**
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 3cdda6dd8941..3722f1a66357 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2395,6 +2395,9 @@ asmlinkage int vprintk_emit(int facility, int level,
*
* - 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.
*
@@ -2404,6 +2407,7 @@ asmlinkage int vprintk_emit(int facility, int level,
* with boot consoles.
*/
if (is_panic_context ||
+ !printk_threads_enabled ||
(system_state > SYSTEM_RUNNING)) {
nbcon_atomic_flush_all();
}
@@ -3706,6 +3710,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;
@@ -3777,6 +3782,15 @@ static int unregister_console_locked(struct console *console)
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;
}
--
2.45.1