| From 3dde7861ebc8d13c1bff35bf82f86df8f03674f0 Mon Sep 17 00:00:00 2001 |
| From: Yuchung Cheng <ycheng@google.com> |
| Date: Mon, 29 Apr 2013 08:44:51 +0000 |
| Subject: tcp: reset timer after any SYNACK retransmit |
| |
| |
| From: Yuchung Cheng <ycheng@google.com> |
| |
| [ Upstream commit cd75eff64dae8856afbf6ef0f0ca3c145465d8e0 ] |
| |
| Linux immediately returns SYNACK on (spurious) SYN retransmits, but |
| keeps the SYNACK timer running independently. Thus the timer may |
| fire right after the SYNACK retransmit and causes a SYN-SYNACK |
| cross-fire burst. |
| |
| Adopt the fast retransmit/recovery idea in established state by |
| re-arming the SYNACK timer after the fast (SYNACK) retransmit. The |
| timer may fire late up to 500ms due to the current SYNACK timer wheel, |
| but it's OK to be conservative when network is congested. Eric's new |
| listener design should address this issue. |
| |
| Signed-off-by: Yuchung Cheng <ycheng@google.com> |
| Acked-by: Eric Dumazet <edumazet@google.com> |
| Acked-by: Neal Cardwell <ncardwell@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/tcp_minisocks.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/net/ipv4/tcp_minisocks.c |
| +++ b/net/ipv4/tcp_minisocks.c |
| @@ -583,8 +583,13 @@ struct sock *tcp_check_req(struct sock * |
| * |
| * Note that even if there is new data in the SYN packet |
| * they will be thrown away too. |
| + * |
| + * Reset timer after retransmitting SYNACK, similar to |
| + * the idea of fast retransmit in recovery. |
| */ |
| - inet_rtx_syn_ack(sk, req); |
| + if (!inet_rtx_syn_ack(sk, req)) |
| + req->expires = min(TCP_TIMEOUT_INIT << req->num_timeout, |
| + TCP_RTO_MAX) + jiffies; |
| return NULL; |
| } |
| |