Commit 1ef9696c909060ccdae3ade245ca88692b49285b

Authored by Alexey Kuznetsov
Committed by David S. Miller
1 parent 4eb327b517

[TCP]: Send ACKs each 2nd received segment.

It does not affect either mss-sized connections (obviously) or
connections controlled by Nagle (because there is only one small
segment in flight).

The idea is to record the fact that a small segment arrives on a
connection, where one small segment has already been received and
still not-ACKed. In this case ACK is forced after tcp_recvmsg() drains
receive buffer.

In other words, it is a "soft" each-2nd-segment ACK, which is enough
to preserve ACK clock even when ABC is enabled.

Signed-off-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 3 changed files with 9 additions and 3 deletions Side-by-side Diff

include/net/inet_connection_sock.h
... ... @@ -147,7 +147,8 @@
147 147 enum inet_csk_ack_state_t {
148 148 ICSK_ACK_SCHED = 1,
149 149 ICSK_ACK_TIMER = 2,
150   - ICSK_ACK_PUSHED = 4
  150 + ICSK_ACK_PUSHED = 4,
  151 + ICSK_ACK_PUSHED2 = 8
151 152 };
152 153  
153 154 extern void inet_csk_init_xmit_timers(struct sock *sk,
... ... @@ -955,8 +955,11 @@
955 955 * receive buffer and there was a small segment
956 956 * in queue.
957 957 */
958   - (copied > 0 && (icsk->icsk_ack.pending & ICSK_ACK_PUSHED) &&
959   - !icsk->icsk_ack.pingpong && !atomic_read(&sk->sk_rmem_alloc)))
  958 + (copied > 0 &&
  959 + ((icsk->icsk_ack.pending & ICSK_ACK_PUSHED2) ||
  960 + ((icsk->icsk_ack.pending & ICSK_ACK_PUSHED) &&
  961 + !icsk->icsk_ack.pingpong)) &&
  962 + !atomic_read(&sk->sk_rmem_alloc)))
960 963 time_to_ack = 1;
961 964 }
962 965  
net/ipv4/tcp_input.c
... ... @@ -156,6 +156,8 @@
156 156 return;
157 157 }
158 158 }
  159 + if (icsk->icsk_ack.pending & ICSK_ACK_PUSHED)
  160 + icsk->icsk_ack.pending |= ICSK_ACK_PUSHED2;
159 161 icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
160 162 }
161 163 }