From: Yuchung Cheng Date: Fri, 24 Sep 2010 13:22:06 +0000 (+0000) Subject: tcp: fix TSO FACK loss marking in tcp_mark_head_lost X-Git-Tag: v2.6.36-rc6~6^2~6 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=b3de7559afbb7a8a35b4be975a6adf6c5e3cdca0;p=~shefty%2Frdma-dev.git tcp: fix TSO FACK loss marking in tcp_mark_head_lost When TCP uses FACK algorithm to mark lost packets in tcp_mark_head_lost(), if the number of packets in the (TSO) skb is greater than the number of packets that should be marked lost, TCP incorrectly exits the loop and marks no packets lost in the skb. This underestimates tp->lost_out and affects the recovery/retransmission. This patch fargments the skb and marks the correct amount of packets lost. Signed-off-by: Yuchung Cheng Acked-by: Ilpo Järvinen Signed-off-by: David S. Miller --- diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 149e79ac289..b55f60f6fcb 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2545,7 +2545,8 @@ static void tcp_mark_head_lost(struct sock *sk, int packets) cnt += tcp_skb_pcount(skb); if (cnt > packets) { - if (tcp_is_sack(tp) || (oldcnt >= packets)) + if ((tcp_is_sack(tp) && !tcp_is_fack(tp)) || + (oldcnt >= packets)) break; mss = skb_shinfo(skb)->gso_size;