From patchwork Sat Sep 20 17:52:28 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ilpo_J=C3=A4rvinen?= X-Patchwork-Id: 733 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 9417DDDEE7 for ; Sun, 21 Sep 2008 03:53:14 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751304AbYITRxB (ORCPT ); Sat, 20 Sep 2008 13:53:01 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751296AbYITRxA (ORCPT ); Sat, 20 Sep 2008 13:53:00 -0400 Received: from courier.cs.helsinki.fi ([128.214.9.1]:37645 "EHLO mail.cs.helsinki.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751024AbYITRwm (ORCPT ); Sat, 20 Sep 2008 13:52:42 -0400 Received: from wrl-59.cs.helsinki.fi (wrl-59.cs.helsinki.fi [128.214.166.179]) (AUTH: PLAIN cs-relay, TLS: TLSv1/SSLv3,256bits,AES256-SHA) by mail.cs.helsinki.fi with esmtp; Sat, 20 Sep 2008 20:52:34 +0300 id 0005BEDE.48D53862.00002D7D Received: by wrl-59.cs.helsinki.fi (Postfix, from userid 50795) id 8658BA00AA; Sat, 20 Sep 2008 20:52:34 +0300 (EEST) From: "=?ISO-8859-1?Q?Ilpo_J=E4rvinen?=" To: David Miller Cc: netdev@vger.kernel.org, "=?utf-8?q?Ilpo=20J=E4rvinen?=" Subject: [PATCH net-next 10/15] tcp: remove tp->lost_out guard to make joining diff nicer Date: Sat, 20 Sep 2008 20:52:28 +0300 Message-Id: <1221933153-11874-11-git-send-email-ilpo.jarvinen@helsinki.fi> X-Mailer: git-send-email 1.5.4.2.156.ge3c5 In-Reply-To: <1221933153-11874-10-git-send-email-ilpo.jarvinen@helsinki.fi> References: <1221933153-11874-1-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-2-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-3-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-4-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-5-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-6-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-7-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-8-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-9-git-send-email-ilpo.jarvinen@helsinki.fi> <1221933153-11874-10-git-send-email-ilpo.jarvinen@helsinki.fi> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The validity of the retransmit_high must then be ensured if no L'ed skb exits! This makes only minor change to behavior, we now have to iterate the head to find out that the loop terminates. And it's anyway quite unlikely scenario to have !tp->lost_out in here... Signed-off-by: Ilpo Järvinen --- net/ipv4/tcp_output.c | 75 +++++++++++++++++++++++++------------------------ 1 files changed, 38 insertions(+), 37 deletions(-) diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index d5f53f8..fc7bfd6 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2036,53 +2036,54 @@ void tcp_xmit_retransmit_queue(struct sock *sk) struct sk_buff *skb; int mib_idx; + if (!tp->lost_out) + tp->retransmit_high = tp->snd_una; + if (tp->retransmit_skb_hint) skb = tp->retransmit_skb_hint; else skb = tcp_write_queue_head(sk); /* First pass: retransmit lost packets. */ - if (tp->lost_out) { - tcp_for_write_queue_from(skb, sk) { - __u8 sacked = TCP_SKB_CB(skb)->sacked; + tcp_for_write_queue_from(skb, sk) { + __u8 sacked = TCP_SKB_CB(skb)->sacked; - if (skb == tcp_send_head(sk)) - break; - /* we could do better than to assign each time */ - tp->retransmit_skb_hint = skb; - - /* Assume this retransmit will generate - * only one packet for congestion window - * calculation purposes. This works because - * tcp_retransmit_skb() will chop up the - * packet to be MSS sized and all the - * packet counting works out. - */ - if (tcp_packets_in_flight(tp) >= tp->snd_cwnd) - return; - if (!before(TCP_SKB_CB(skb)->seq, tp->retransmit_high)) - break; - if (sacked & (TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS)) - continue; + if (skb == tcp_send_head(sk)) + break; + /* we could do better than to assign each time */ + tp->retransmit_skb_hint = skb; + + /* Assume this retransmit will generate + * only one packet for congestion window + * calculation purposes. This works because + * tcp_retransmit_skb() will chop up the + * packet to be MSS sized and all the + * packet counting works out. + */ + if (tcp_packets_in_flight(tp) >= tp->snd_cwnd) + return; + if (!before(TCP_SKB_CB(skb)->seq, tp->retransmit_high)) + break; + if (sacked & (TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS)) + continue; - if (!(sacked & TCPCB_LOST)) - continue; + if (!(sacked & TCPCB_LOST)) + continue; - if (tcp_retransmit_skb(sk, skb)) { - tp->retransmit_skb_hint = NULL; - return; - } - if (icsk->icsk_ca_state != TCP_CA_Loss) - mib_idx = LINUX_MIB_TCPFASTRETRANS; - else - mib_idx = LINUX_MIB_TCPSLOWSTARTRETRANS; - NET_INC_STATS_BH(sock_net(sk), mib_idx); - - if (skb == tcp_write_queue_head(sk)) - inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, - inet_csk(sk)->icsk_rto, - TCP_RTO_MAX); + if (tcp_retransmit_skb(sk, skb)) { + tp->retransmit_skb_hint = NULL; + return; } + if (icsk->icsk_ca_state != TCP_CA_Loss) + mib_idx = LINUX_MIB_TCPFASTRETRANS; + else + mib_idx = LINUX_MIB_TCPSLOWSTARTRETRANS; + NET_INC_STATS_BH(sock_net(sk), mib_idx); + + if (skb == tcp_write_queue_head(sk)) + inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, + inet_csk(sk)->icsk_rto, + TCP_RTO_MAX); } /* OK, demanded retransmission is finished. */