From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Subject: printk: make printk.synchronous param rw
Patch-mainline: Not yet, still discussed upstream
References: bnc#744692, bnc#789311, bsc#1174146
Change `synchronous' printk param to be RW, so user space
can change printk mode back and forth to/from sync mode
(which is considered to be more reliable).
[pmladek: Introduce can_printk_async() that will be used later.
Do not introduce userspace interface that will not be
supported upstream.
]
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
kernel/printk/printk.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -461,6 +461,11 @@ static struct task_struct *printk_kthrea
/* When `true' printing thread has messages to print */
static bool printk_kthread_need_flush_console;
+static inline bool can_printk_async(void)
+{
+ return printk_kthread;
+}
+
/*
* We cannot access per-CPU data (e.g. per-CPU flush irq_work) before
* per_cpu_areas are initialised. This variable is set to true when
@@ -2073,7 +2078,7 @@ asmlinkage int vprintk_emit(int facility
* operate in sync mode once panic() occurred.
*/
if (console_loglevel != CONSOLE_LOGLEVEL_MOTORMOUTH &&
- printk_kthread) {
+ can_printk_async()) {
/* Offload printing to a schedulable context. */
printk_kthread_need_flush_console = true;
wake_up_process(printk_kthread);
@@ -3141,7 +3146,7 @@ static void wake_up_klogd_work_func(stru
int pending = this_cpu_xchg(printk_pending, 0);
if (pending & PRINTK_PENDING_OUTPUT) {
- if (printk_kthread) {
+ if (can_printk_async()) {
/* Offload printing to a schedulable context. */
printk_kthread_need_flush_console = true;
wake_up_process(printk_kthread);