tcp: set recv_skip_hint when tcp_inq is less than PAGE_SIZE
authorSoheil Hassas Yeganeh <soheil@google.com>
Wed, 26 Sep 2018 20:57:03 +0000 (16:57 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Oct 2018 05:36:56 +0000 (22:36 -0700)
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 <soheil@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp.c

index dcf51fb..78ac4d2 100644 (file)
@@ -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) {