diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2008-01-30 23:06:02 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-31 22:27:22 -0500 |
commit | ad1984e844fb6edaa8b9984be23669f4e19168be (patch) | |
tree | 9f31eed6ad22ce54c3cef701854d3568d4eb8fa3 /net/ipv4/tcp_input.c | |
parent | 23fe18669e7fdaf5b229747858d943a723124e2e (diff) |
[TCP]: NewReno must count every skb while marking losses
NewReno should add cnt per skb (as with FACK) instead of depending on
SACKED_ACKED bits which won't be set with it at all. Effectively,
NewReno should always exists after the first iteration anyway (or
immediately if there's already head in lost_out.
This was fixed earlier in net-2.6.25 but got reverted among other
stuff and I didn't notice that this is still necessary (actually
wasn't even considering this case while trying to figure out the
reports because I lived with different kind of code than it in reality
was).
This should solve the WARN_ONs in TCP code that as a result of this
triggered multiple times in every place we check for this invariant.
Special thanks to Dave Young <hidave.darkstar@gmail.com> and Krishna
Kumar2 <krkumar2@in.ibm.com> for trying with my debug patches.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Tested-by: Dave Young <hidave.darkstar@gmail.com>
Tested-by: Krishna Kumar2 <krkumar2@in.ibm.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | 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 fa2c85ca5bc3..19c449f62672 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2153,7 +2153,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int fast_rexmit) | |||
2153 | tp->lost_skb_hint = skb; | 2153 | tp->lost_skb_hint = skb; |
2154 | tp->lost_cnt_hint = cnt; | 2154 | tp->lost_cnt_hint = cnt; |
2155 | 2155 | ||
2156 | if (tcp_is_fack(tp) || | 2156 | if (tcp_is_fack(tp) || tcp_is_reno(tp) || |
2157 | (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) | 2157 | (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) |
2158 | cnt += tcp_skb_pcount(skb); | 2158 | cnt += tcp_skb_pcount(skb); |
2159 | 2159 | ||