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.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 0c31be306572..bccc4c270087 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -485,6 +485,14 @@ static void tcp_tx_timestamp(struct sock *sk, u16 tsflags)
485 } 485 }
486} 486}
487 487
488static inline bool tcp_stream_is_readable(const struct tcp_sock *tp,
489 int target, struct sock *sk)
490{
491 return (tp->rcv_nxt - tp->copied_seq >= target) ||
492 (sk->sk_prot->stream_memory_read ?
493 sk->sk_prot->stream_memory_read(sk) : false);
494}
495
488/* 496/*
489 * Wait for a TCP event. 497 * Wait for a TCP event.
490 * 498 *
@@ -554,7 +562,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
554 tp->urg_data) 562 tp->urg_data)
555 target++; 563 target++;
556 564
557 if (tp->rcv_nxt - tp->copied_seq >= target) 565 if (tcp_stream_is_readable(tp, target, sk))
558 mask |= EPOLLIN | EPOLLRDNORM; 566 mask |= EPOLLIN | EPOLLRDNORM;
559 567
560 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { 568 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {