Lines 680-695
static int hidp_session(void *arg)
Link Here
|
680 |
struct sock *intr_sk = session->intr_sock->sk; |
680 |
struct sock *intr_sk = session->intr_sock->sk; |
681 |
struct sk_buff *skb; |
681 |
struct sk_buff *skb; |
682 |
wait_queue_t ctrl_wait, intr_wait; |
682 |
wait_queue_t ctrl_wait, intr_wait; |
|
|
683 |
struct socket_wq *ctrl_wq, *intr_wq; |
683 |
|
684 |
|
684 |
BT_DBG("session %p", session); |
685 |
BT_DBG("session %p", session); |
685 |
|
686 |
|
686 |
__module_get(THIS_MODULE); |
687 |
__module_get(THIS_MODULE); |
687 |
set_user_nice(current, -15); |
688 |
set_user_nice(current, -15); |
688 |
|
689 |
|
|
|
690 |
ctrl_wq = ctrl_sk->sk_wq; |
691 |
intr_wq = intr_sk->sk_wq; |
689 |
init_waitqueue_entry(&ctrl_wait, current); |
692 |
init_waitqueue_entry(&ctrl_wait, current); |
690 |
init_waitqueue_entry(&intr_wait, current); |
693 |
init_waitqueue_entry(&intr_wait, current); |
691 |
add_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait); |
694 |
add_wait_queue(&rcu_dereference_raw(ctrl_wq)->wait, &ctrl_wait); |
692 |
add_wait_queue(sk_sleep(intr_sk), &intr_wait); |
695 |
add_wait_queue(&rcu_dereference_raw(intr_wq)->wait, &intr_wait); |
693 |
session->waiting_for_startup = 0; |
696 |
session->waiting_for_startup = 0; |
694 |
wake_up_interruptible(&session->startup_queue); |
697 |
wake_up_interruptible(&session->startup_queue); |
695 |
set_current_state(TASK_INTERRUPTIBLE); |
698 |
set_current_state(TASK_INTERRUPTIBLE); |
Lines 722-729
static int hidp_session(void *arg)
Link Here
|
722 |
set_current_state(TASK_INTERRUPTIBLE); |
725 |
set_current_state(TASK_INTERRUPTIBLE); |
723 |
} |
726 |
} |
724 |
set_current_state(TASK_RUNNING); |
727 |
set_current_state(TASK_RUNNING); |
725 |
remove_wait_queue(sk_sleep(intr_sk), &intr_wait); |
728 |
remove_wait_queue(&rcu_dereference_raw(intr_wq)->wait, &intr_wait); |
726 |
remove_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait); |
729 |
remove_wait_queue(&rcu_dereference_raw(ctrl_wq)->wait, &ctrl_wait); |
727 |
|
730 |
|
728 |
clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); |
731 |
clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); |
729 |
clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); |
732 |
clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); |
Lines 747-758
static int hidp_session(void *arg)
Link Here
|
747 |
session->intr_sock->sk->sk_err = EUNATCH; |
750 |
session->intr_sock->sk->sk_err = EUNATCH; |
748 |
session->ctrl_sock->sk->sk_err = EUNATCH; |
751 |
session->ctrl_sock->sk->sk_err = EUNATCH; |
749 |
|
752 |
|
750 |
hidp_schedule(session); |
753 |
wake_up_interruptible(&rcu_dereference_raw(ctrl_wq)->wait); |
|
|
754 |
wake_up_interruptible(&rcu_dereference_raw(intr_wq)->wait); |
751 |
|
755 |
|
752 |
fput(session->intr_sock->file); |
756 |
fput(session->intr_sock->file); |
753 |
|
757 |
|
754 |
wait_event_timeout(*(sk_sleep(ctrl_sk)), |
758 |
/* By now ctrl_sk might have been orphaned already */ |
755 |
(ctrl_sk->sk_state == BT_CLOSED), msecs_to_jiffies(500)); |
759 |
if (ctrl_wq == ctrl_sk->sk_wq) |
|
|
760 |
wait_event_timeout(rcu_dereference_raw(ctrl_wq)->wait, |
761 |
(ctrl_sk->sk_state == BT_CLOSED), msecs_to_jiffies(500)); |
756 |
|
762 |
|
757 |
fput(session->ctrl_sock->file); |
763 |
fput(session->ctrl_sock->file); |
758 |
|
764 |
|