linux/drivers/bluetooth
Ronald Tschalär 67d2f8781b Bluetooth: hci_ldisc: Allow sleeping while proto locks are held.
Commit dec2c92880 ("Bluetooth: hci_ldisc:
Use rwlocking to avoid closing proto races") introduced locks in
hci_ldisc that are held while calling the proto functions. These locks
are rwlock's, and hence do not allow sleeping while they are held.
However, the proto functions that hci_bcm registers use mutexes and
hence need to be able to sleep.

In more detail: hci_uart_tty_receive() and hci_uart_dequeue() both
acquire the rwlock, after which they call proto->recv() and
proto->dequeue(), respectively. In the case of hci_bcm these point to
bcm_recv() and bcm_dequeue(). The latter both acquire the
bcm_device_lock, which is a mutex, so doing so results in a call to
might_sleep(). But since we're holding a rwlock in hci_ldisc, that
results in the following BUG (this for the dequeue case - a similar
one for the receive case is omitted for brevity):

  BUG: sleeping function called from invalid context at kernel/locking/mutex.c
  in_atomic(): 1, irqs_disabled(): 0, pid: 7303, name: kworker/7:3
  INFO: lockdep is turned off.
  CPU: 7 PID: 7303 Comm: kworker/7:3 Tainted: G        W  OE   4.13.2+ #17
  Hardware name: Apple Inc. MacBookPro13,3/Mac-A5C67F76ED83108C, BIOS MBP133.8
  Workqueue: events hci_uart_write_work [hci_uart]
  Call Trace:
   dump_stack+0x8e/0xd6
   ___might_sleep+0x164/0x250
   __might_sleep+0x4a/0x80
   __mutex_lock+0x59/0xa00
   ? lock_acquire+0xa3/0x1f0
   ? lock_acquire+0xa3/0x1f0
   ? hci_uart_write_work+0xd3/0x160 [hci_uart]
   mutex_lock_nested+0x1b/0x20
   ? mutex_lock_nested+0x1b/0x20
   bcm_dequeue+0x21/0xc0 [hci_uart]
   hci_uart_write_work+0xe6/0x160 [hci_uart]
   process_one_work+0x253/0x6a0
   worker_thread+0x4d/0x3b0
   kthread+0x133/0x150

We can't replace the mutex in hci_bcm, because there are other calls
there that might sleep. Therefore this replaces the rwlock's in
hci_ldisc with rw_semaphore's (which allow sleeping). This is a safer
approach anyway as it reduces the restrictions on the proto callbacks.
Also, because acquiring write-lock is very rare compared to acquiring
the read-lock, the percpu variant of rw_semaphore is used.

Lastly, because hci_uart_tx_wakeup() may be called from an IRQ context,
we can't block (sleep) while trying acquire the read lock there, so we
use the trylock variant.

Signed-off-by: Ronald Tschalär <ronald@innovation.ch>
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
2017-10-29 14:03:28 +01:00
..
ath3k.c Bluetooth: Style fix - align block comments 2017-07-22 08:39:39 +02:00
bcm203x.c Bluetooth: mark expected switch fall-throughs 2017-10-14 09:25:51 +02:00
bfusb.c networking: introduce and use skb_put_data() 2017-06-16 11:48:37 -04:00
bluecard_cs.c Bluetooth: Convert timers to use timer_setup() 2017-10-06 20:37:11 +02:00
bpa10x.c networking: make skb_push & __skb_push return void pointers 2017-06-16 11:48:40 -04:00
bt3c_cs.c Bluetooth: Style fix - align block comments 2017-07-22 08:39:39 +02:00
btbcm.c Bluetooth: btbcm: Add entry for BCM4356A2 UART bluetooth 2017-10-14 09:25:11 +02:00
btbcm.h Bluetooth: btbcm: Support the BCM4354 Bluetooth UART device 2015-06-17 18:56:53 +02:00
btintel.c Bluetooth: btintel: Add MODULE_FIRMWARE entries for iBT 3.5 controllers 2017-05-23 19:54:55 +02:00
btintel.h Bluetooth: btintel: Create common Intel Version Read function 2015-12-10 00:51:51 +01:00
btmrvl_debugfs.c Bluetooth: btmrvl add firmware dump support 2014-12-03 17:35:51 +01:00
btmrvl_drv.h Bluetooth: btmrvl: drop duplicate header slab.h 2016-12-08 07:44:56 +01:00
btmrvl_main.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2017-07-05 12:31:59 -07:00
btmrvl_sdio.c Bluetooth: btmrvl: *_err() and *_info() strings should end with newlines 2017-10-06 20:35:47 +02:00
btmrvl_sdio.h btmrvl: add platform specific wakeup interrupt support 2016-05-02 19:26:15 +02:00
btqca.c Bluetooth: btqca: Fixed a coding style error 2017-07-20 11:18:35 +02:00
btqca.h Bluetooth: btqca: Introduce generic QCA ROME support 2015-08-10 23:52:20 +02:00
btqcomsmd.c Bluetooth: btqcomsmd: retrieve BD address from DT property 2017-10-06 20:35:47 +02:00
btrtl.c Bluetooth: btrtl: Fix a error code in rtl_load_config() 2017-07-28 19:29:08 +03:00
btrtl.h Bluetooth: btrtl: Create separate module for Realtek BT driver 2015-05-14 12:04:12 +02:00
btsdio.c Bluetooth: Style fix - align block comments 2017-07-22 08:39:39 +02:00
btuart_cs.c Bluetooth: Style fix - align block comments 2017-07-22 08:39:39 +02:00
btusb.c Revert "Bluetooth: btusb: Add workaround for Broadcom devices without product id" 2017-10-14 09:25:12 +02:00
btwilink.c Bluetooth: Style fix - align block comments 2017-07-22 08:39:39 +02:00
dtl1_cs.c networking: add and use skb_put_u8() 2017-06-16 11:48:40 -04:00
hci_ag6xx.c Bluetooth: hci_uart: Add diag and address support for Intel/AG6xx 2016-02-29 19:25:22 +02:00
hci_ath.c Bluetooth: Use new hci_skb_pkt_* wrappers for drivers 2015-11-19 17:50:27 +01:00
hci_bcm.c Bluetooth: hci_bcm: Add support for BCM2E7E 2017-10-14 09:25:12 +02:00
hci_bcsp.c Bluetooth: Convert timers to use timer_setup() 2017-10-06 20:37:11 +02:00
hci_h4.c Bluetooth: hci_uart: Fix uninitialized alignment value 2017-07-31 13:27:37 +03:00
hci_h5.c Bluetooth: Convert timers to use timer_setup() 2017-10-06 20:37:11 +02:00
hci_intel.c networking: add and use skb_put_u8() 2017-06-16 11:48:40 -04:00
hci_ldisc.c Bluetooth: hci_ldisc: Allow sleeping while proto locks are held. 2017-10-29 14:03:28 +01:00
hci_ll.c Bluetooth: mark expected switch fall-throughs 2017-10-14 09:25:51 +02:00
hci_mrvl.c networking: introduce and use skb_put_data() 2017-06-16 11:48:37 -04:00
hci_nokia.c Bluetooth: hci_nokia: Use new hci_uart_unregister_device() function 2017-07-20 11:18:36 +02:00
hci_qca.c Bluetooth: Convert timers to use timer_setup() 2017-10-06 20:37:11 +02:00
hci_serdev.c Bluetooth: hci_serdev: Introduce hci_uart_unregister_device() 2017-07-20 11:18:36 +02:00
hci_uart.h Bluetooth: hci_ldisc: Allow sleeping while proto locks are held. 2017-10-29 14:03:28 +01:00
hci_vhci.c networking: add and use skb_put_u8() 2017-06-16 11:48:40 -04:00
Kconfig Bluetooth: BT_HCIUART now depends on SERIAL_DEV_BUS 2017-10-11 20:09:37 +02:00
Makefile Bluetooth: try to improve CONFIG_SERIAL_DEV_BUS dependency 2017-04-22 10:28:40 +02:00