[PATCH] all crashes from kerneloops_regression_test() in kernel-crasher
Jim Lieb
jim.lieb at canonical.com
Fri Mar 27 20:47:02 UTC 2009
On Friday 27 March 2009 13:13:59 Manoj Iyer wrote:
> 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
kerneloops_regression_test is a good idea.
The change removing the sysfs group in arm_store is a nak.
There is another issue in that the module cannot be rmmod'd once
it processes an oops. I'll take these patches, keeping the kerneloops
regression bit and update the module.
Jim
--
Jim Lieb
Ubuntu Kernel Team
Canonical Ltd.
More information about the kernel-team
mailing list