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 <john.ogness@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Kevin Becker <kevin.becker@canonical.com>
This commit is contained in:
John Ogness
2024-02-06 14:19:34 +00:00
committed by Kevin Becker
parent 285eff7766
commit cdd67ae59b
3 changed files with 26 additions and 1 deletions
@@ -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
+3 -1
View File
@@ -3,6 +3,7 @@
* internal.h - printk internal definitions
*/
#include <linux/console.h>
#include <linux/jump_label.h>
#include <linux/percpu.h>
#include <linux/types.h>
@@ -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
+11
View File
@@ -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,