From: Soheil Hassas Yeganeh <soh...@google.com>

When we have less than PAGE_SIZE of data on receive queue,
we set recv_skip_hint to 0. Instead, set it to the actual
number of bytes available.

Signed-off-by: Soheil Hassas Yeganeh <soh...@google.com>
Signed-off-by: Eric Dumazet <eduma...@google.com>
---
 net/ipv4/tcp.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 69c236943f56..3e17501fc1a1 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1753,6 +1753,7 @@ static int tcp_zerocopy_receive(struct sock *sk,
        struct vm_area_struct *vma;
        struct sk_buff *skb = NULL;
        struct tcp_sock *tp;
+       int inq;
        int ret;
 
        if (address & (PAGE_SIZE - 1) || address != zc->address)
@@ -1773,12 +1774,15 @@ static int tcp_zerocopy_receive(struct sock *sk,
 
        tp = tcp_sk(sk);
        seq = tp->copied_seq;
-       zc->length = min_t(u32, zc->length, tcp_inq(sk));
+       inq = tcp_inq(sk);
+       zc->length = min_t(u32, zc->length, inq);
        zc->length &= ~(PAGE_SIZE - 1);
-
-       zap_page_range(vma, address, zc->length);
-
-       zc->recv_skip_hint = 0;
+       if (zc->length) {
+               zap_page_range(vma, address, zc->length);
+               zc->recv_skip_hint = 0;
+       } else {
+               zc->recv_skip_hint = inq;
+       }
        ret = 0;
        while (length + PAGE_SIZE <= zc->length) {
                if (zc->recv_skip_hint < PAGE_SIZE) {
-- 
2.19.0.605.g01d371f741-goog

Reply via email to