net: use skb_queue_empty_lockless() in poll() handlers
[ Upstream commit 3ef7cf57c72f32f61e97f8fa401bc39ea1f1a5d4 ] Many poll() handlers are lockless. Using skb_queue_empty_lockless() instead of skb_queue_empty() is more appropriate. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
399c602993
commit
8e7bea4359
@ -743,7 +743,7 @@ capi_poll(struct file *file, poll_table *wait)
|
||||
|
||||
poll_wait(file, &(cdev->recvwait), wait);
|
||||
mask = POLLOUT | POLLWRNORM;
|
||||
if (!skb_queue_empty(&cdev->recvqueue))
|
||||
if (!skb_queue_empty_lockless(&cdev->recvqueue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
return mask;
|
||||
}
|
||||
|
@ -667,7 +667,7 @@ unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
mask |= POLLHUP;
|
||||
|
||||
/* readable? */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* writable? */
|
||||
|
@ -460,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);
|
||||
|
||||
@ -470,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)
|
||||
|
@ -953,7 +953,7 @@ static unsigned int caif_poll(struct file *file,
|
||||
mask |= POLLRDHUP;
|
||||
|
||||
/* readable? */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue) ||
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue) ||
|
||||
(sk->sk_shutdown & RCV_SHUTDOWN))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
|
@ -844,7 +844,7 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||
mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
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);
|
||||
|
||||
@ -854,7 +854,7 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||
mask |= POLLHUP;
|
||||
|
||||
/* readable? */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* Connection-based need to check for termination and startup */
|
||||
|
@ -574,7 +574,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
}
|
||||
/* This barrier is coupled with smp_wmb() in tcp_reset() */
|
||||
smp_rmb();
|
||||
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;
|
||||
|
||||
return mask;
|
||||
|
@ -2550,7 +2550,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
unsigned int mask = datagram_poll(file, sock, wait);
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (!skb_queue_empty(&udp_sk(sk)->reader_queue))
|
||||
if (!skb_queue_empty_lockless(&udp_sk(sk)->reader_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
@ -567,11 +567,11 @@ static unsigned int llcp_sock_poll(struct file *file, struct socket *sock,
|
||||
if (sk->sk_state == LLCP_LISTEN)
|
||||
return llcp_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);
|
||||
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
if (sk->sk_state == LLCP_CLOSED)
|
||||
|
@ -352,9 +352,9 @@ static unsigned int pn_socket_poll(struct file *file, struct socket *sock,
|
||||
|
||||
if (sk->sk_state == TCP_CLOSE)
|
||||
return POLLERR;
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
if (!skb_queue_empty(&pn->ctrlreq_queue))
|
||||
if (!skb_queue_empty_lockless(&pn->ctrlreq_queue))
|
||||
mask |= POLLPRI;
|
||||
if (!mask && sk->sk_state == TCP_CLOSE_WAIT)
|
||||
return POLLHUP;
|
||||
|
@ -7371,7 +7371,7 @@ unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
mask = 0;
|
||||
|
||||
/* Is there any exceptional events? */
|
||||
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);
|
||||
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
||||
@ -7380,7 +7380,7 @@ unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
mask |= POLLHUP;
|
||||
|
||||
/* Is it readable? Reconsider this code with TCP-style support. */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* The association is either gone or not ready. */
|
||||
|
@ -714,14 +714,14 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
|
||||
/* fall thru' */
|
||||
case TIPC_LISTEN:
|
||||
case TIPC_CONNECTING:
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= (POLLIN | POLLRDNORM);
|
||||
break;
|
||||
case TIPC_OPEN:
|
||||
if (!tsk->cong_link_cnt)
|
||||
mask |= POLLOUT;
|
||||
if (tipc_sk_type_connectionless(sk) &&
|
||||
(!skb_queue_empty(&sk->sk_receive_queue)))
|
||||
(!skb_queue_empty_lockless(&sk->sk_receive_queue)))
|
||||
mask |= (POLLIN | POLLRDNORM);
|
||||
break;
|
||||
case TIPC_DISCONNECTING:
|
||||
|
@ -2665,7 +2665,7 @@ static unsigned int unix_poll(struct file *file, struct socket *sock, poll_table
|
||||
mask |= POLLRDHUP | POLLIN | POLLRDNORM;
|
||||
|
||||
/* readable? */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* Connection-based need to check for termination and startup */
|
||||
@ -2693,7 +2693,7 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,
|
||||
mask = 0;
|
||||
|
||||
/* exceptional events? */
|
||||
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);
|
||||
|
||||
@ -2703,7 +2703,7 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,
|
||||
mask |= POLLHUP;
|
||||
|
||||
/* readable? */
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* Connection-based need to check for termination and startup */
|
||||
|
@ -880,7 +880,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock,
|
||||
* the queue and write as long as the socket isn't shutdown for
|
||||
* sending.
|
||||
*/
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue) ||
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue) ||
|
||||
(sk->sk_shutdown & RCV_SHUTDOWN)) {
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user