From: Ralf Baechle on
On Wed, Aug 04, 2010 at 12:30:34PM +0900, Paul Mundt wrote:

> > An older version of this patch is present in linux-next, committed by
> > Paul Mundt, who wasn't cc'ed here(!).
> >
> > Paul, please update. Be aware that the version of the patch to which I
> > replied is also not the latest.
> >
> I just reviewed it, it went in through the MIPS tree if memory serves
> correctly, so Ralf (added to Cc) would have been the one that checked it
> in. I'll take a look at the thread though.

Authored by Kevin Cernekee and committed by me. No idea where akpm found
Paul's name.

commit 4251bce66898298b03824b7d94ce94c431404b54
Author: Kevin Cernekee <cernekee(a)gmail.com>
AuthorDate: Thu Jun 3 22:11:25 2010 -0700
Commit: Ralf Baechle <ralf(a)linux-mips.org>
CommitDate: Mon Aug 2 14:00:10 2010 +0100

Will update the patch.

Ralf
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Ralf Baechle on
Santosh's patch was lacking akpm's cleanup patch. So I created the
following from all contributions.

Ralf

From 040f52ce2a3cab374bfed036ccd8ecf4b1fb7add Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <cernekee(a)gmail.com>
Date: Thu, 3 Jun 2010 22:11:25 -0700
Subject: [PATCH] printk: fix delayed messages from CPU hotplug events

When a secondary CPU is being brought up, it is not uncommon for
printk() to be invoked when cpu_online(smp_processor_id()) == 0. The
case that I witnessed personally was on MIPS:

http://lkml.org/lkml/2010/5/30/4

If (can_use_console() == 0), printk() will spool its output to log_buf
and it will be visible in "dmesg", but that output will NOT be echoed to
the console until somebody calls release_console_sem() from a CPU that
is online. Therefore, the boot time messages from the new CPU can get
stuck in "limbo" for a long time, and might suddenly appear on the
screen when a completely unrelated event (e.g. "eth0: link is down")
occurs.

This patch modifies the console code so that any pending messages are
automatically flushed out to the console whenever a CPU hotplug
operation completes successfully or aborts.

The issue was seen on 2.6.34.

Original patch by Kevin Cernekee with cleanups by akpm and additional fixes
by Santosh Shilimkar. This patch superseeds
https://patchwork.linux-mips.org/patch/1357/.

Signed-off-by: Kevin Cernekee <cernekee(a)gmail.com>
To: <mingo(a)elte.hu>
To: <akpm(a)linux-foundation.org>
To: <simon.kagstrom(a)netinsight.net>
To: <David.Woodhouse(a)intel.com>
To: <lethal(a)linux-sh.org>
Cc: <linux-kernel(a)vger.kernel.org>
Cc: <linux-mips(a)linux-mips.org>
Reviewed-by: Paul Mundt <lethal(a)linux-sh.org>
Signed-off-by: Kevin Cernekee <cernekee(a)gmail.com>
Patchwork: https://patchwork.linux-mips.org/patch/1533/
LKML-Reference: <ede63b5a20af951c755736f035d1e787772d7c28(a)localhost>
LKML-Reference: <EAF47CD23C76F840A9E7FCE10091EFAB02C5DB6D1F(a)dbde02.ent.ti.com>
Signed-off-by: Ralf Baechle <ralf(a)linux-mips.org>

diff --git a/kernel/printk.c b/kernel/printk.c
index 444b770..4ab0164 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/