]> git.baikalelectronics.ru Git - kernel.git/commit
Bluetooth: Fix hidp disconnect deadlocks and lost wakeup
authorPeter Hurley <peter@hurleysoftware.com>
Thu, 30 Jun 2011 17:53:53 +0000 (13:53 -0400)
committerGustavo F. Padovan <padovan@profusion.mobi>
Thu, 30 Jun 2011 18:47:50 +0000 (15:47 -0300)
commit7f16d51910d2e52faca36beadff7a80a47b609a6
tree371add6842b2620dbedad6d4d240681f09118fe8
parentb93f2e9670d36debb92445ea053e0a76556eee7e
Bluetooth: Fix hidp disconnect deadlocks and lost wakeup

Partial revert of commit 541db103. When the hidp session thread
was converted from kernel_thread to kthread, the atomic/wakeups
were replaced with kthread_stop. kthread_stop has blocking semantics
which are inappropriate for the hidp session kthread. In addition,
the kthread signals itself to terminate in hidp_process_hid_control()
- it cannot do this with kthread_stop().

Lastly, a wakeup can be lost if the wakeup happens between checking
for the loop exit condition and setting the current state to
TASK_INTERRUPTIBLE. (Without appropriate synchronization mechanisms,
the task state should not be changed between the condition test and
the yield - via schedule() - as this creates a race between the
wakeup and resetting the state back to interruptible.)

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
net/bluetooth/hidp/core.c
net/bluetooth/hidp/hidp.h