Re: [patch] "big IRQ lock" removal, 2.5.27-A1

From: Ingo Molnar (mingo@elte.hu)
Date: Sun Jul 21 2002 - 16:39:42 EST


okay, the crash happens if i boot an SMP kernel, and do the following:

        cat /dev/ttyS0

        [ ... system works at this point, no crash ... ]

        Ctrl-C

        [ ... system crashes ... ]

note that ttyS0 is not the serial console device - so this is a plain
unconnected serial port.

the oops, written down by hand:

 Unable to handle kernel paging request at virtual address ffffff8a
 c01aa193
 CPU: 1
 EIP: 0010:[<c01aa193>] Not tainted
 Using defaults from ksymoops -t elf32-i386 -a i386
 EFLAGS: 00010292
 eax: 00000002 ebx: ffffff70 ecx: 00000000 edx: 000000ff
 esi: ffffff70 edi: 00000000 ebp: c02d3ad0 esp: c13e1edc
 Call Trace: [<c01ab696>] [<c0114210>] [<c0109d79>] [<c010a07e>]
 [<c0113821>]
 [<c0105470>] [<c0108347>] [<c01054c0>] [<c0105470>] [<c01054eb>]
 [<c010553a>]
 [<c011d3ac>] [<c011d1ca>]
 Aiee, killing interrupt handler!
 Warning (Oops_read): Code line not seen, dumping what data is available

>>EIP; c01aa193 <serial_in+13/80> <=====
Trace; c01ab696 <serial8250_interrupt+66/1a0>
Trace; c0114210 <move+50/90>
Trace; c0109d79 <handle_IRQ_event+69/a0>
Trace; c010a07e <do_IRQ+ee/190>
Trace; c0113821 <smp_apic_timer_interrupt+131/140>
Trace; c0105470 <default_idle+0/50>
Trace; c0108347 <common_interrupt+1f/24>
Trace; c01054c0 <poll_idle+0/40>
Trace; c0105470 <default_idle+0/50>
Trace; c01054eb <poll_idle+2b/40>
Trace; c010553a <cpu_idle+3a/50>
Trace; c011d3ac <release_console_sem+11c/120>
Trace; c011d1ca <printk+18a/200>

ie. the second, idle CPU received a serial interrupt and crashed in it.

the .config used for this is attached. The gdb backtrace:

(gdb) list *0xc01aa193
0xc01aa193 is in serial_in (serial_8250.c:176).
171 { "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO }
172 };
173
174 static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset)
175 {
176 offset <<= up->port.regshift;
177
178 switch (up->port.iotype) {
179 case SERIAL_IO_HUB6:
180 outb(up->port.hub6 - 1 + offset, up->port.iobase);
(gdb)

(gdb) list *0xc01ab696
0xc01ab696 is in serial8250_interrupt (serial_8250.c:947).
942 unsigned int iir;
943
944 up = list_entry(l, struct uart_8250_port, list);
945
946 iir = serial_in(up, UART_IIR);
947 if (!(iir & UART_IIR_NO_INT)) {
948 spin_lock(&up->port.lock);
949 serial8250_handle_port(up, regs);
950 spin_unlock(&up->port.lock);
951
(gdb)

this backtrace looks more credible to me.

        Ingo



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



This archive was generated by hypermail 2b29 : Tue Jul 23 2002 - 22:00:36 EST