printk: always use deferred printk when flush printk_safe lines
authorSergey Senozhatsky <sergey.senozhatsky@gmail.com>
Mon, 6 Feb 2017 16:42:53 +0000 (01:42 +0900)
committerPetr Mladek <pmladek@suse.com>
Wed, 8 Feb 2017 10:19:10 +0000 (11:19 +0100)
Always use printk_deferred() in printk_safe_flush_line().
Flushing can be done from NMI or printk_safe contexts (when
we are in panic), so we can't call console drivers, yet still
want to store the messages in the logbuf buffer. Therefore we
use a deferred printk version.

Link: http://lkml.kernel.org/r/20170206164253.GA463@tigerII.localdomain
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jan Kara <jack@suse.cz>
Cc: Tejun Heo <tj@kernel.org>
Cc: Calvin Owens <calvinowens@fb.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Suggested-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/printk/printk_safe.c

index efc89a4e9df52164dfe72dce356f6ddeae9b7e83..5214d326d3ba954e7b367dd0e6133dddff211863 100644 (file)
@@ -110,17 +110,15 @@ again:
        return add;
 }
 
-static void printk_safe_flush_line(const char *text, int len)
+static inline void printk_safe_flush_line(const char *text, int len)
 {
        /*
-        * The buffers are flushed in NMI only on panic.  The messages must
-        * go only into the ring buffer at this stage.  Consoles will get
-        * explicitly called later when a crashdump is not generated.
+        * Avoid any console drivers calls from here, because we may be
+        * in NMI or printk_safe context (when in panic). The messages
+        * must go only into the ring buffer at this stage.  Consoles will
+        * get explicitly called later when a crashdump is not generated.
         */
-       if (in_nmi())
-               printk_deferred("%.*s", len, text);
-       else
-               printk("%.*s", len, text);
+       printk_deferred("%.*s", len, text);
 }
 
 /* printk part of the temporary buffer line by line */