|
@@ -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
|
|
|
|