--- /dev/null
+From a338f84dc196f44b63ba0863d2f34fd9b1613572 Mon Sep 17 00:00:00 2001
+From: Petr Mladek <pmladek@suse.com>
+Date: Wed, 27 Jun 2018 16:08:16 +0200
+Subject: printk: Create helper function to queue deferred console handling
+
+From: Petr Mladek <pmladek@suse.com>
+
+commit a338f84dc196f44b63ba0863d2f34fd9b1613572 upstream.
+
+It is just a preparation step. The patch does not change
+the existing behavior.
+
+Link: http://lkml.kernel.org/r/20180627140817.27764-3-pmladek@suse.com
+To: Steven Rostedt <rostedt@goodmis.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
+Cc: linux-kernel@vger.kernel.org
+Cc: stable@vger.kernel.org
+Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
+Signed-off-by: Petr Mladek <pmladek@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/printk/printk.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -2723,16 +2723,20 @@ void wake_up_klogd(void)
+ preempt_enable();
+ }
+
+-int vprintk_deferred(const char *fmt, va_list args)
++void defer_console_output(void)
+ {
+- int r;
+-
+- r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args);
+-
+ preempt_disable();
+ __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
+ irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
+ preempt_enable();
++}
++
++int vprintk_deferred(const char *fmt, va_list args)
++{
++ int r;
++
++ r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args);
++ defer_console_output();
+
+ return r;
+ }
--- /dev/null
+From ba552399954dde1b388f7749fecad5c349216981 Mon Sep 17 00:00:00 2001
+From: Petr Mladek <pmladek@suse.com>
+Date: Wed, 27 Jun 2018 16:08:15 +0200
+Subject: printk: Split the code for storing a message into the log buffer
+
+From: Petr Mladek <pmladek@suse.com>
+
+commit ba552399954dde1b388f7749fecad5c349216981 upstream.
+
+It is just a preparation step. The patch does not change
+the existing behavior.
+
+Link: http://lkml.kernel.org/r/20180627140817.27764-2-pmladek@suse.com
+To: Steven Rostedt <rostedt@goodmis.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
+Cc: linux-kernel@vger.kernel.org
+Cc: stable@vger.kernel.org
+Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
+Signed-off-by: Petr Mladek <pmladek@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/printk/printk.c | 43 ++++++++++++++++++++++++++-----------------
+ 1 file changed, 26 insertions(+), 17 deletions(-)
+
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -1680,28 +1680,16 @@ static size_t log_output(int facility, i
+ return log_store(facility, level, lflags, 0, dict, dictlen, text, text_len);
+ }
+
+-asmlinkage int vprintk_emit(int facility, int level,
+- const char *dict, size_t dictlen,
+- const char *fmt, va_list args)
++/* Must be called under logbuf_lock. */
++int vprintk_store(int facility, int level,
++ const char *dict, size_t dictlen,
++ const char *fmt, va_list args)
+ {
+ static char textbuf[LOG_LINE_MAX];
+ char *text = textbuf;
+ size_t text_len;
+ enum log_flags lflags = 0;
+- unsigned long flags;
+- int printed_len;
+- bool in_sched = false;
+-
+- if (level == LOGLEVEL_SCHED) {
+- level = LOGLEVEL_DEFAULT;
+- in_sched = true;
+- }
+-
+- boot_delay_msec(level);
+- printk_delay();
+
+- /* This stops the holder of console_sem just where we want him */
+- logbuf_lock_irqsave(flags);
+ /*
+ * The printf needs to come first; we need the syslog
+ * prefix which might be passed-in as a parameter.
+@@ -1742,8 +1730,29 @@ asmlinkage int vprintk_emit(int facility
+ if (dict)
+ lflags |= LOG_PREFIX|LOG_NEWLINE;
+
+- printed_len = log_output(facility, level, lflags, dict, dictlen, text, text_len);
++ return log_output(facility, level, lflags,
++ dict, dictlen, text, text_len);
++}
+
++asmlinkage int vprintk_emit(int facility, int level,
++ const char *dict, size_t dictlen,
++ const char *fmt, va_list args)
++{
++ int printed_len;
++ bool in_sched = false;
++ unsigned long flags;
++
++ if (level == LOGLEVEL_SCHED) {
++ level = LOGLEVEL_DEFAULT;
++ in_sched = true;
++ }
++
++ boot_delay_msec(level);
++ printk_delay();
++
++ /* This stops the holder of console_sem just where we want him */
++ logbuf_lock_irqsave(flags);
++ printed_len = vprintk_store(facility, level, dict, dictlen, fmt, args);
+ logbuf_unlock_irqrestore(flags);
+
+ /* If called from the scheduler, we can not call up(). */