aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorIlpo Järvinen <[email protected]>2008-01-31 04:06:02 +0000
committerDavid S. Miller <[email protected]>2008-02-01 03:27:22 +0000
commitad1984e844fb6edaa8b9984be23669f4e19168be (patch)
tree9f31eed6ad22ce54c3cef701854d3568d4eb8fa3 /net/ipv4/tcp_input.c
parent[NETNS]: Fix race between put_net() and netlink_kernel_create(). (diff)
downloadkernel-ad1984e844fb6edaa8b9984be23669f4e19168be.tar.gz
kernel-ad1984e844fb6edaa8b9984be23669f4e19168be.zip
[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 <[email protected]> and Krishna Kumar2 <[email protected]> for trying with my debug patches. Signed-off-by: Ilpo Järvinen <[email protected]> Tested-by: Dave Young <[email protected]> Tested-by: Krishna Kumar2 <[email protected]> Cc: "David S. Miller" <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: David S. Miller <[email protected]>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c2
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)
tp->lost_skb_hint = skb;
tp->lost_cnt_hint = cnt;
- if (tcp_is_fack(tp) ||
+ if (tcp_is_fack(tp) || tcp_is_reno(tp) ||
(TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED))
cnt += tcp_skb_pcount(skb);