diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-10-09 04:24:15 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:52:08 -0400 |
commit | 91fed7a15c9222af29a653ecb0ee72cff178fdd8 (patch) | |
tree | 53c72bd6c1bf3216e46565761bc34ea066f5b995 /net/ipv4/tcp_input.c | |
parent | 0dde7b5404a3d52dcd9ce66d46197f6c3ca97dda (diff) |
[TCP]: Make fackets_out accurate
Substraction for fackets_out is unconditional when snd_una
advances, thus there's no need to do it inside the loop. Just
make sure correct bounds are honored.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index f9e4d7ad68b7..46aedd6ca020 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2299,8 +2299,8 @@ tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag) | |||
2299 | * 1. Reno does not count dupacks (sacked_out) automatically. */ | 2299 | * 1. Reno does not count dupacks (sacked_out) automatically. */ |
2300 | if (!tp->packets_out) | 2300 | if (!tp->packets_out) |
2301 | tp->sacked_out = 0; | 2301 | tp->sacked_out = 0; |
2302 | /* 2. SACK counts snd_fack in packets inaccurately. */ | 2302 | |
2303 | if (tp->sacked_out == 0) | 2303 | if (WARN_ON(!tp->sacked_out && tp->fackets_out)) |
2304 | tp->fackets_out = 0; | 2304 | tp->fackets_out = 0; |
2305 | 2305 | ||
2306 | /* Now state machine starts. | 2306 | /* Now state machine starts. |
@@ -2568,10 +2568,6 @@ static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb, | |||
2568 | } else if (*seq_rtt < 0) | 2568 | } else if (*seq_rtt < 0) |
2569 | *seq_rtt = now - scb->when; | 2569 | *seq_rtt = now - scb->when; |
2570 | 2570 | ||
2571 | if (tp->fackets_out) { | ||
2572 | __u32 dval = min(tp->fackets_out, packets_acked); | ||
2573 | tp->fackets_out -= dval; | ||
2574 | } | ||
2575 | /* hint's skb might be NULL but we don't need to care */ | 2571 | /* hint's skb might be NULL but we don't need to care */ |
2576 | tp->fastpath_cnt_hint -= min_t(u32, packets_acked, | 2572 | tp->fastpath_cnt_hint -= min_t(u32, packets_acked, |
2577 | tp->fastpath_cnt_hint); | 2573 | tp->fastpath_cnt_hint); |
@@ -2657,7 +2653,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2657 | seq_rtt = now - scb->when; | 2653 | seq_rtt = now - scb->when; |
2658 | last_ackt = skb->tstamp; | 2654 | last_ackt = skb->tstamp; |
2659 | } | 2655 | } |
2660 | tcp_dec_pcount_approx(&tp->fackets_out, skb); | ||
2661 | tp->packets_out -= tcp_skb_pcount(skb); | 2656 | tp->packets_out -= tcp_skb_pcount(skb); |
2662 | tcp_unlink_write_queue(skb, sk); | 2657 | tcp_unlink_write_queue(skb, sk); |
2663 | sk_stream_free_skb(sk, skb); | 2658 | sk_stream_free_skb(sk, skb); |
@@ -2672,6 +2667,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2672 | tcp_ack_update_rtt(sk, acked, seq_rtt); | 2667 | tcp_ack_update_rtt(sk, acked, seq_rtt); |
2673 | tcp_rearm_rto(sk); | 2668 | tcp_rearm_rto(sk); |
2674 | 2669 | ||
2670 | tp->fackets_out -= min(pkts_acked, tp->fackets_out); | ||
2675 | if (tcp_is_reno(tp)) | 2671 | if (tcp_is_reno(tp)) |
2676 | tcp_remove_reno_sacks(sk, pkts_acked); | 2672 | tcp_remove_reno_sacks(sk, pkts_acked); |
2677 | 2673 | ||