USB: gadget: g_multi: code clean up and refactoring
[platform/adaptation/renesas_rcar/renesas_kernel.git] / kernel / printk.c
index 444b770..8fe465a 100644 (file)
@@ -37,6 +37,8 @@
 #include <linux/ratelimit.h>
 #include <linux/kmsg_dump.h>
 #include <linux/syslog.h>
+#include <linux/cpu.h>
+#include <linux/notifier.h>
 
 #include <asm/uaccess.h>
 
@@ -985,6 +987,32 @@ void resume_console(void)
 }
 
 /**
+ * console_cpu_notify - print deferred console messages after CPU hotplug
+ * @self: notifier struct
+ * @action: CPU hotplug event
+ * @hcpu: unused
+ *
+ * If printk() is called from a CPU that is not online yet, the messages
+ * will be spooled but will not show up on the console.  This function is
+ * called when a new CPU comes online (or fails to come up), and ensures
+ * that any such output gets printed.
+ */
+static int __cpuinit console_cpu_notify(struct notifier_block *self,
+       unsigned long action, void *hcpu)
+{
+       switch (action) {
+       case CPU_ONLINE:
+       case CPU_DEAD:
+       case CPU_DYING:
+       case CPU_DOWN_FAILED:
+       case CPU_UP_CANCELED:
+               acquire_console_sem();
+               release_console_sem();
+       }
+       return NOTIFY_OK;
+}
+
+/**
  * acquire_console_sem - lock the console system for exclusive use.
  *
  * Acquires a semaphore which guarantees that the caller has
@@ -1371,7 +1399,7 @@ int unregister_console(struct console *console)
 }
 EXPORT_SYMBOL(unregister_console);
 
-static int __init disable_boot_consoles(void)
+static int __init printk_late_init(void)
 {
        struct console *con;
 
@@ -1382,9 +1410,10 @@ static int __init disable_boot_consoles(void)
                        unregister_console(con);
                }
        }
+       hotcpu_notifier(console_cpu_notify, 0);
        return 0;
 }
-late_initcall(disable_boot_consoles);
+late_initcall(printk_late_init);
 
 #if defined CONFIG_PRINTK
 
@@ -1520,9 +1549,9 @@ void kmsg_dump(enum kmsg_dump_reason reason)
        chars = logged_chars;
        spin_unlock_irqrestore(&logbuf_lock, flags);
 
-       if (logged_chars > end) {
-               s1 = log_buf + log_buf_len - logged_chars + end;
-               l1 = logged_chars - end;
+       if (chars > end) {
+               s1 = log_buf + log_buf_len - chars + end;
+               l1 = chars - end;
 
                s2 = log_buf;
                l2 = end;
@@ -1530,8 +1559,8 @@ void kmsg_dump(enum kmsg_dump_reason reason)
                s1 = "";
                l1 = 0;
 
-               s2 = log_buf + end - logged_chars;
-               l2 = logged_chars;
+               s2 = log_buf + end - chars;
+               l2 = chars;
        }
 
        if (!spin_trylock_irqsave(&dump_list_lock, flags)) {