tcp: do not call tcp_cleanup_rbuf() if we have a backlog
authorEric Dumazet <edumazet@google.com>
Mon, 15 Nov 2021 19:02:48 +0000 (11:02 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Nov 2021 13:10:35 +0000 (13:10 +0000)
Under pressure, tcp recvmsg() has logic to process the socket backlog,
but calls tcp_cleanup_rbuf() right before.

Avoiding sending ACK right before processing new segments makes
a lot of sense, as this decrease the number of ACK packets,
with no impact on effective ACK clocking.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp.c

index 7b18861..d1949fd 100644 (file)
@@ -2436,12 +2436,11 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
                        }
                }
 
-               tcp_cleanup_rbuf(sk, copied);
-
                if (copied >= target) {
                        /* Do not sleep, just process backlog. */
                        __sk_flush_backlog(sk);
                } else {
+                       tcp_cleanup_rbuf(sk, copied);
                        sk_defer_free_flush(sk);
                        sk_wait_data(sk, &timeo, last);
                }