[haiku-bugs] [Haiku] #15131: KDL when using multiple serial devices

  • From: "Haiku" <trac@xxxxxxxxxxxx>
  • To: undisclosed-recipients: ;
  • Date: Sat, 29 Jun 2019 15:29:52 -0000

#15131: KDL when using multiple serial devices
-------------------------+------------------------------
 Reporter:  pulkomandy   |        Owner:  nobody
     Type:  bug          |       Status:  new
 Priority:  normal       |    Milestone:  Unscheduled
Component:  Drivers/TTY  |      Version:  R1/Development
 Keywords:               |   Blocked By:
 Blocking:               |  Has a Patch:  0
 Platform:  All          |
-------------------------+------------------------------
 I have two USB serial devices connected to my machine. If I open one in
 SerialConnect, and then try to open the other (from the same instance of
 SerialConnect, so I think a quick close-then-open sequence will happen) I
 get the following KDL (it's continuable):

 {{{
 KERN: PANIC: _mutex_lock(): double lock of 0xd97f92b4 by thread 17774
 KERN: Welcome to Kernel Debugging Land...
 KERN: Thread 17774 "SerialConnect" running on CPU 2
 KERN: stack trace for thread 17774 "SerialConnect"
 KERN:     kernel stack: 0x82755000 to 0x82759000
 KERN:       user stack: 0x70e02000 to 0x71e02000
 KERN: frame               caller     <image>:function + offset
 KERN:  0 82758708 (+  32) 8014bcaa   <kernel_x86> arch_debug_stack_trace +
 0x12
 KERN:  1 82758728 (+  16) 800a8233   <kernel_x86>
 stack_trace_trampoline(NULL) + 0x0b
 KERN:  2 82758738 (+  12) 8013d796   <kernel_x86>
 arch_debug_call_with_fault_handler + 0x1b
 KERN:  3 82758744 (+  48) 800a9cbc   <kernel_x86>
 debug_call_with_fault_handler + 0x60
 KERN:  4 82758774 (+  64) 800a8447   <kernel_x86>
 kernel_debugger_loop(0x8018fbd7 "PANIC: ", 0x8018aa60 "_mutex_lock():
 double lock of %p by thread %ld", 0x82758820 "E", int32: 2) + 0x20f
 KERN:  5 827587b4 (+  48) 800a87eb   <kernel_x86>
 kernel_debugger_internal(0x8018fbd7 "PANIC: ", 0x8018aa60 "_mutex_lock():
 double lock of %p by thread %ld", 0x82758820 "E", int32: 2) + 0x77
 KERN:  6 827587e4 (+  48) 800aa03e   <kernel_x86> panic + 0x3a
 KERN:  7 82758814 (+  80) 800962d6   <kernel_x86> _mutex_lock + 0xea
 KERN:  8 82758864 (+ 224) 827c9e49   </boot/system/add-
 ons/kernel/generic/tty> tty_control(tty_cookie*: 0xd90567c0, uint32:
 0x8001 (32769), 0x82758984, uint32: 0x20 (32)) + 0xd1
 KERN:  9 82758944 (+  96) 82740c94   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial>
 SerialDevice<0xd628fcc0>::SetModes(termios*: 0xd97b0988) + 0x224
 KERN: 10 827589a4 (+  64) 82740f77   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial>
 SerialDevice<0xd628fcc0>::Service(tty*: 0xd97b0960, uint32: 0x1 (1),
 0xd97b0988, uint32: 0x20 (32)) + 0x1ef
 KERN: 11 827589e4 (+  64) 82740108   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial> usb_serial_service + 0x78
 KERN: 12 82758a24 (+ 224) 827ca06e   </boot/system/add-
 ons/kernel/generic/tty> tty_control(tty_cookie*: 0xd8e2dce0, uint32:
 0x8001 (32769), 0x82758b44, uint32: 0x20 (32)) + 0x2f6
 KERN: 13 82758b04 (+  96) 82740c94   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial>
 SerialDevice<0xd60cbd98>::SetModes(termios*: 0xd97f92d0) + 0x224
 KERN: 14 82758b64 (+  64) 82740f77   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial>
 SerialDevice<0xd60cbd98>::Service(tty*: 0xd97f92a8, uint32: 0x1 (1),
 0xd97f92d0, uint32: 0x20 (32)) + 0x1ef
 KERN: 15 82758ba4 (+  64) 82740108   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial> usb_serial_service + 0x78
 KERN: 16 82758be4 (+ 224) 827ca06e   </boot/system/add-
 ons/kernel/generic/tty> tty_control(tty_cookie*: 0xd90567c0, uint32:
 0x8001 (32769), 0xd60cbe14, uint32: 0x20 (32)) + 0x2f6
 KERN: 17 82758cc4 (+  48) 8274124a   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial>
 SerialDevice<0xd60cbd98>::Open(uint32: 0x182 (386)) + 0x25a
 KERN: 18 82758cf4 (+  48) 82740219   </boot/system/add-
 ons/kernel/drivers/dev/ports/usb_serial> usb_serial_open(0x82758d94
 "ports/usb0", uint32: 0x182 (386), 0xd97b26a0) + 0xb1
 KERN: 19 82758d24 (+  48) 800c8b94   <kernel_x86>
 
_GLOBAL_.N..._.._haiku_src_system_kernel_device_manager_legacy_drivers.cppcTiTnb::LegacyDevice<0xd321adc0>::Open(0x82758d94
 "ports/usb0", int32: 386, 0xd97b26a0) + 0x20
 KERN: 20 82758d54 (+ 320) 800c32c9   <kernel_x86> devfs_open(fs_volume*:
 0x82ac5960, fs_vnode*: 0xd9004090, int32: 386, 0x82758ec0) + 0x9d
 KERN: 21 82758e94 (+  48) 800faab1   <kernel_x86> open_vnode(vnode*:
 0xd9004090, int32: 386, false) + 0x29
 KERN: 22 82758ec4 (+  64) 800fb369   <kernel_x86> file_open(int32: -1,
 0xdf071e88 "/dev", int32: 386, false) + 0x91
 KERN: 23 82758f04 (+  64) 8010118f   <kernel_x86> _user_open + 0xab
 KERN: 24 82758f44 (+ 100) 8014028f   <kernel_x86> handle_syscall + 0xdc
 KERN: user iframe at 0x82758fa8 (end = 0x82759000)
 KERN:  eax 0x6b          ebx 0x241d5ac      ecx 0x71e0131c  edx 0x61d62114
 KERN:  esi 0x71e01378    edi 0x71e0198c     ebp 0x71e01348  esp 0x82758fdc
 KERN:  eip 0x61d62114 eflags 0x3202    user esp 0x71e0131c
 KERN:  vector: 0x63, error code: 0x0
 KERN: 25 82758fa8 (+   0) 61d62114   <commpage> commpage_syscall + 0x04
 KERN: 26 71e01348 (+ 112) 0141d4ee   <libdevice.so>
 BSerialPort<0x71e0198c>::Open(0x321988 "usb0") + 0x72
 KERN: 27 71e013b8 (+ 432) 0103d975   <_APP_>
 SerialApp<0x71e01884>::MessageReceived(BMessage*: 0xde08e0) + 0xc9
 KERN: 28 71e01568 (+  48) 0164c543   <libbe.so>
 BLooper<0x71e01884>::DispatchMessage(BMessage*: 0xde08e0, BHandler*:
 0x71e01884) + 0x5b
 KERN: 29 71e01598 (+ 512) 01641c5d   <libbe.so>
 BApplication<0x71e01884>::DispatchMessage(BMessage*: 0xde08e0, BHandler*:
 0x71e01884) + 0x4e9
 KERN: 30 71e01798 (+  64) 0164de35   <libbe.so>
 BLooper<0x71e01884>::task_looper() + 0x205
 KERN: 31 71e017d8 (+  64) 0164c98d   <libbe.so>
 BLooper<0x71e01884>::Loop() + 0x65
 KERN: 32 71e01818 (+  48) 016405d6   <libbe.so>
 BApplication<0x71e01884>::Run() + 0x2a
 KERN: 33 71e01848 (+ 400) 0103f183   <_APP_> main + 0x2f
 KERN: 34 71e019d8 (+  48) 0103ca6b   <_APP_> _start + 0x5b
 KERN: 35 71e01a08 (+  64) 01cc17b4
 </boot/system/runtime_loader@0x01caf000> <unknown> + 0x127b4
 KERN: 36 71e01a48 (+   0) 61d62258   <commpage> commpage_thread_exit +
 0x00
 }}}

 Apparently open calls usb_serial_service which eventually recurses, first
 with a different cookie but then with the same as the first call. So of
 course we end up with a recursive locking situation.

 If I understand tty locking correctly, calling tty->service_func should
 indeed be done with the lock held, as it accesses the tty settings. It
 looks strange that the tty implementation of the serial device
 (usb_serial_service) always operates on all serial devices? I would expect
 it to work on the currently open one, but then again that's the work of
 usb_serial_control, so maybe _service is indeed supposed to be global?

-- 
Ticket URL: <https://dev.haiku-os.org/ticket/15131>
Haiku <https://dev.haiku-os.org>
The Haiku operating system.

Other related posts: