forked from luck/tmp_suning_uos_patched
Bluetooth: btmrvl: fix thread stopping race
There is currently a race condition in the btmrvl_remove_card() which is causing hangs on suspend for OLPC. When the race occurs, kthread_stop() never returns. The problem is that btmrvl_service_main_thread() calls kthread_should_stop() and then does a fair number of things before restarting the loop and sleeping. If the thread gets stopped after kthread_should_stop() is checked, but before the sleep happens, the thread will go to sleep and won't necessarily be woken up. Move the kthread_should_stop() check into a race-free place. Signed-off-by: Daniel Drake <dsd@laptop.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
59f45d576a
commit
ea05fea904
|
@ -498,6 +498,10 @@ static int btmrvl_service_main_thread(void *data)
|
||||||
add_wait_queue(&thread->wait_q, &wait);
|
add_wait_queue(&thread->wait_q, &wait);
|
||||||
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
set_current_state(TASK_INTERRUPTIBLE);
|
||||||
|
if (kthread_should_stop()) {
|
||||||
|
BT_DBG("main_thread: break from main thread");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (adapter->wakeup_tries ||
|
if (adapter->wakeup_tries ||
|
||||||
((!adapter->int_count) &&
|
((!adapter->int_count) &&
|
||||||
|
@ -513,11 +517,6 @@ static int btmrvl_service_main_thread(void *data)
|
||||||
|
|
||||||
BT_DBG("main_thread woke up");
|
BT_DBG("main_thread woke up");
|
||||||
|
|
||||||
if (kthread_should_stop()) {
|
|
||||||
BT_DBG("main_thread: break from main thread");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->driver_lock, flags);
|
spin_lock_irqsave(&priv->driver_lock, flags);
|
||||||
if (adapter->int_count) {
|
if (adapter->int_count) {
|
||||||
adapter->int_count = 0;
|
adapter->int_count = 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user