From cdd67ae59b26caceab21010d5e79695409bffc34 Mon Sep 17 00:00:00 2001 From: John Ogness Date: Tue, 6 Feb 2024 14:19:34 +0000 Subject: [PATCH] printk: Provide threadprintk boot argument BugLink: https://bugs.launchpad.net/bugs/2060704 For PREEMPT_RT, legacy console printing is performed in a dedicated kthread. However, this behavior can also be interesting for other preemption models as it minimizes the duration of printk() calls by deferring all printing. Provide a new boot argument "threadprintk" that will create the dedicated kthread for legacy console printing for !PREEMPT_RT systems. The implementation is the same as "threadirqs" boot argument. Users should be aware that if this option is enabled, the shutdown, reboot, and panic messages probably will not be visible on the legacy consoles. Non-legacy consoles (NBCON) already have their own dedicated kernel threads for printing and reliable shutdown, reboot, and panic printing. This option really only applies to legacy consoles. Users can view /proc/consoles to see if their console driver is legacy or not. NBCON console drivers are shown with 'N'. Signed-off-by: John Ogness Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Kevin Becker --- Documentation/admin-guide/kernel-parameters.txt | 12 ++++++++++++ kernel/printk/internal.h | 4 +++- kernel/printk/printk.c | 11 +++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 85b71fbb7531..371bceb23cf2 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -6570,6 +6570,18 @@ Force threading of all interrupt handlers except those marked explicitly IRQF_NO_THREAD. + threadprintk [KNL] + Force threaded printing of all legacy consoles. Be + aware that with this option, the shutdown, reboot, and + panic messages may not be printed on the legacy + consoles. Also, earlycon/earlyprintk printing will be + delayed until a regular console or the kthread is + available. + + Users can view /proc/consoles to see if their console + driver is legacy or not. Non-legacy (NBCON) console + drivers are already threaded and are shown with 'N'. + topology= [S390] Format: {off | on} Specify if the kernel should make use of the cpu diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h index b70a2c91a5af..fdf455c89033 100644 --- a/kernel/printk/internal.h +++ b/kernel/printk/internal.h @@ -3,6 +3,7 @@ * internal.h - printk internal definitions */ #include +#include #include #include @@ -24,7 +25,8 @@ int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write, #ifdef CONFIG_PREEMPT_RT # define force_printkthreads() (true) #else -# define force_printkthreads() (false) +DECLARE_STATIC_KEY_FALSE(force_printkthreads_key); +# define force_printkthreads() (static_branch_unlikely(&force_printkthreads_key)) #endif #ifdef CONFIG_PRINTK diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 50e9c3b14ba6..e7ba00d5207a 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -195,6 +195,17 @@ static int __init control_devkmsg(char *str) } __setup("printk.devkmsg=", control_devkmsg); +#if !defined(CONFIG_PREEMPT_RT) +DEFINE_STATIC_KEY_FALSE(force_printkthreads_key); + +static int __init setup_forced_printkthreads(char *arg) +{ + static_branch_enable(&force_printkthreads_key); + return 0; +} +early_param("threadprintk", setup_forced_printkthreads); +#endif + char devkmsg_log_str[DEVKMSG_STR_MAX_SIZE] = "ratelimit"; #if defined(CONFIG_PRINTK) && defined(CONFIG_SYSCTL) int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,