aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r--net/ipv4/tcp.c23
1 files changed, 6 insertions, 17 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index c9d00ef54dec..dec47e6789e7 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -494,32 +494,21 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp,
494} 494}
495 495
496/* 496/*
497 * Wait for a TCP event. 497 * Socket is not locked. We are protected from async events by poll logic and
498 * 498 * correct handling of state changes made by other threads is impossible in
499 * Note that we don't need to lock the socket, as the upper poll layers 499 * any case.
500 * take care of normal races (between the test and the event) and we don't
501 * go look at any of the socket buffers directly.
502 */ 500 */
503__poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) 501__poll_t tcp_poll_mask(struct socket *sock, __poll_t events)
504{ 502{
505 __poll_t mask;
506 struct sock *sk = sock->sk; 503 struct sock *sk = sock->sk;
507 const struct tcp_sock *tp = tcp_sk(sk); 504 const struct tcp_sock *tp = tcp_sk(sk);
505 __poll_t mask = 0;
508 int state; 506 int state;
509 507
510 sock_poll_wait(file, sk_sleep(sk), wait);
511
512 state = inet_sk_state_load(sk); 508 state = inet_sk_state_load(sk);
513 if (state == TCP_LISTEN) 509 if (state == TCP_LISTEN)
514 return inet_csk_listen_poll(sk); 510 return inet_csk_listen_poll(sk);
515 511
516 /* Socket is not locked. We are protected from async events
517 * by poll logic and correct handling of state changes
518 * made by other threads is impossible in any case.
519 */
520
521 mask = 0;
522
523 /* 512 /*
524 * EPOLLHUP is certainly not done right. But poll() doesn't 513 * EPOLLHUP is certainly not done right. But poll() doesn't
525 * have a notion of HUP in just one direction, and for a 514 * have a notion of HUP in just one direction, and for a
@@ -600,7 +589,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
600 589
601 return mask; 590 return mask;
602} 591}
603EXPORT_SYMBOL(tcp_poll); 592EXPORT_SYMBOL(tcp_poll_mask);
604 593
605int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) 594int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
606{ 595{