Netdev List
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org, TAKANO Ryousei <takano@axe-inc.co.jp>
Subject: [PATCH 7/7] [TCP]: Limit processing lost_retrans loop to work-to-do cases
Date: Thu, 11 Oct 2007 14:41:07 +0300	[thread overview]
Message-ID: <1192102867248-git-send-email-ilpo.jarvinen@helsinki.fi> (raw)
In-Reply-To: <11921028671668-git-send-email-ilpo.jarvinen@helsinki.fi>

This addition of lost_retrans_low to tcp_sock might be
unnecessary, it's not clear how often lost_retrans worker is
executed when there wasn't work to do.

Cc: TAKANO Ryousei <takano@axe-inc.co.jp>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
 include/linux/tcp.h   |    2 ++
 net/ipv4/tcp_input.c  |   14 +++++++++++---
 net/ipv4/tcp_output.c |    2 ++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9ff456e..c5b94c1 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -348,6 +348,8 @@ struct tcp_sock {
 	int     lost_cnt_hint;
 	int     retransmit_cnt_hint;
 
+	u32	lost_retrans_low;	/* Sent seq after any rxmit (lowest) */
+
 	u16	advmss;		/* Advertised MSS			*/
 	u16	prior_ssthresh; /* ssthresh saved at recovery start	*/
 	u32	lost_out;	/* Lost packets			*/
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index d5e0fcc..0a42e93 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1112,7 +1112,8 @@ static int tcp_is_sackblock_valid(struct tcp_sock *tp, int is_dsack,
  *
  * Search retransmitted skbs from write_queue that were sent when snd_nxt was
  * less than what is now known to be received by the other end (derived from
- * SACK blocks by the caller).
+ * SACK blocks by the caller). Also calculate the lowest snd_nxt among the
+ * remaining retransmitted skbs to avoid some costly processing per ACKs.
  */
 static int tcp_mark_lost_retrans(struct sock *sk, u32 received_upto)
 {
@@ -1120,6 +1121,7 @@ static int tcp_mark_lost_retrans(struct sock *sk, u32 received_upto)
 	struct sk_buff *skb;
 	int flag = 0;
 	int cnt = 0;
+	u32 new_low_seq = 0;
 
 	tcp_for_write_queue(skb, sk) {
 		u32 ack_seq = TCP_SKB_CB(skb)->ack_seq;
@@ -1151,9 +1153,15 @@ static int tcp_mark_lost_retrans(struct sock *sk, u32 received_upto)
 				NET_INC_STATS_BH(LINUX_MIB_TCPLOSTRETRANSMIT);
 			}
 		} else {
+			if (!new_low_seq || before(ack_seq, new_low_seq))
+				new_low_seq = ack_seq;
 			cnt += tcp_skb_pcount(skb);
 		}
 	}
+
+	if (tp->retrans_out)
+		tp->lost_retrans_low = new_low_seq;
+
 	return flag;
 }
 
@@ -1481,8 +1489,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
 		}
 	}
 
-	if (tp->retrans_out && highest_sack_end_seq &&
-	    after(highest_sack_end_seq, tp->high_seq) &&
+	if (tp->retrans_out &&
+	    after(highest_sack_end_seq, tp->lost_retrans_low) &&
 	    icsk->icsk_ca_state == TCP_CA_Recovery)
 		flag |= tcp_mark_lost_retrans(sk, highest_sack_end_seq);
 
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 5329675..324b420 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1914,6 +1914,8 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
 				printk(KERN_DEBUG "retrans_out leaked.\n");
 		}
 #endif
+		if (!tp->retrans_out)
+			tp->lost_retrans_low = tp->snd_nxt;
 		TCP_SKB_CB(skb)->sacked |= TCPCB_RETRANS;
 		tp->retrans_out += tcp_skb_pcount(skb);
 
-- 
1.5.0.6


  reply	other threads:[~2007-10-11 11:41 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-11 11:41 [PATCH net-2.6 0/7] TCP: small changes/fixes + lost_retrans brokeness fix Ilpo Järvinen
2007-10-11 11:41 ` [PATCH 1/7] [TCP]: Add bytes_acked (ABC) clearing to FRTO too Ilpo Järvinen
2007-10-11 11:41   ` [PATCH 2/7] [TCP]: Fix mark_head_lost to ignore R-bit when trying to mark L Ilpo Järvinen
2007-10-11 11:41     ` [PATCH 3/7] [TCP]: Kill almost unused variable pcount from sacktag Ilpo Järvinen
2007-10-11 11:41       ` [PATCH 4/7] [TCP]: Extract tcp_match_queue_to_sack from sacktag code Ilpo Järvinen
2007-10-11 11:41         ` [PATCH 5/7] [TCP]: No need to re-count fackets_out/sacked_out at RTO Ilpo Järvinen
2007-10-11 11:41           ` [PATCH 6/7] [TCP]: Fix lost_retrans loop vs fastpath problems Ilpo Järvinen
2007-10-11 11:41             ` Ilpo Järvinen [this message]
2007-10-12  0:36               ` [PATCH 7/7] [TCP]: Limit processing lost_retrans loop to work-to-do cases David Miller
2007-10-18  3:50                 ` TAKANO Ryousei
2007-10-18  9:40                   ` [PATCH] [TCP]: Add highest_sack_end_seq check back to lost_retrans call Ilpo Järvinen
2007-10-18 10:17                     ` [PATCH] [TCP]: Remove lost_retrans zero special cases Ilpo Järvinen
2007-10-18 10:55                       ` TAKANO Ryousei
2007-10-18 11:07                         ` Ilpo Järvinen
2007-10-18 12:08                           ` David Miller
2007-10-12  0:35             ` [PATCH 6/7] [TCP]: Fix lost_retrans loop vs fastpath problems David Miller
2007-10-12  0:35           ` [PATCH 5/7] [TCP]: No need to re-count fackets_out/sacked_out at RTO David Miller
2007-10-12  0:34         ` [PATCH 4/7] [TCP]: Extract tcp_match_queue_to_sack from sacktag code David Miller
2007-10-12  0:34       ` [PATCH 3/7] [TCP]: Kill almost unused variable pcount from sacktag David Miller
2007-10-12  0:33     ` [PATCH 2/7] [TCP]: Fix mark_head_lost to ignore R-bit when trying to mark L David Miller
2007-10-12  0:32   ` [PATCH 1/7] [TCP]: Add bytes_acked (ABC) clearing to FRTO too David Miller
2007-10-12  0:37 ` [PATCH net-2.6 0/7] TCP: small changes/fixes + lost_retrans brokeness fix David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1192102867248-git-send-email-ilpo.jarvinen@helsinki.fi \
    --to=ilpo.jarvinen@helsinki.fi \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=takano@axe-inc.co.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox