]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/bluetooth/af_bluetooth.c
net: use skb_queue_empty_lockless() in poll() handlers
[mirror_ubuntu-bionic-kernel.git] / net / bluetooth / af_bluetooth.c
index 91e3ba28070647bc93960c1d729aa200b666b249..b48d54783e5d925acd8264879493ea2a6e483479 100644 (file)
@@ -154,15 +154,25 @@ void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
 }
 EXPORT_SYMBOL(bt_sock_unlink);
 
-void bt_accept_enqueue(struct sock *parent, struct sock *sk)
+void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh)
 {
        BT_DBG("parent %p, sk %p", parent, sk);
 
        sock_hold(sk);
-       lock_sock(sk);
+
+       if (bh)
+               bh_lock_sock_nested(sk);
+       else
+               lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
+
        list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
        bt_sk(sk)->parent = parent;
-       release_sock(sk);
+
+       if (bh)
+               bh_unlock_sock(sk);
+       else
+               release_sock(sk);
+
        parent->sk_ack_backlog++;
 }
 EXPORT_SYMBOL(bt_accept_enqueue);
@@ -450,7 +460,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock,
        if (sk->sk_state == BT_LISTEN)
                return bt_accept_poll(sk);
 
-       if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
+       if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
                mask |= POLLERR |
                        (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
 
@@ -460,7 +470,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock,
        if (sk->sk_shutdown == SHUTDOWN_MASK)
                mask |= POLLHUP;
 
-       if (!skb_queue_empty(&sk->sk_receive_queue))
+       if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
                mask |= POLLIN | POLLRDNORM;
 
        if (sk->sk_state == BT_CLOSED)