mirror of
https://github.com/OpenVoiceOS/OpenVoiceOS
synced 2025-02-21 14:20:45 +01:00
145 lines
4.3 KiB
Diff
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
|
|
|