preempt_enable();
        }
 
-       wake_up_klogd();
+       if (in_sched)
+               defer_console_output();
+       else
+               wake_up_klogd();
+
        return printed_len;
 }
 EXPORT_SYMBOL(vprintk_emit);
        preempt_enable();
 }
 
+/**
+ * wake_up_klogd - Wake kernel logging daemon
+ *
+ * Use this function when new records have been added to the ringbuffer
+ * and the console printing of those records has already occurred or is
+ * known to be handled by some other context. This function will only
+ * wake the logging daemon.
+ *
+ * Context: Any context.
+ */
 void wake_up_klogd(void)
 {
        __wake_up_klogd(PRINTK_PENDING_WAKEUP);
 }
 
+/**
+ * defer_console_output - Wake kernel logging daemon and trigger
+ *     console printing in a deferred context
+ *
+ * Use this function when new records have been added to the ringbuffer,
+ * this context is responsible for console printing those records, but
+ * the current context is not allowed to perform the console printing.
+ * Trigger an irq_work context to perform the console printing. This
+ * function also wakes the logging daemon.
+ *
+ * Context: Any context.
+ */
 void defer_console_output(void)
 {
        /*
 
 int vprintk_deferred(const char *fmt, va_list args)
 {
-       int r;
-
-       r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args);
-       defer_console_output();
-
-       return r;
+       return vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args);
 }
 
 int _printk_deferred(const char *fmt, ...)
 
         * Use the main logbuf even in NMI. But avoid calling console
         * drivers that might have their own locks.
         */
-       if (this_cpu_read(printk_context) || in_nmi()) {
-               int len;
-
-               len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args);
-               defer_console_output();
-               return len;
-       }
+       if (this_cpu_read(printk_context) || in_nmi())
+               return vprintk_deferred(fmt, args);
 
        /* No obstacles. */
        return vprintk_default(fmt, args);