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.

Signed-off-by: Sergey Senozhatsky <sergey.senozhat...@gmail.com>
Suggested-by: Petr Mladek <pmla...@suse.com>
---
 kernel/printk/printk_safe.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c
index c22e286..3ded9e1 100644
--- a/kernel/printk/printk_safe.c
+++ b/kernel/printk/printk_safe.c
@@ -100,14 +100,12 @@ static int printk_safe_log_store(struct 
printk_safe_seq_buf *s,
 static 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 */
-- 
2.10.2

Reply via email to