Subject: linux-next: boot failure in sep driver

From: Stephen Rothwell <[email-masked]>
Date: Mon, 22 Nov 2010 17:09:14 +1100

Hi Greg,

One of my boot tests failed like this:

Unable to handle kernel paging request for data at address 0x00000340
Faulting instruction address: 0xc0000000000b4b98
Oops: Kernel access of bad area, sig: 11 [#1]
SMP NR_CPUS=1024 NUMA pSeries
last sysfs file: 
Modules linked in:
NIP: c0000000000b4b98 LR: c00000000094dc60 CTR: 0000000000000000
REGS: c0000007b121fb00 TRAP: 0300   Not tainted  (2.6.37-rc3-autokern1)
MSR: 8000000000009032 <EE,ME,IR,DR>  CR: 24000082  XER: 0000000d
DAR: 0000000000000340, DSISR: 0000000042000000
TASK = c0000007b1208330[1] 'swapper' THREAD: c0000007b121c000 CPU: 4
GPR00: 0000000000000338 c0000007b121fd80 c000000000f1bb80 0000000000000330 
GPR04: c000000001475350 c000000000871d70 c0000007aa5ffbc0 0000000000000001 
GPR08: 0000000000000000 0000000000000000 0000000000006c73 c0000007aa5ffbd0 
GPR12: 0000000024000082 c00000000ff60a00 0000000003680000 0000000000677c00 
GPR16: 0000000003680000 0000000002180000 0000000000c894b8 0000000002ad93e0 
GPR20: 0000000000000000 0000000002ad8f60 0000000002ad8eb8 0000000002180000 
GPR24: 000000008b909c7e c0000007b121fe90 0000000002180000 0000000000000000 
GPR28: c000000001475350 0000000000000000 c000000000ec20b0 0000000000000000 
NIP [c0000000000b4b98] .__init_waitqueue_head+0x8/0x20
LR [c00000000094dc60] .sep_init+0x7c/0x3c0
Call Trace:
[c0000007b121fd80] [c00000000094dc24] .sep_init+0x40/0x3c0 (unreliable)
[c0000007b121fe20] [c000000000009894] .do_one_initcall+0x1a4/0x1e0
[c0000007b121fee0] [c0000000009104c4] .kernel_init+0x254/0x310
[c0000007b121ff90] [c0000000000312a4] .kernel_thread+0x54/0x70
Instruction dump:
eba1ffe8 ebc1fff0 ebe1fff8 7c0803a6 4e800020 7c0004ac 9bad0214 4bffff64 
60000000 60000000 38030008 39200000 <f8030010> 91230000 f8030008 4e800020 
---[ end trace ee7a73365e284457 ]---
Kernel panic - not syncing: Attempted to kill init!
Call Trace:
[c0000007b121f720] [c0000000000143b4] .show_stack+0x74/0x1c0 (unreliable)
[c0000007b121f7d0] [c00000000066c05c] .panic+0x9c/0x1f4
[c0000007b121f870] [c00000000008ed84] .do_exit+0x714/0x870
[c0000007b121f970] [c00000000002eb64] .die+0x164/0x2c0
[c0000007b121fa10] [c000000000041614] .bad_page_fault+0xc4/0x110
[c0000007b121fa90] [c000000000005248] handle_page_fault+0x3c/0x74
--- Exception: 300 at .__init_waitqueue_head+0x8/0x20
    LR = .sep_init+0x7c/0x3c0
[c0000007b121fd80] [c00000000094dc24] .sep_init+0x40/0x3c0 (unreliable)
[c0000007b121fe20] [c000000000009894] .do_one_initcall+0x1a4/0x1e0
[c0000007b121fee0] [c0000000009104c4] .kernel_init+0x254/0x310
[c0000007b121ff90] [c0000000000312a4] .kernel_thread+0x54/0x70

I don't know why the sep driver was built, but even so, the sep_init
function does this:

static struct sep_device *sep_dev;
	.
	.
static int __init sep_init(void)
{
	.
	.
	sep = sep_dev;

        init_waitqueue_head(&sep->event);
        init_waitqueue_head(&sep->event_request_daemon);
        spin_lock_init(&sep->snd_rply_lck);
        mutex_init(&sep->sep_mutex);
        mutex_init(&sep->ioctl_mutex);

And sep_dev is not allocated until probe time ... and it never gets
probed on my system, of course.

-- 
Cheers,
Stephen Rothwell                    [email-masked]
http://www.canb.auug.org.au/~sfr/