Patchwork [1/1] Make sure that any oops is flushed to the mtdoops console

login
register
mail settings
Submitter Andrew Morton
Date Oct. 30, 2008, 8:17 p.m.
Message ID <20081030131734.c74e614d.akpm@linux-foundation.org>
Download mbox | patch
Permalink /patch/6593/
State New, archived
Headers show

Comments

Andrew Morton - Oct. 30, 2008, 8:17 p.m.
On Wed, 22 Oct 2008 18:16:28 +0300
Viktor Rosendahl <viktor.rosendahl@nokia.com> wrote:

> This used to work unpatched with older kernels, during the development phase
> of mtdoops. Before commit e3e8a75d2acfc61ebf25524666a0a2c6abb0620c a space was
> printed with console_loglevel set to 15, which probably flushed the oops
> message as a side effect.
> 
> This is another patch from the Nokia N810 kernel.
> 
> Signed-off-by: Viktor Rosendahl <viktor.rosendahl@nokia.com>
> ---
>  lib/bust_spinlocks.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> diff --git a/lib/bust_spinlocks.c b/lib/bust_spinlocks.c
> index 486da62..9681d54 100644
> --- a/lib/bust_spinlocks.c
> +++ b/lib/bust_spinlocks.c
> @@ -12,6 +12,7 @@
>  #include <linux/tty.h>
>  #include <linux/wait.h>
>  #include <linux/vt_kern.h>
> +#include <linux/console.h>
>  
>  
>  void __attribute__((weak)) bust_spinlocks(int yes)
> @@ -22,6 +23,7 @@ void __attribute__((weak)) bust_spinlocks(int yes)
>  #ifdef CONFIG_VT
>  		unblank_screen();
>  #endif
> +		console_unblank();
>  		if (--oops_in_progress == 0)
>  			wake_up_klogd();
>  	}

That looks logical.  From my reading we can now remove that
unblank_screen(), because the console_unblank() will call
vt_console_driver.unblank() for us?
Viktor Rosendahl - Oct. 31, 2008, 1:05 p.m.
On Thu, 2008-10-30 at 13:17 -0700, ext Andrew Morton wrote: 
> On Wed, 22 Oct 2008 18:16:28 +0300
> Viktor Rosendahl <viktor.rosendahl@nokia.com> wrote:
<clip> 
> >  void __attribute__((weak)) bust_spinlocks(int yes)
> > @@ -22,6 +23,7 @@ void __attribute__((weak)) bust_spinlocks(int yes)
> >  #ifdef CONFIG_VT
> >  		unblank_screen();
> >  #endif
> > +		console_unblank();
> >  		if (--oops_in_progress == 0)
> >  			wake_up_klogd();
> >  	}
> 
> That looks logical.  From my reading we can now remove that
> unblank_screen(), because the console_unblank() will call
> vt_console_driver.unblank() for us?

For some reason, we did not think about it here when the N810 kernel was
fixed. It looks good to me but if you do it, then there will be a slight
difference in behavior, since console_unblank() will call
vt_console_driver.unblank() only if the console_sem can be acquired,
otherwise it just returns without doing anything.

Maybe console_unblank() should be changed to not care too much about the
console_sem if an oops is in progress? 

best regards,

Viktor
Andrew Morton - Nov. 5, 2008, midnight
On Fri, 31 Oct 2008 15:05:28 +0200
Viktor Rosendahl <Viktor.Rosendahl@nokia.com> wrote:

> On Thu, 2008-10-30 at 13:17 -0700, ext Andrew Morton wrote: 
> > On Wed, 22 Oct 2008 18:16:28 +0300
> > Viktor Rosendahl <viktor.rosendahl@nokia.com> wrote:
> <clip> 
> > >  void __attribute__((weak)) bust_spinlocks(int yes)
> > > @@ -22,6 +23,7 @@ void __attribute__((weak)) bust_spinlocks(int yes)
> > >  #ifdef CONFIG_VT
> > >  		unblank_screen();
> > >  #endif
> > > +		console_unblank();
> > >  		if (--oops_in_progress == 0)
> > >  			wake_up_klogd();
> > >  	}
> > 
> > That looks logical.  From my reading we can now remove that
> > unblank_screen(), because the console_unblank() will call
> > vt_console_driver.unblank() for us?
> 
> For some reason, we did not think about it here when the N810 kernel was
> fixed. It looks good to me but if you do it, then there will be a slight
> difference in behavior, since console_unblank() will call
> vt_console_driver.unblank() only if the console_sem can be acquired,
> otherwise it just returns without doing anything.
> 
> Maybe console_unblank() should be changed to not care too much about the
> console_sem if an oops is in progress? 
> 

hm, yeah.  Things get messy if we take an oops with console_sem held.

I'll drop the cleanup patch - I don't have time to think about and test
anything useful like that :(

Patch

--- a/lib/bust_spinlocks.c~oops-handling-ensure-that-any-oops-is-flushed-to-the-mtdoops-console-fix
+++ a/lib/bust_spinlocks.c
@@ -11,7 +11,6 @@ 
 #include <linux/spinlock.h>
 #include <linux/tty.h>
 #include <linux/wait.h>
-#include <linux/vt_kern.h>
 #include <linux/console.h>
 
 
@@ -20,9 +19,6 @@  void __attribute__((weak)) bust_spinlock
 	if (yes) {
 		++oops_in_progress;
 	} else {
-#ifdef CONFIG_VT
-		unblank_screen();
-#endif
 		console_unblank();
 		if (--oops_in_progress == 0)
 			wake_up_klogd();