diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-03-07 10:47:43 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-07 10:05:13 -0800 |
commit | 80d38f9a7871d9bafc3f244dabe48b41a58de705 (patch) | |
tree | 9925078f6862200ce9b2ba6e6a5fb84d411afc9e /drivers/char | |
parent | ce4796d1e16cf3761dc2a02b8d588667d05b3078 (diff) | |
download | linux-80d38f9a7871d9bafc3f244dabe48b41a58de705.tar.gz linux-80d38f9a7871d9bafc3f244dabe48b41a58de705.tar.bz2 linux-80d38f9a7871d9bafc3f244dabe48b41a58de705.zip |
drivers/char/esp.c: fix bootup lockup
randconfig testing found a bootup lockup in drivers/char/esp.c because
of a spinlock that wasn't correctly initialized.
I'm not sure why it became more prominent in 2.6.25-rc4, the bug seems
rather old and i've been doing allyesconfig bootups for ages with
CONFIG_ESP enabled.
This fixes this bootup lockup:
PM: Adding info for No Bus:ttyP63
ttyP32 at 0x0240 (irq = 0) is an ESP primary port
BUG: spinlock lockup on CPU#0, swapper/1, f56dd004
Pid: 1, comm: swapper Not tainted 2.6.25-rc4-sched-devel.git-x86-latest.git #402 [<c03ac6f4>] _raw_spin_lock+0x134/0x140
[<c08649be>] _spin_lock_irqsave+0x5e/0x80
[<c0b9fbfe>] ? espserial_init+0x2be/0x6e0
[<c0b9fbfe>] espserial_init+0x2be/0x6e0
[<c0b877a3>] kernel_init+0x83/0x260
[<c0b9f940>] ? espserial_init+0x0/0x6e0
[<c010416a>] ? restore_nocheck_notrace+0x0/0xe
[<c0b87720>] ? kernel_init+0x0/0x260
[<c0b87720>] ? kernel_init+0x0/0x260
[<c0104507>] kernel_thread_helper+0x7/0x10
=======================
kzalloc() is not the way to initialize spinlocks anymore.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/esp.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/char/esp.c b/drivers/char/esp.c index c01e26d9ee5e..f3fe62067344 100644 --- a/drivers/char/esp.c +++ b/drivers/char/esp.c @@ -2484,6 +2484,7 @@ static int __init espserial_init(void) return 0; } + spin_lock_init(&info->lock); /* rx_trigger, tx_trigger are needed by autoconfig */ info->config.rx_trigger = rx_trigger; info->config.tx_trigger = tx_trigger; |