From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Subject: printk: make printk.synchronous param rw
Patch-mainline: No, 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 | 56 ++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 45 insertions(+), 11 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 89f5441..9345a29 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -288,6 +288,11 @@ static u32 log_buf_len = __LOG_BUF_LEN;
/* 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
@@ -1785,7 +1787,7 @@ asmlinkage int vprintk_emit(int facility, int level,
* 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);
@@ -2820,7 +2854,7 @@ static void wake_up_klogd_work_func(struct irq_work *irq_work)
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);
--
2.8.0