[PATCH 1/3] tcp FRTO: Fix fallback to conventional recovery
Stefan Bader
stefan.bader at canonical.com
Tue Jun 8 14:05:43 UTC 2010
From: Ilpo Järvinen <ilpo.jarvinen at helsinki.fi>
BugLink: http://bugs.launchpad.net/bugs/567394
[ upstream commit: a1c1f281b84a751fdb5ff919da3b09df7297619f ]
It seems that commit 009a2e3e4ec ("[TCP] FRTO: Improve
interoperability with other undo_marker users") run into
another land-mine which caused fallback to conventional
recovery to break:
1. Cumulative ACK arrives after FRTO retransmission
2. tcp_try_to_open sees zero retrans_out, clears retrans_stamp
which should be kept like in CA_Loss state it would be
3. undo_marker change allowed tcp_packet_delayed to return
true because of the cleared retrans_stamp once FRTO is
terminated causing LossUndo to occur, which means all loss
markings FRTO made are reverted.
This means that the conventional recovery basically recovered
one loss per RTT, which is not that efficient. It was quite
unobvious that the undo_marker change broken something like
this, I had a quite long session to track it down because of
the non-intuitiviness of the bug (luckily I had a trivial
reproducer at hand and I was also able to learn to use kprobes
in the process as well :-)).
This together with the NewReno+FRTO fix and FRTO in-order
workaround this fixes Damon's problems, this and the first
mentioned are enough to fix Bugzilla #10063.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen at helsinki.fi>
Reported-by: Damon L. Chesser <damon at damtek.com>
Tested-by: Damon L. Chesser <damon at damtek.com>
Tested-by: Sebastian Hyrwall <zibbe at cisko.org>
Signed-off-by: David S. Miller <davem at davemloft.net>
Signed-off-by: Chris Wright <chrisw at sous-sol.org>
(cherry-picked from commit 76ab0a7c88886400dd16870db65106215f3e4aa3 2.6.25.y)
Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
---
net/ipv4/tcp_input.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index b39f0d8..3267707 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2313,7 +2313,7 @@ static void tcp_try_to_open(struct sock *sk, int flag)
tcp_verify_left_out(tp);
- if (tp->retrans_out == 0)
+ if (!tp->frto_counter && tp->retrans_out == 0)
tp->retrans_stamp = 0;
if (flag&FLAG_ECE)
--
1.7.0.4
More information about the kernel-team
mailing list