]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - kernel/printk.c
ASoC: Remove unused vol field from WM8994 access mask table
[net-next-2.6.git] / kernel / printk.c
index 444b770c95959261a491b8a673ff42e29a181592..8fe465ac008aebdcdbb0e9db9fcd644d5b12c231 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>
 
@@ -984,6 +986,32 @@ void resume_console(void)
        release_console_sem();
 }
 
+/**
+ * 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.
  *
@@ -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)) {