public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
@ 2010-06-29  8:52 Shilimkar, Santosh
  2010-08-02 22:44 ` Andrew Morton
  0 siblings, 1 reply; 10+ messages in thread
From: Shilimkar, Santosh @ 2010-06-29  8:52 UTC (permalink / raw)
  To: Kevin Cernekee; +Cc: linux-kernel@vger.kernel.org, Russell King - ARM Linux

Hi,

I have faced similar issue as what is being described in below with
latest kernel.

------------------------------------------------
https://patchwork.kernel.org/patch/103347/

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.

-----------------------------------------------

Above patch fixes only half of the problem. I mean the cpu online
path prints are coming on the console.

But similar problem also exist if there are prints in the cpu offline
path. I got that fixed by adding below patch on top of you patch.
 
diff --git a/kernel/printk.c b/kernel/printk.c
index d370b74..f4d7352 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -982,6 +982,9 @@ static int __cpuinit console_cpu_notify(struct notifier_bloc
        switch (action) {
        case CPU_ONLINE:
        case CPU_UP_CANCELED:
+       case CPU_DEAD:
+       case CPU_DYING:
+       case CPU_DOWN_FAILED:
                if (try_acquire_console_sem() == 0)
                        release_console_sem();
        }



Regards
Santosh

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
@ 2010-07-01  4:27 Shilimkar, Santosh
  0 siblings, 0 replies; 10+ messages in thread
From: Shilimkar, Santosh @ 2010-07-01  4:27 UTC (permalink / raw)
  To: Kevin Cernekee, linux-pm@lists.linux-foundation.org
  Cc: linux-kernel@vger.kernel.org, Russell King - ARM Linux

(Adding linux-pm@lists.linux-foundation.org)

> -----Original Message-----
> From: Shilimkar, Santosh
> Sent: Tuesday, June 29, 2010 2:22 PM
> To: 'Kevin Cernekee'
> Cc: linux-kernel@vger.kernel.org; Russell King - ARM Linux
> Subject: Additional fix : (was [v2]printk: fix delayed messages from CPU
> hotplug events)
> 
> Hi,
> 
> I have faced similar issue as what is being described in below with
> latest kernel.
> 
> ------------------------------------------------
> https://patchwork.kernel.org/patch/103347/
> 
> 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.
> 
> -----------------------------------------------
> 
> Above patch fixes only half of the problem. I mean the cpu online
> path prints are coming on the console.
> 
> But similar problem also exist if there are prints in the cpu offline
> path. I got that fixed by adding below patch on top of you patch.
> 
> diff --git a/kernel/printk.c b/kernel/printk.c
> index d370b74..f4d7352 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -982,6 +982,9 @@ static int __cpuinit console_cpu_notify(struct
> notifier_bloc
>         switch (action) {
>         case CPU_ONLINE:
>         case CPU_UP_CANCELED:
> +       case CPU_DEAD:
> +       case CPU_DYING:
> +       case CPU_DOWN_FAILED:
>                 if (try_acquire_console_sem() == 0)
>                         release_console_sem();
>         }
> 
> 
> 
> Regards
> Santosh

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-06-29  8:52 Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events) Shilimkar, Santosh
@ 2010-08-02 22:44 ` Andrew Morton
  2010-08-03  7:33   ` Shilimkar, Santosh
  0 siblings, 1 reply; 10+ messages in thread
From: Andrew Morton @ 2010-08-02 22:44 UTC (permalink / raw)
  To: Shilimkar, Santosh
  Cc: Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux

On Tue, 29 Jun 2010 14:22:26 +0530
"Shilimkar, Santosh" <santosh.shilimkar@ti.com> wrote:

> Hi,
> 
> I have faced similar issue as what is being described in below with
> latest kernel.
> 
> ------------------------------------------------
> https://patchwork.kernel.org/patch/103347/
> 
> 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.
> 
> -----------------------------------------------
> 
> Above patch fixes only half of the problem. I mean the cpu online
> path prints are coming on the console.
> 
> But similar problem also exist if there are prints in the cpu offline
> path. I got that fixed by adding below patch on top of you patch.
>  
> diff --git a/kernel/printk.c b/kernel/printk.c
> index d370b74..f4d7352 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -982,6 +982,9 @@ static int __cpuinit console_cpu_notify(struct notifier_bloc
>         switch (action) {
>         case CPU_ONLINE:
>         case CPU_UP_CANCELED:
> +       case CPU_DEAD:
> +       case CPU_DYING:
> +       case CPU_DOWN_FAILED:
>                 if (try_acquire_console_sem() == 0)
>                         release_console_sem();
>         }

The patch lacked a suitable title.  I called it "console: flush log
messages for more cpu-hotplug events".

The patch lacks a Signed-off-by:.  Please send one.

The patch has its tabs replaced with spaces.  I fixed that.  Please
reconfigure your email client for next time.

The code which is being patch has changed.  It now does

                acquire_console_sem();
                release_console_sem();

so the code may no longer work - perhaps it now deadlocks (unlikely). 
Please retest?

Finally, I don't understand the patch :( Who is sending out CPU_DEAD,
CPU_DYING or CPU_DOWN_FAILED events during kernel boot?  I'd have
thought that those events simply aren't occurring, and that the patch
has no effect.  Confused - please explain further.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-02 22:44 ` Andrew Morton
@ 2010-08-03  7:33   ` Shilimkar, Santosh
  2010-08-03 15:24     ` Randy Dunlap
  2010-08-03 23:59     ` Andrew Morton
  0 siblings, 2 replies; 10+ messages in thread
From: Shilimkar, Santosh @ 2010-08-03  7:33 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux

[-- Attachment #1: Type: text/plain, Size: 6577 bytes --]

Thanks Andrew for looking into this.
> -----Original Message-----
> From: Andrew Morton [mailto:akpm@linux-foundation.org]
> Sent: Tuesday, August 03, 2010 4:15 AM
> To: Shilimkar, Santosh
> Cc: Kevin Cernekee; linux-kernel@vger.kernel.org; Russell King - ARM Linux
> Subject: Re: Additional fix : (was [v2]printk: fix delayed messages from
> CPU hotplug events)
> 
> On Tue, 29 Jun 2010 14:22:26 +0530
> "Shilimkar, Santosh" <santosh.shilimkar@ti.com> wrote:
> 
> > Hi,
> >
> > I have faced similar issue as what is being described in below with
> > latest kernel.
> >
> > ------------------------------------------------
> > https://patchwork.kernel.org/patch/103347/
> >
> > 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.
> >
> > -----------------------------------------------
> >
> > Above patch fixes only half of the problem. I mean the cpu online
> > path prints are coming on the console.
> >
> > But similar problem also exist if there are prints in the cpu offline
> > path. I got that fixed by adding below patch on top of you patch.
> >
> > diff --git a/kernel/printk.c b/kernel/printk.c
> > index d370b74..f4d7352 100644
> > --- a/kernel/printk.c
> > +++ b/kernel/printk.c
> > @@ -982,6 +982,9 @@ static int __cpuinit console_cpu_notify(struct
> notifier_bloc
> >         switch (action) {
> >         case CPU_ONLINE:
> >         case CPU_UP_CANCELED:
> > +       case CPU_DEAD:
> > +       case CPU_DYING:
> > +       case CPU_DOWN_FAILED:
> >                 if (try_acquire_console_sem() == 0)
> >                         release_console_sem();
> >         }
> 
> The patch lacked a suitable title.  I called it "console: flush log
> messages for more cpu-hotplug events".
>
This diff was on top of already posted RFC patch. I will combine them

> The patch lacks a Signed-off-by:.  Please send one.
> 
> The patch has its tabs replaced with spaces.  I fixed that.  Please
> reconfigure your email client for next time.
> 
> The code which is being patch has changed.  It now does
> 
>                 acquire_console_sem();
>                 release_console_sem();
> 
> so the code may no longer work - perhaps it now deadlocks (unlikely).
> Please retest?
Retested. No deadlock observed
> 
> Finally, I don't understand the patch :( Who is sending out CPU_DEAD,
> CPU_DYING or CPU_DOWN_FAILED events during kernel boot?  I'd have
> thought that those events simply aren't occurring, and that the patch
> has no effect.  Confused - please explain further.
These events can come during the CPU hotplug(offline). Below is the
complete patch. Also attaching it in case some email format screw
up.

-----------------------------------------------
>From b99271ce43cc82cda28447444004933d0f218ee3 Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Tue, 3 Aug 2010 12:58:22 +0530
Subject: [PATCH] console: flush delayed log 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.
This is true even when CPU is getting hot-plugged out(offline) so
need to add additional hotplug events.

The issue was seen on 2.6.34.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
---
 kernel/printk.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 444b770..a884d81 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,40 @@ void resume_console(void)
 }
 
 /**
+ * console_cpu_notify - print deferred console messages after CPU hotplug
+ *
+ * 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 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:
+		if (try_acquire_console_sem() == 0)
+			release_console_sem();
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata console_nb = {
+	.notifier_call		= console_cpu_notify,
+};
+
+static int __init console_notifier_init(void)
+{
+	register_cpu_notifier(&console_nb);
+	return 0;
+}
+late_initcall(console_notifier_init);
+
+/**
  * acquire_console_sem - lock the console system for exclusive use.
  *
  * Acquires a semaphore which guarantees that the caller has
-- 
1.6.0.4
-----------------------------------------------



[-- Attachment #2: console-flush-delayed-log-messages-from-cpu-hotplug.patch --]
[-- Type: application/octet-stream, Size: 2844 bytes --]

From b99271ce43cc82cda28447444004933d0f218ee3 Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Tue, 3 Aug 2010 12:58:22 +0530
Subject: [PATCH] console: flush delayed log 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.
This is true even when CPU is getting hot-plugged out(offline) so
need to add additional hotplug events.

The issue was seen on 2.6.34.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
---
 kernel/printk.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 444b770..a884d81 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,40 @@ void resume_console(void)
 }
 
 /**
+ * console_cpu_notify - print deferred console messages after CPU hotplug
+ *
+ * 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 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:
+		if (try_acquire_console_sem() == 0)
+			release_console_sem();
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata console_nb = {
+	.notifier_call		= console_cpu_notify,
+};
+
+static int __init console_notifier_init(void)
+{
+	register_cpu_notifier(&console_nb);
+	return 0;
+}
+late_initcall(console_notifier_init);
+
+/**
  * acquire_console_sem - lock the console system for exclusive use.
  *
  * Acquires a semaphore which guarantees that the caller has
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-03  7:33   ` Shilimkar, Santosh
@ 2010-08-03 15:24     ` Randy Dunlap
  2010-08-03 16:53       ` Shilimkar, Santosh
  2010-08-03 23:59     ` Andrew Morton
  1 sibling, 1 reply; 10+ messages in thread
From: Randy Dunlap @ 2010-08-03 15:24 UTC (permalink / raw)
  To: Shilimkar, Santosh
  Cc: Andrew Morton, Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux

On Tue, 3 Aug 2010 13:03:25 +0530 Shilimkar, Santosh wrote:

> -----------------------------------------------
> From b99271ce43cc82cda28447444004933d0f218ee3 Mon Sep 17 00:00:00 2001
> From: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Date: Tue, 3 Aug 2010 12:58:22 +0530
> Subject: [PATCH] console: flush delayed log 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.
> This is true even when CPU is getting hot-plugged out(offline) so
> need to add additional hotplug events.
> 
> The issue was seen on 2.6.34.
> 
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
> ---
>  kernel/printk.c |   36 ++++++++++++++++++++++++++++++++++++
>  1 files changed, 36 insertions(+), 0 deletions(-)
> 
> diff --git a/kernel/printk.c b/kernel/printk.c
> index 444b770..a884d81 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,40 @@ void resume_console(void)
>  }
>  
>  /**
> + * console_cpu_notify - print deferred console messages after CPU hotplug
> + *
> + * 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 and ensures that any such output
> + * gets printed.
> + */
> +static int __cpuinit console_cpu_notify(struct notifier_block *self,
> +	unsigned long action, void *hcpu)
> +{


kernel-doc notation should include function parameters also, please.

---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***

^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-03 15:24     ` Randy Dunlap
@ 2010-08-03 16:53       ` Shilimkar, Santosh
  0 siblings, 0 replies; 10+ messages in thread
From: Shilimkar, Santosh @ 2010-08-03 16:53 UTC (permalink / raw)
  To: Randy Dunlap
  Cc: Andrew Morton, Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux

[-- Attachment #1: Type: text/plain, Size: 4163 bytes --]

> -----Original Message-----
> From: Randy Dunlap [mailto:rdunlap@xenotime.net]
> Sent: Tuesday, August 03, 2010 8:55 PM
> To: Shilimkar, Santosh
> Cc: Andrew Morton; Kevin Cernekee; linux-kernel@vger.kernel.org; Russell
> King - ARM Linux
> Subject: Re: Additional fix : (was [v2]printk: fix delayed messages from
> CPU hotplug events)
> 
> On Tue, 3 Aug 2010 13:03:25 +0530 Shilimkar, Santosh wrote:
> 

<snip>

> >  /**
> > + * console_cpu_notify - print deferred console messages after CPU
> hotplug
> > + *
> > + * 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 and ensures that any such output
> > + * gets printed.
> > + */
> > +static int __cpuinit console_cpu_notify(struct notifier_block *self,
> > +	unsigned long action, void *hcpu)
> > +{
> 
> 
> kernel-doc notation should include function parameters also, please.
> 
Sure. Here is an updated version.
--------------------------------------------
>From 127c0ea58982762ad194f22d1281baaf529c9cbc Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Tue, 3 Aug 2010 12:58:22 +0530
Subject: [PATCH v2] console: flush delayed log 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.
This is true even when CPU is getting hot-plugged out(offline) so
need to add additional hotplug events.

The issue was seen on 2.6.34.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
---
 kernel/printk.c |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 444b770..c145cef 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,43 @@ void resume_console(void)
 }
 
 /**
+ * console_cpu_notify - print deferred console messages after CPU hotplug
+ * @self: pointer to notfier block
+ * @action: cpu-hotplug events
+ * @hcpu: void poniter to pass any data
+ *
+ * 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 goes offline 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:
+		if (try_acquire_console_sem() == 0)
+			release_console_sem();
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata console_nb = {
+	.notifier_call		= console_cpu_notify,
+};
+
+static int __init console_notifier_init(void)
+{
+	register_cpu_notifier(&console_nb);
+	return 0;
+}
+late_initcall(console_notifier_init);
+
+/**
  * acquire_console_sem - lock the console system for exclusive use.
  *
  * Acquires a semaphore which guarantees that the caller has
-- 
1.6.0.4


[-- Attachment #2: console-flush-delayed-log-messages-from-cpu-hotplug_v2.patch --]
[-- Type: application/octet-stream, Size: 2975 bytes --]

From 127c0ea58982762ad194f22d1281baaf529c9cbc Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Tue, 3 Aug 2010 12:58:22 +0530
Subject: [PATCH v2] console: flush delayed log 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.
This is true even when CPU is getting hot-plugged out(offline) so
need to add additional hotplug events.

The issue was seen on 2.6.34.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
---
 kernel/printk.c |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 444b770..c145cef 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,43 @@ void resume_console(void)
 }
 
 /**
+ * console_cpu_notify - print deferred console messages after CPU hotplug
+ * @self: pointer to notfier block
+ * @action: cpu-hotplug events
+ * @hcpu: void poniter to pass any data
+ *
+ * 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 goes offline 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:
+		if (try_acquire_console_sem() == 0)
+			release_console_sem();
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata console_nb = {
+	.notifier_call		= console_cpu_notify,
+};
+
+static int __init console_notifier_init(void)
+{
+	register_cpu_notifier(&console_nb);
+	return 0;
+}
+late_initcall(console_notifier_init);
+
+/**
  * acquire_console_sem - lock the console system for exclusive use.
  *
  * Acquires a semaphore which guarantees that the caller has
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-03  7:33   ` Shilimkar, Santosh
  2010-08-03 15:24     ` Randy Dunlap
@ 2010-08-03 23:59     ` Andrew Morton
  2010-08-04  3:30       ` Paul Mundt
  1 sibling, 1 reply; 10+ messages in thread
From: Andrew Morton @ 2010-08-03 23:59 UTC (permalink / raw)
  To: Shilimkar, Santosh
  Cc: Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux, Paul Mundt

On Tue, 3 Aug 2010 13:03:25 +0530
"Shilimkar, Santosh" <santosh.shilimkar@ti.com> wrote:

> > thought that those events simply aren't occurring, and that the patch
> > has no effect.  Confused - please explain further.
> These events can come during the CPU hotplug(offline). Below is the
> complete patch. Also attaching it in case some email format screw
> up.
> 
> -----------------------------------------------
> >From b99271ce43cc82cda28447444004933d0f218ee3 Mon Sep 17 00:00:00 2001
> From: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Date: Tue, 3 Aug 2010 12:58:22 +0530
> Subject: [PATCH] console: flush delayed log 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.
> This is true even when CPU is getting hot-plugged out(offline) so
> need to add additional hotplug events.
> 
> The issue was seen on 2.6.34.
> 
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Signed-off-by: Kevin Cernekee <cernekee@gmail.com>

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.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-03 23:59     ` Andrew Morton
@ 2010-08-04  3:30       ` Paul Mundt
  2010-08-04 13:51         ` Ralf Baechle
  0 siblings, 1 reply; 10+ messages in thread
From: Paul Mundt @ 2010-08-04  3:30 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Shilimkar, Santosh, Kevin Cernekee, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux, Ralf Baechle

On Tue, Aug 03, 2010 at 04:59:26PM -0700, Andrew Morton wrote:
> On Tue, 3 Aug 2010 13:03:25 +0530
> "Shilimkar, Santosh" <santosh.shilimkar@ti.com> wrote:
> 
> > > thought that those events simply aren't occurring, and that the patch
> > > has no effect.  Confused - please explain further.
> > These events can come during the CPU hotplug(offline). Below is the
> > complete patch. Also attaching it in case some email format screw
> > up.
> > 
> > -----------------------------------------------
> > >From b99271ce43cc82cda28447444004933d0f218ee3 Mon Sep 17 00:00:00 2001
> > From: Santosh Shilimkar <santosh.shilimkar@ti.com>
> > Date: Tue, 3 Aug 2010 12:58:22 +0530
> > Subject: [PATCH] console: flush delayed log 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.
> > This is true even when CPU is getting hot-plugged out(offline) so
> > need to add additional hotplug events.
> > 
> > The issue was seen on 2.6.34.
> > 
> > Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> > Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
> 
> 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.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-04  3:30       ` Paul Mundt
@ 2010-08-04 13:51         ` Ralf Baechle
  2010-08-04 15:23           ` Ralf Baechle
  0 siblings, 1 reply; 10+ messages in thread
From: Ralf Baechle @ 2010-08-04 13:51 UTC (permalink / raw)
  To: Paul Mundt
  Cc: Andrew Morton, Shilimkar, Santosh, Kevin Cernekee,
	linux-kernel@vger.kernel.org, Russell King - ARM Linux

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@gmail.com>
AuthorDate: Thu Jun 3 22:11:25 2010 -0700
Commit:     Ralf Baechle <ralf@linux-mips.org>
CommitDate: Mon Aug 2 14:00:10 2010 +0100

Will update the patch.

  Ralf

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events)
  2010-08-04 13:51         ` Ralf Baechle
@ 2010-08-04 15:23           ` Ralf Baechle
  0 siblings, 0 replies; 10+ messages in thread
From: Ralf Baechle @ 2010-08-04 15:23 UTC (permalink / raw)
  To: Paul Mundt
  Cc: Andrew Morton, Shilimkar, Santosh, Kevin Cernekee,
	linux-kernel@vger.kernel.org, Russell King - ARM Linux,
	linux-mips

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

^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-08-04 15:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-29  8:52 Additional fix : (was [v2]printk: fix delayed messages from CPU hotplug events) Shilimkar, Santosh
2010-08-02 22:44 ` Andrew Morton
2010-08-03  7:33   ` Shilimkar, Santosh
2010-08-03 15:24     ` Randy Dunlap
2010-08-03 16:53       ` Shilimkar, Santosh
2010-08-03 23:59     ` Andrew Morton
2010-08-04  3:30       ` Paul Mundt
2010-08-04 13:51         ` Ralf Baechle
2010-08-04 15:23           ` Ralf Baechle
  -- strict thread matches above, loose matches on Subject: below --
2010-07-01  4:27 Shilimkar, Santosh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox