From 6f82e0f9ec3f72c67a49548c040b98a8639db827 Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Thu, 3 Jun 2010 22:11:25 -0700 Subject: [PATCH] --- yaml --- r: 204525 b: refs/heads/master c: 034260d6779087431a8b2f67589c68b919299e5c h: refs/heads/master i: 204523: 4ced5332a4bafb1b8cee3dea97257ef82530e52f v: v3 --- [refs] | 2 +- trunk/kernel/printk.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 889a3742c061..bb11478affa9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d745866e4d8c0675bab90868b5e4a8fcd053eff2 +refs/heads/master: 034260d6779087431a8b2f67589c68b919299e5c diff --git a/trunk/kernel/printk.c b/trunk/kernel/printk.c index 444b770c9595..4ab0164bcf84 100644 --- a/trunk/kernel/printk.c +++ b/trunk/kernel/printk.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include @@ -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