[PATCH] all crashes from kerneloops_regression_test() in kernel-crasher

Manoj Iyer manoj.iyer at canonical.com
Fri Mar 27 20:13:59 UTC 2009


According to Arjan, all crashes that comes from function 
kerneloops_regression_test() will be filtered and removed from 
kernelopps.org. I modified crasher so that EIP points to 
kerneloops_regression_test(). I tested this on my samsung netbook.

[  416.394346] EIP is at kerneloops_regression_test+0x80/0x90 [crasher]
[  416.394356] EAX: 00000001 EBX: f7e792a0 ECX: ffffffff EDX: 05042000
[  416.394366] ESI: f6f127c0 EDI: f338de00 EBP: ee955f24 ESP: ee955f14
[  416.394376]  DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
[  416.394387] Process bash (pid: 4712, ti=ee954000 task=ee8fe480 
task.ti=ee954000)
[  416.394396] Stack:
[  416.394402]  ee955f24 c0500ae1 f7e793cc ee955f30 ee955f34 f7e792ef 
f7e793cc 00001268
[  416.394427]  ee955f48 c02c6f24 00000002 f3342a50 c06ad780 ee955f74 
c020a962 00000002
[  416.394453]  08aff808 ee878e40 f338de14 c06ad780 f6f127c0 00000002 
ee878e40 08aff808
[  416.394481] Call Trace:
[  416.394488]  [<c0500ae1>] ? printk+0x18/0x1f
[  416.394513]  [<f7e792ef>] ? oops_store+0x4f/0x54 [crasher]
[  416.394533]  [<c02c6f24>] ? kobj_attr_store+0x24/0x30
[  416.394551]  [<c020a962>] ? sysfs_write_file+0x92/0xf0
[  416.394568]  [<c01bd998>] ? vfs_write+0x98/0x110
[  416.394583]  [<c020a8d0>] ? sysfs_write_file+0x0/0xf0
[  416.394597]  [<c01bdacd>] ? sys_write+0x3d/0x70
[  416.394610]  [<c0103f6b>] ? sysenter_do_call+0x12/0x2f
[  416.394626]  [<c0500000>] ? relay_hotcpu_callback+0x4d/0xbd
[  416.394643] Code: c3 66 90 64 a1 00 40 7b c0 8b 80 f0 01 00 00 c7 04 24 
84 93 e7 f7 89 44 24 04 e8 29 79 68 c8 8d 74 26 00 85 c0 75 9e 0f 0b eb fe 
<c7> 05 00 00 00 00 00 00 00 00 c9 c3 8d 74 26 00 55 31 d2 89 c8
[  416.394776] EIP: [<f7e790b0>] kerneloops_regression_test+0x80/0x90 
[crasher] SS:ESP 0068:ee955f14
[  416.394800] ---[ end trace 9686a7c0863fa516 ]---

Here is the patch to kernel-crasher:

diff -Naurp kernel-crasher/crasher.c kernel-crasher.new/crasher.c
--- kernel-crasher/crasher.c	2009-02-03 07:34:18.000000000 -0600
+++ kernel-crasher.new/crasher.c	2009-03-27 15:08:24.000000000 -0500
@@ -27,7 +27,8 @@
   * Changelog:
   *
   * 1 September 2006 - Jim Lieb <lieb at infoblox.com>
- *   V0.01 release
+ * 2 March 2009 - Manoj Iyer <manoj.iyer at canonical.com>
+ *   V0.02 release
   */

  #include <linux/types.h>
@@ -48,6 +49,8 @@ MODULE_DESCRIPTION("Crasher kernel OOPS/
  MODULE_LICENSE("GPL");
  MODULE_VERSION(CRASHER_VERSION);

+static void kerneloops_regression_test(int mode);
+
  /* expose the triggers via /sys/kernel/crash  */


@@ -55,6 +58,34 @@ MODULE_VERSION(CRASHER_VERSION);
  static struct kobj_attribute _name##_attr = \
  	__ATTR(_name, 0644, _name##_show, _name##_store)

+enum {
+	CRASH_BUG,
+	CRASH_OOPS,
+	CRASH_PANIC,
+	CRASH_WARN,
+	__DUMMY_CRASH_LAST,
+};
+
+void kerneloops_regression_test(int mode)
+{
+	switch(mode) {
+	case CRASH_OOPS:
+		*((int *) 0) = 0;
+		break;
+	case CRASH_BUG:
+		BUG(); 
+		break;
+	case CRASH_WARN:
+		WARN(1, "Crasher caused a WARN dump! pid=%u\n",
+		       current->pid);
+		break;
+	case CRASH_PANIC:
+		panic("Crasher caused a panic! pid=%u\n",
+		      current->pid);
+		break;
+	}
+}
+
  /* arm the crasher */

  static int crash_arm;
@@ -70,6 +101,10 @@ static ssize_t arm_store(struct kobject
  			 const char *buf, size_t count)
  {
  	crash_arm = simple_strtoul(buf, NULL, 0);
+
+	if (!crash_arm)
+		sysfs_remove_group(kernel_kobj, &crash_attr_group);
+
  	return count;
  }

@@ -89,14 +124,11 @@ static ssize_t oops_store(struct kobject
  			 struct kobj_attribute *attr,
  			 const char *buf, size_t count)
  {
-	int *page0 = 0x0L;
-	int tmp = 0xDEADBEEF;
-
  	crash_oops = simple_strtoul(buf, NULL, 0);
  	if(crash_arm && crash_oops) {
  		printk(KERN_WARNING "Crasher caused a a segfault! pid=%u\n",
  		       current->pid);
-		*page0 = tmp; /* this is as far as we go... */
+		kerneloops_regression_test(CRASH_OOPS);
  	}
  	return count;
  }
@@ -121,7 +153,7 @@ static ssize_t bug_store(struct kobject
  	if(crash_arm && crash_bug) {
  		printk(KERN_WARNING "Crasher caused a BUG dump! pid=%u\n",
  		       current->pid);
-		BUG(); /* this is as far as we go... */
+		kerneloops_regression_test(CRASH_BUG);
  	}
  	return count;
  }
@@ -144,8 +176,7 @@ static ssize_t warn_store(struct kobject
  {
  	crash_warn = simple_strtoul(buf, NULL, 0);
  	if(crash_arm && crash_warn) {
-		WARN(1, "Crasher caused a WARN dump! pid=%u\n",
-		       current->pid);
+		kerneloops_regression_test(CRASH_WARN);
  	}
  	return count;
  }
@@ -168,8 +199,7 @@ static ssize_t panic_store(struct kobjec
  {
  	crash_panic = simple_strtoul(buf, NULL, 0);
  	if(crash_arm && crash_panic) {
-		panic("Crasher caused a panic! pid=%u\n",
-		      current->pid);
+		kerneloops_regression_test(CRASH_PANIC);
  	}
  	return count;
  }


--- manjo




More information about the kernel-team mailing list