Patch from "Randy.Dunlap" Adds an oops counter to the oops messages, such as: Oops: 0002 [#2] So we can tell whether oops reports refer to the first oops, or to some less-interesting followon oops. arch/arm/kernel/traps.c | 3 ++- arch/i386/kernel/traps.c | 4 +++- arch/ia64/kernel/traps.c | 4 +++- arch/mips/kernel/traps.c | 3 ++- arch/mips64/kernel/traps.c | 3 ++- arch/ppc/kernel/traps.c | 3 ++- arch/ppc64/kernel/traps.c | 3 ++- arch/s390/kernel/traps.c | 3 ++- arch/s390x/kernel/traps.c | 3 ++- arch/sh/kernel/traps.c | 3 ++- arch/x86_64/kernel/traps.c | 3 ++- 11 files changed, 24 insertions(+), 11 deletions(-) diff -puN arch/arm/kernel/traps.c~oops-counters arch/arm/kernel/traps.c --- 25/arch/arm/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/arm/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -208,12 +208,13 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) { struct task_struct *tsk = current; + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); bust_spinlocks(1); - printk("Internal error: %s: %x\n", str, err); + printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); print_modules(); printk("CPU: %d\n", smp_processor_id()); show_regs(regs); diff -puN arch/i386/kernel/traps.c~oops-counters arch/i386/kernel/traps.c --- 25/arch/i386/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/i386/kernel/traps.c 2003-03-13 02:38:18.000000000 -0800 @@ -265,11 +265,13 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED void die(const char * str, struct pt_regs * regs, long err) { + static int die_counter; + console_verbose(); spin_lock_irq(&die_lock); bust_spinlocks(1); handle_BUG(regs); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); CHK_REMOTE_DEBUG(1,SIGTRAP,err,regs,) show_registers(regs); bust_spinlocks(0); diff -puN arch/ia64/kernel/traps.c~oops-counters arch/ia64/kernel/traps.c --- 25/arch/ia64/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/ia64/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -101,6 +101,7 @@ die (const char *str, struct pt_regs *re .lock_owner = -1, .lock_owner_depth = 0 }; + static int die_counter; if (die.lock_owner != smp_processor_id()) { console_verbose(); @@ -111,7 +112,8 @@ die (const char *str, struct pt_regs *re } if (++die.lock_owner_depth < 3) { - printk("%s[%d]: %s %ld\n", current->comm, current->pid, str, err); + printk("%s[%d]: %s %ld [%d]\n", + current->comm, current->pid, str, err, ++die_counter); show_regs(regs); } else printk(KERN_ERR "Recursive die() failure, output suppressed\n"); diff -puN arch/mips64/kernel/traps.c~oops-counters arch/mips64/kernel/traps.c --- 25/arch/mips64/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/mips64/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -161,12 +161,13 @@ spinlock_t die_lock; void die(const char * str, struct pt_regs * regs, unsigned long err) { + static int die_counter; if (user_mode(regs)) /* Just return if in user mode. */ return; console_verbose(); spin_lock_irq(&die_lock); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); show_regs(regs); printk("Process %s (pid: %d, stackpage=%08lx)\n", current->comm, current->pid, (unsigned long) current); diff -puN arch/mips/kernel/traps.c~oops-counters arch/mips/kernel/traps.c --- 25/arch/mips/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/mips/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -191,12 +191,13 @@ spinlock_t die_lock; extern void __die(const char * str, struct pt_regs * regs, const char *where, unsigned long line) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); printk("%s", str); if (where) printk(" in %s, line %ld", where, line); - printk(":\n"); + printk("[#%d]:\n", ++die_counter); show_regs(regs); printk("Process %s (pid: %d, stackpage=%08lx)\n", current->comm, current->pid, (unsigned long) current); diff -puN arch/ppc64/kernel/traps.c~oops-counters arch/ppc64/kernel/traps.c --- 25/arch/ppc64/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -62,10 +62,11 @@ static spinlock_t die_lock = SPIN_LOCK_U void die(const char *str, struct pt_regs *regs, long err) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); bust_spinlocks(1); - printk("Oops: %s, sig: %ld\n", str, err); + printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter); show_regs(regs); bust_spinlocks(0); spin_unlock_irq(&die_lock); diff -puN arch/ppc/kernel/traps.c~oops-counters arch/ppc/kernel/traps.c --- 25/arch/ppc/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/ppc/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -86,13 +86,14 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED void die(const char * str, struct pt_regs * fp, long err) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); #ifdef CONFIG_PMAC_BACKLIGHT set_backlight_enable(1); set_backlight_level(BACKLIGHT_MAX); #endif - printk("Oops: %s, sig: %ld\n", str, err); + printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter); show_regs(fp); spin_unlock_irq(&die_lock); /* do_exit() should take care of panic'ing from an interrupt diff -puN arch/s390/kernel/traps.c~oops-counters arch/s390/kernel/traps.c --- 25/arch/s390/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/s390/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -226,10 +226,11 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED void die(const char * str, struct pt_regs * regs, long err) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); bust_spinlocks(1); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); show_regs(regs); bust_spinlocks(0); spin_unlock_irq(&die_lock); diff -puN arch/s390x/kernel/traps.c~oops-counters arch/s390x/kernel/traps.c --- 25/arch/s390x/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/s390x/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -228,10 +228,11 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED void die(const char * str, struct pt_regs * regs, long err) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); bust_spinlocks(1); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); show_regs(regs); bust_spinlocks(0); spin_unlock_irq(&die_lock); diff -puN arch/sh/kernel/traps.c~oops-counters arch/sh/kernel/traps.c --- 25/arch/sh/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/sh/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -58,9 +58,10 @@ spinlock_t die_lock; void die(const char * str, struct pt_regs * regs, long err) { + static int die_counter; console_verbose(); spin_lock_irq(&die_lock); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); show_regs(regs); spin_unlock_irq(&die_lock); do_exit(SIGSEGV); diff -puN arch/x86_64/kernel/traps.c~oops-counters arch/x86_64/kernel/traps.c --- 25/arch/x86_64/kernel/traps.c~oops-counters 2003-03-13 02:36:23.000000000 -0800 +++ 25-akpm/arch/x86_64/kernel/traps.c 2003-03-13 02:36:23.000000000 -0800 @@ -325,11 +325,12 @@ void die(const char * str, struct pt_reg { int cpu; struct die_args args = { regs, str, err }; + static int die_counter; console_verbose(); notifier_call_chain(&die_chain, DIE_DIE, &args); bust_spinlocks(1); handle_BUG(regs); - printk("%s: %04lx\n", str, err & 0xffff); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); cpu = safe_smp_processor_id(); /* racy, but better than risking deadlock. */ local_irq_disable(); _