public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [2.4] "Fix" introduced in 2.4.27pre2 for bluetooth hci_usb race causes kernel hang
@ 2005-04-08 19:56 Tomas Ögren
  2005-04-09 13:39 ` Marcel Holtmann
  0 siblings, 1 reply; 4+ messages in thread
From: Tomas Ögren @ 2005-04-08 19:56 UTC (permalink / raw)
  To: linux-kernel

Hello.

I have noticed a problem with a race condition fix introduced in
2.4.27-pre2 that causes the kernel to hang when disconnecting a
Bluetooth USB dongle or doing 'hciconfig hci0 down'. No message is
printed, the kernel just doesn't respond anymore.

Seen in Changelog:
Marcel Holtmann:
  o [Bluetooth] Fix race in RX complete routine of the USB drivers

Reversing the following patch to hci_usb_rx_complete() makes 2.4.27-pre2
up until 2.4.30 happy and does not hang when removing the dongle
anymore. (bfusb.c has the same patch applied)

2.6.11.7 does not show the same problem, but has similar code to the
"fixed" (that hangs) code in 2.4, so the real problem is probably
somewhere else.

I have tested this on Dell Optiplex GX150, 260 and 280's which has Intel
P3 and P4 with Intel UHCI USB chipset. I have tested both usb-uhci.o and
uhci.o with the same results. Tested with USB Bluetooth dongles with
both Broadcom and Cambridge Silicon Radio chipsets, same results.

modules loaded: l2cap, hci_usb, bluez, (usb-)uhci, usbcore

diff -ruN linux-2.4.27-pre1/drivers/bluetooth/hci_usb.c linux-2.4.27-pre2/drivers/bluetooth/hci_usb.c
--- linux-2.4.27-pre1/drivers/bluetooth/hci_usb.c       2004-04-14 15:05:29.000000000 +0200
+++ linux-2.4.27-pre2/drivers/bluetooth/hci_usb.c       2005-04-08 20:16:51.000000000 +0200
@@ -699,11 +699,11 @@
        BT_DBG("%s urb %p type %d status %d count %d flags %x", hdev->name, urb,
                        _urb->type, urb->status, count, urb->transfer_flags);

-       if (!test_bit(HCI_RUNNING, &hdev->flags))
-               return;
-
        read_lock(&husb->completion_lock);

+       if (!test_bit(HCI_RUNNING, &hdev->flags))
+               goto unlock;
+
        if (urb->status || !count)
                goto resubmit;

@@ -740,6 +740,8 @@
                BT_DBG("%s urb %p type %d resubmit status %d", hdev->name, urb,
                                _urb->type, err);
        }
+
+unlock:
        read_unlock(&husb->completion_lock);
 }


Please CC me for any responses, not on the list.

/Tomas
-- 
Tomas Ögren, stric@acc.umu.se, http://www.acc.umu.se/~stric/
|- Student at Computing Science, University of Umeå
`- Sysadmin at {cs,acc}.umu.se

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-04-13 21:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-08 19:56 [2.4] "Fix" introduced in 2.4.27pre2 for bluetooth hci_usb race causes kernel hang Tomas Ögren
2005-04-09 13:39 ` Marcel Holtmann
2005-04-13 10:37   ` Tomas Ögren
2005-04-13 21:28     ` Marcel Holtmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox