Strangely, I didn't see this on the list, looked poorly? Anyway,
here's the deal:

kernel BUG at sched.c:999!
EIP is at schedule [kernel] 0x2aa (2.4.20-13.9)
eax: 00000001   ebx: c3ad8c74   ecx: c0349d64   edx: c0349d5c
esi: c0348000   edi: c3ad8c7c   ebp: c0349d54   esp: c0349d44
ds: 0068   es: 0068   ss: 0068
Process swapper (pid: 0, stackpage=c0349000)
Stack: 3201a8c0 c3ad8c74 c0348000 c3ad8c7c c0349d5c c01081ff 00000001 c0348000
       c3ad8c7c c3ad8c7c c3ad8c1c c3ad8c74 c3ad8c00 ffffffea c0108354 c3ad8c74
       c3ad8c00 ffffffed f88f69bf c3ad8c1c f88f6b5b 00000000 f7320000 f73d7000
Call Trace:   [<c01081ff>] __down [kernel] 0x5f (0xc0349d58))
[<c0108354>] __down_failed [kernel] 0x8 (0xc0349d7c))
[<f88f69bf>] .text.lock.usbserial [usbserial] 0x2d (0xc0349d8c))
[<f88f6b5b>] .rodata.str1.1 [usbserial] 0xed (0xc0349d94))
[<c0182aed>] tty_default_put_char [kernel] 0x2d (0xc0349db0))
[<c0183718>] echo_char [kernel] 0x48 (0xc0349dc8))
[<c0184f79>] n_tty_receive_char [kernel] 0x159 (0xc0349ddc))
[<c0183e37>] n_tty_receive_buf [kernel] 0x237 (0xc0349e04))
[<c01827ae>] flush_to_ldisc [kernel] 0xbe (0xc0349eac))
[<f88fb9a5>] visor_read_bulk_callback [visor] 0x125 (0xc0349ec8))
[<f88fd30a>] .rodata.str1.1 [visor] 0xb9 (0xc0349ed0))
[<f88433b2>] sohci_return_urb [usb-ohci] 0x52 (0xc0349ef4))
[<f88456ae>] dl_done_list [usb-ohci] 0xce (0xc0349f08))
[<f88463bb>] hc_interrupt [usb-ohci] 0x12b (0xc0349f2c))
[<c010a8c5>] handle_IRQ_event [kernel] 0x45 (0xc0349f48))
[<c010aa55>] do_IRQ [kernel] 0x75 (0xc0349f68))
[<c01155b0>] apm_cpu_idle [kernel] 0x0 (0xc0349f78))
[<c0106ec3>] default_idle [kernel] 0x23 (0xc0349fb4))
[<c0106f35>] cpu_idle [kernel] 0x35 (0xc0349fd4))

It looks pretty clear.

1. The usbserial sets tty->low_latency by default.
   Thus, tty_flip_buffer_push falls through to flush_to_ldisc.

2. Likely, he PDA continuously sends crap, so when app opens a port (kudzu?),
   a cooked port gets connected to PDA; then the line discipline echoes.

3. The usbserial assumes that its ->serial_write method is only called
   from actual writes from a process, and so downs a semaphore.
   In this case, line discipline echo routine writes and not a process.

Removing any single condition will fix the problem, but which one?
Killing kudzu from a boot sequence is an option, of course...
But would like a more robust solution. The best would be to
redo locking in the usbserial and use spinlocks as appropriate.
This seems too involved, however.

Apparently, it wasn't a problem in 2.4.18. We shipped a 2.4.20
based errata and it started complaints. I think when we moved semaphores
from usbserial subcomponents into usbserial.c, a semaphore in
write method was added, even though it was not present in
component drivers in 2.4.18. Greg, why was it added? A real
oops, or just for any case?

-- Pete


-------------------------------------------------------
This SF.net email is sponsored by:  Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to