[RFC] [PATCH] export die_counter as /proc/sys/kernel/oops-counter

From: Akinobu Mita
Date: Tue Nov 07 2006 - 03:57:21 EST


The architecture specific function die() stores the value of
how many times oops happened into its local static variable
die_counter.

This patch exports the die_counter as /proc/sys/kernel/oops-counter.

Example usage: Display oops-counter in Tray Icon

#! /usr/bin/python
import pygtk
pygtk.require("2.0")
import gtk
import egg.trayicon
import gobject

def oops_count():
return int(open("/proc/sys/kernel/oops-counter", "r").readline())

def update_oops_count(t):
t.get_children()[0].set_text("Oops: " + str(oops_count()))
gobject.timeout_add(1000, update_oops_count, t)

t = egg.trayicon.TrayIcon("OopsCounter")
t.add(gtk.Label("Oops: " + str(oops_count())))
gobject.timeout_add(1000, update_oops_count, t)
t.show_all()
gtk.main()


Signed-off-by: Akinobu Mita <akinobu.mita@xxxxxxxxx>

Documentation/sysctl/kernel.txt | 7 +++++++
arch/i386/kernel/traps.c | 3 +--
arch/x86_64/kernel/traps.c | 3 +--
include/linux/kernel.h | 1 +
include/linux/sysctl.h | 1 +
kernel/panic.c | 2 ++
kernel/sysctl.c | 8 ++++++++
7 files changed, 21 insertions(+), 4 deletions(-)

Index: 2.6-git/include/linux/kernel.h
===================================================================
--- 2.6-git.orig/include/linux/kernel.h
+++ 2.6-git/include/linux/kernel.h
@@ -193,6 +193,7 @@ extern int panic_on_unrecovered_nmi;
extern int tainted;
extern const char *print_tainted(void);
extern void add_taint(unsigned);
+extern int oops_counter;

/* Values used for system_state */
extern enum system_states {
Index: 2.6-git/kernel/panic.c
===================================================================
--- 2.6-git.orig/kernel/panic.c
+++ 2.6-git/kernel/panic.c
@@ -22,6 +22,7 @@

int panic_on_oops;
int tainted;
+int oops_counter;
static int pause_on_oops;
static int pause_on_oops_flag;
static DEFINE_SPINLOCK(pause_on_oops_lock);
@@ -258,6 +259,7 @@ int oops_may_print(void)
*/
void oops_enter(void)
{
+ ++oops_counter;
debug_locks_off(); /* can't trust the integrity of the kernel anymore */
do_oops_enter_exit();
}
Index: 2.6-git/arch/i386/kernel/traps.c
===================================================================
--- 2.6-git.orig/arch/i386/kernel/traps.c
+++ 2.6-git/arch/i386/kernel/traps.c
@@ -452,7 +452,6 @@ void die(const char * str, struct pt_reg
.lock_owner = -1,
.lock_owner_depth = 0
};
- static int die_counter;
unsigned long flags;

oops_enter();
@@ -473,7 +472,7 @@ void die(const char * str, struct pt_reg
unsigned short ss;

handle_BUG(regs);
- printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
+ printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, oops_counter);
#ifdef CONFIG_PREEMPT
printk(KERN_EMERG "PREEMPT ");
nl = 1;
Index: 2.6-git/arch/x86_64/kernel/traps.c
===================================================================
--- 2.6-git.orig/arch/x86_64/kernel/traps.c
+++ 2.6-git/arch/x86_64/kernel/traps.c
@@ -579,8 +579,7 @@ void __kprobes oops_end(unsigned long fl

void __kprobes __die(const char * str, struct pt_regs * regs, long err)
{
- static int die_counter;
- printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff,++die_counter);
+ printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff, oops_counter);
#ifdef CONFIG_PREEMPT
printk("PREEMPT ");
#endif
Index: 2.6-git/include/linux/sysctl.h
===================================================================
--- 2.6-git.orig/include/linux/sysctl.h
+++ 2.6-git/include/linux/sysctl.h
@@ -160,6 +160,7 @@ enum
KERN_MAX_LOCK_DEPTH=74,
KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
+ KERN_OOPS_COUNTER=77, /* int: oops counter */
};


Index: 2.6-git/kernel/sysctl.c
===================================================================
--- 2.6-git.orig/kernel/sysctl.c
+++ 2.6-git/kernel/sysctl.c
@@ -768,6 +768,14 @@ static ctl_table kern_table[] = {
.proc_handler = &proc_dointvec,
},
#endif
+ {
+ .ctl_name = KERN_OOPS_COUNTER,
+ .procname = "oops-counter",
+ .data = &oops_counter,
+ .maxlen = sizeof(int),
+ .mode = 0444,
+ .proc_handler = &proc_dointvec,
+ },

{ .ctl_name = 0 }
};
Index: 2.6-git/Documentation/sysctl/kernel.txt
===================================================================
--- 2.6-git.orig/Documentation/sysctl/kernel.txt
+++ 2.6-git/Documentation/sysctl/kernel.txt
@@ -32,6 +32,7 @@ show up in /proc/sys/kernel:
- msgmax
- msgmnb
- msgmni
+- oops-counter
- osrelease
- ostype
- overflowgid
@@ -170,6 +171,12 @@ This flag controls the L2 cache of G3 pr

==============================================================

+oops-counter:
+
+The number of oops-counter shows how many times oops happened.
+
+==============================================================
+
osrelease, ostype & version:

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