|
|
@@ -481,16 +481,16 @@ static int bnep_session(void *arg)
|
|
|
struct net_device *dev = s->dev;
|
|
|
struct sock *sk = s->sock->sk;
|
|
|
struct sk_buff *skb;
|
|
|
- wait_queue_t wait;
|
|
|
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
|
|
|
|
BT_DBG("");
|
|
|
|
|
|
set_user_nice(current, -15);
|
|
|
|
|
|
- init_waitqueue_entry(&wait, current);
|
|
|
add_wait_queue(sk_sleep(sk), &wait);
|
|
|
while (1) {
|
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
|
+ /* Ensure session->terminate is updated */
|
|
|
+ smp_mb__before_atomic();
|
|
|
|
|
|
if (atomic_read(&s->terminate))
|
|
|
break;
|
|
|
@@ -512,9 +512,8 @@ static int bnep_session(void *arg)
|
|
|
break;
|
|
|
netif_wake_queue(dev);
|
|
|
|
|
|
- schedule();
|
|
|
+ wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
|
|
|
}
|
|
|
- __set_current_state(TASK_RUNNING);
|
|
|
remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
|
|
|
/* Cleanup session */
|
|
|
@@ -663,7 +662,7 @@ int bnep_del_connection(struct bnep_conndel_req *req)
|
|
|
s = __bnep_get_session(req->dst);
|
|
|
if (s) {
|
|
|
atomic_inc(&s->terminate);
|
|
|
- wake_up_process(s->task);
|
|
|
+ wake_up_interruptible(sk_sleep(s->sock->sk));
|
|
|
} else
|
|
|
err = -ENOENT;
|
|
|
|