Report that kernel is tainted if there were an OOPS before (v3)
Subsystems (11)
PATCH 1/1 Report that kernel is tainted if there were an OOPS before (v3)
If the kernel OOPSed or BUGed then it probably should be considered as tainted. Thus, all subsequent OOPSes and SysRq dumps will report the tainted kernel. This saves a lot of time explaining oddities in the calltraces.
The previous version was buggy and reported the kernel to be tainted at the very first oops as was noticed by Dave Jones in the report from Antonino Daplas.
Compilation is checked for i386, x86_64 and ia64 since I have no all the others at hands :)
---
Documentation/oops-tracing.txt +2 -0
@@ -237,6 +237,8 @@ characters, each representing a particul 7: 'U' if a user or user application specifically requested that the Tainted flag be set, ' ' otherwise. + 8: 'D' if the kernel has died recently, i.e. there was an OOPS or BUG. + The primary reason for the 'Tainted: ' string is to tell kernel debuggers if this is a clean kernel or if anything unusual has occurred. Tainting is permanent: even if an offending module is
arch/alpha/kernel/traps.c +1 -0
@@ -184,6 +184,7 @@ die_if_kernel(char * str, struct pt_regs#endif printk ("%s(%d): %s %ld\n" , current->comm, current->pid, str, err);dik_show_regs (regs, r9_15); +add_taint (TAINT_DIE );dik_show_trace ((unsigned long *)(regs+1 ));dik_show_code ((unsigned int *)regs->pc);
arch/arm/kernel/traps.c +1 -0
@@ -237,6 +237,7 @@ NORET_TYPE void die(const char *str, strbust_spinlocks (1 );__die (str, err, thread, regs);bust_spinlocks (0 ); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (panic_on_oops)
arch/arm26/kernel/traps.c +1 -0
@@ -185,6 +185,7 @@ NORET_TYPE void die(const char *str, strprintk ("Internal error: %s: %x\n" , str, err);printk ("CPU: %d\n" ,smp_processor_id ());show_regs (regs); +add_taint (TAINT_DIE );printk ("Process %s (pid: %d, stack limit = 0x%p)\n" , current->comm, current->pid,end_of_stack (tsk));
arch/avr32/kernel/traps.c +1 -0
@@ -56,6 +56,7 @@ void NORET_TYPE die(const char *str, strshow_regs_log_lvl (regs,KERN_EMERG );show_stack_log_lvl (current, regs->sp, regs,KERN_EMERG );bust_spinlocks (0 ); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (in_interrupt ())
arch/i386/kernel/traps.c +1 -0
@@ -506,6 +506,7 @@ void die(const char * str, struct pt_regbust_spinlocks (0 ); die.lock_owner =-1 ; +add_taint (TAINT_DIE );spin_unlock_irqrestore (&die.lock, flags);if (!regs)
arch/ia64/kernel/traps.c +1 -0
@@ -69,6 +69,7 @@ die (const char *str, struct pt_regs *rebust_spinlocks (0 ); die.lock_owner =-1 ; +add_taint (TAINT_DIE );spin_unlock_irq (&die.lock);if (panic_on_oops)
arch/m68k/kernel/traps.c +1 -0
@@ -1170,6 +1170,7 @@ void die_if_kernel (char *str, struct ptconsole_verbose ();printk ("%s: %08x\n" ,str,nr);show_registers (fp); +add_taint (TAINT_DIE );do_exit (SIGSEGV ); }
arch/m68knommu/kernel/traps.c +1 -0
@@ -83,6 +83,7 @@ void die_if_kernel(char *str, struct pt_printk (KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n" , current->comm, current->pid,PAGE_SIZE +(unsigned long )current);show_stack (NULL , (unsigned long *)fp); +add_taint (TAINT_DIE );do_exit (SIGSEGV ); }
arch/mips/kernel/traps.c +1 -0
@@ -325,6 +325,7 @@ NORET_TYPE void ATTRIB_NORET die(const c#endif /* CONFIG_MIPS_MT_SMTC */ printk ("%s[#%d]:\n" , str, ++die_counter);show_registers (regs); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (in_interrupt ())
arch/powerpc/kernel/traps.c +1 -0
@@ -149,6 +149,7 @@ int die(const char *str, struct pt_regsbust_spinlocks (0 ); die.lock_owner =-1 ; +add_taint (TAINT_DIE );spin_unlock_irqrestore (&die.lock, flags); if (kexec_should_crash(current) ||
arch/ppc/kernel/traps.c +1 -0
@@ -92,6 +92,7 @@ int die(const char * str, struct pt_regsif (nl)printk ("\n" );show_regs (fp); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);/* do_exit() should take care of panic'ing from an interrupt * context so we don't handle it here
arch/s390/kernel/traps.c +1 -0
@@ -260,6 +260,7 @@ void die(const char * str, struct pt_regprintk ("%s: %04lx [#%d]\n" , str, err &0xffff , ++die_counter);show_regs (regs);bust_spinlocks (0 ); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (in_interrupt ())panic ("Fatal exception in interrupt" );
arch/sh/kernel/traps.c +1 -0
@@ -101,6 +101,7 @@ void die(const char * str, struct pt_reg (unsigned long)task_stack_page(current));bust_spinlocks (0 ); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (kexec_should_crash (current))
arch/sparc/kernel/traps.c +1 -0
@@ -101,6 +101,7 @@ void die_if_kernel(char *str, struct pt_printk ("%s(%d): %s [#%d]\n" , current->comm, current->pid, str, ++die_counter);show_regs (regs); +add_taint (TAINT_DIE ); __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE;
arch/sparc64/kernel/traps.c +1 -0
@@ -2225,6 +2225,7 @@ void die_if_kernel(char *str, struct pt_notify_die (DIE_OOPS , str, regs,0 ,255 ,SIGSEGV ); __asm__ __volatile__("flushw" );__show_regs (regs); +add_taint (TAINT_DIE );if (regs->tstate &TSTATE_PRIV ) {struct reg_window *rw = (struct reg_window *) (regs->u_regs[UREG_FP ] +STACK_BIAS );
arch/x86_64/kernel/traps.c +1 -0
@@ -589,6 +589,7 @@ void __kprobes __die(const char * str, sprintk ("\n" );notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV );show_registers (regs); +add_taint (TAINT_DIE );/* Executive summary in case the oops scrolled away */ printk (KERN_ALERT "RIP " );printk_address (regs->rip);
arch/xtensa/kernel/traps.c +1 -0
@@ -482,6 +482,7 @@ void die(const char * str, struct pt_regif (!user_mode (regs))show_stack (NULL , (unsigned long *)regs->areg[1 ]); +add_taint (TAINT_DIE );spin_unlock_irq (&die_lock);if (in_interrupt ())
include/linux/kernel.h +1 -0
@@ -210,6 +210,7 @@ extern enum system_states {#define TAINT_MACHINE_CHECK (1<<4)#define TAINT_BAD_PAGE (1<<5)#define TAINT_USER (1<<6) +#define TAINT_DIE (1<<7)extern void dump_stack (void )__cold ;
kernel/panic.c +3 -2
@@ -159,14 +159,15 @@ const char *print_tainted(void) {static char buf[20 ];if (tainted) { -snprintf (buf,sizeof (buf),"Tainted: %c%c%c%c%c%c%c" , +snprintf (buf,sizeof (buf),"Tainted: %c%c%c%c%c%c%c%c" , tainted &TAINT_PROPRIETARY_MODULE ?'P' :'G' , tainted &TAINT_FORCED_MODULE ?'F' :' ' , tainted &TAINT_UNSAFE_SMP ?'S' :' ' , tainted &TAINT_FORCED_RMMOD ?'R' :' ' , tainted &TAINT_MACHINE_CHECK ?'M' :' ' , tainted &TAINT_BAD_PAGE ?'B' :' ' , - tainted &TAINT_USER ?'U' :' ' ); + tainted &TAINT_USER ?'U' :' ' , + tainted &TAINT_DIE ?'D' :' ' ); }else snprintf (buf,sizeof (buf),"Not tainted" );
Quoted 9 lines · On Thu, 07 Jun 2007 16:51:50 +0400 Pavel Emelianov wrote:
If the kernel OOPSed or BUGed then it probably should be considered as tainted. Thus, all subsequent OOPSes and SysRq dumps will report the tainted kernel. This saves a lot of time explaining oddities in the calltraces.
The previous version was buggy and reported the kernel to be tainted at the very first oops as was noticed by Dave Jones in the report from Antonino Daplas.
Quoted 5 lines
Compilation is checked for i386,
x86_64and ia64 since I have no all the others at hands :)Signed-off-by Pavel Emelianov <[email protected]>Cc Randy Dunlap <[email protected]>
I would change the doc. comment below:
Documentation/oops-tracing.txt characters, each representing a particul · line 240
Quoted 11 lines
---
Documentation/oops-tracing.txt +1
-0@@ -237,6 +237,8 @@ characters, each representing a particul 7: 'U' if a user or user application specifically requested that the Tainted flag be set, ' ' otherwise. + 8: 'D' if the kernel has died recently, i.e. there was an OOPS or BUG.
something like:
+ 8: 'D' if the kernel has already died, i.e. there was a prior OOPS or BUG.
Documentation/oops-tracing.txt characters, each representing a particul · line 244
Quoted 4 lines
Documentation/oops-tracing.txt +1
-0+ The primary reason for the 'Tainted: ' string is to tell kernel debuggers if this is a clean kernel or if anything unusual has occurred. Tainting is permanent: even if an offending module is
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***