diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-10-18 08:07:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-10-18 08:07:57 -0400 |
commit | df2e014bfbbf26d160e1bf47b05fc05c96205e2b (patch) | |
tree | a474eb50c7d22be7d725ff0f6f6e8cb8d84c4eae /net | |
parent | bfaae0f04c68bafc12ec50c6922d71a90deea3e2 (diff) |
[TCP]: Remove lost_retrans zero seqno special cases
Both high-sack detection and new lowest seq variables have
unnecessary zero special case which are now removed by setting
safe initial seqnos.
This also fixes problem which caused zero received_upto being
passed to tcp_mark_lost_retrans which confused after relations
within the marker loop causing incorrect TCPCB_SACKED_RETRANS
clearing. The problem was noticed because of a performance
report from TAKANO Ryousei <takano@axe-inc.co.jp>.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Acked-by: Ryousei Takano <takano-ryousei@aist.go.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/tcp_input.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 0f00966b1784..9288220b73a8 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1121,7 +1121,7 @@ static int tcp_mark_lost_retrans(struct sock *sk, u32 received_upto) | |||
1121 | struct sk_buff *skb; | 1121 | struct sk_buff *skb; |
1122 | int flag = 0; | 1122 | int flag = 0; |
1123 | int cnt = 0; | 1123 | int cnt = 0; |
1124 | u32 new_low_seq = 0; | 1124 | u32 new_low_seq = tp->snd_nxt; |
1125 | 1125 | ||
1126 | tcp_for_write_queue(skb, sk) { | 1126 | tcp_for_write_queue(skb, sk) { |
1127 | u32 ack_seq = TCP_SKB_CB(skb)->ack_seq; | 1127 | u32 ack_seq = TCP_SKB_CB(skb)->ack_seq; |
@@ -1153,7 +1153,7 @@ static int tcp_mark_lost_retrans(struct sock *sk, u32 received_upto) | |||
1153 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSTRETRANSMIT); | 1153 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSTRETRANSMIT); |
1154 | } | 1154 | } |
1155 | } else { | 1155 | } else { |
1156 | if (!new_low_seq || before(ack_seq, new_low_seq)) | 1156 | if (before(ack_seq, new_low_seq)) |
1157 | new_low_seq = ack_seq; | 1157 | new_low_seq = ack_seq; |
1158 | cnt += tcp_skb_pcount(skb); | 1158 | cnt += tcp_skb_pcount(skb); |
1159 | } | 1159 | } |
@@ -1242,7 +1242,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1242 | int num_sacks = (ptr[1] - TCPOLEN_SACK_BASE)>>3; | 1242 | int num_sacks = (ptr[1] - TCPOLEN_SACK_BASE)>>3; |
1243 | int reord = tp->packets_out; | 1243 | int reord = tp->packets_out; |
1244 | int prior_fackets; | 1244 | int prior_fackets; |
1245 | u32 highest_sack_end_seq = 0; | 1245 | u32 highest_sack_end_seq = tp->lost_retrans_low; |
1246 | int flag = 0; | 1246 | int flag = 0; |
1247 | int found_dup_sack = 0; | 1247 | int found_dup_sack = 0; |
1248 | int cached_fack_count; | 1248 | int cached_fack_count; |