diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-09-20 14:37:19 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:52:12 -0400 |
commit | b76892051cf1c04d95872838e70146f65e3b9d75 (patch) | |
tree | 475050b8e41eb317144465b1e2b9255fbad188b4 /net/ipv4/tcp_input.c | |
parent | c96fd3d461fa495400df24be3b3b66f0e0b152f9 (diff) |
[TCP]: Avoid clearing sacktag hint in trivial situations
There's no reason to clear the sacktag skb hint when small part
of the rexmit queue changes. Account changes (if any) instead when
fragmenting/collapsing. RTO/FRTO do not touch SACKED_ACKED bits so
no need to discard SACK tag hint at all.
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 | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 65b9f274a774..4c10d9cad20f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1671,7 +1671,7 @@ static void tcp_enter_frto_loss(struct sock *sk, int allowed_segments, int flag) | |||
1671 | tp->high_seq = tp->frto_highmark; | 1671 | tp->high_seq = tp->frto_highmark; |
1672 | TCP_ECN_queue_cwr(tp); | 1672 | TCP_ECN_queue_cwr(tp); |
1673 | 1673 | ||
1674 | tcp_clear_all_retrans_hints(tp); | 1674 | tcp_clear_retrans_hints_partial(tp); |
1675 | } | 1675 | } |
1676 | 1676 | ||
1677 | void tcp_clear_retrans(struct tcp_sock *tp) | 1677 | void tcp_clear_retrans(struct tcp_sock *tp) |
@@ -1711,10 +1711,14 @@ void tcp_enter_loss(struct sock *sk, int how) | |||
1711 | tp->bytes_acked = 0; | 1711 | tp->bytes_acked = 0; |
1712 | tcp_clear_retrans(tp); | 1712 | tcp_clear_retrans(tp); |
1713 | 1713 | ||
1714 | /* Push undo marker, if it was plain RTO and nothing | 1714 | if (!how) { |
1715 | * was retransmitted. */ | 1715 | /* Push undo marker, if it was plain RTO and nothing |
1716 | if (!how) | 1716 | * was retransmitted. */ |
1717 | tp->undo_marker = tp->snd_una; | 1717 | tp->undo_marker = tp->snd_una; |
1718 | tcp_clear_retrans_hints_partial(tp); | ||
1719 | } else { | ||
1720 | tcp_clear_all_retrans_hints(tp); | ||
1721 | } | ||
1718 | 1722 | ||
1719 | tcp_for_write_queue(skb, sk) { | 1723 | tcp_for_write_queue(skb, sk) { |
1720 | if (skb == tcp_send_head(sk)) | 1724 | if (skb == tcp_send_head(sk)) |
@@ -1741,8 +1745,6 @@ void tcp_enter_loss(struct sock *sk, int how) | |||
1741 | TCP_ECN_queue_cwr(tp); | 1745 | TCP_ECN_queue_cwr(tp); |
1742 | /* Abort FRTO algorithm if one is in progress */ | 1746 | /* Abort FRTO algorithm if one is in progress */ |
1743 | tp->frto_counter = 0; | 1747 | tp->frto_counter = 0; |
1744 | |||
1745 | tcp_clear_all_retrans_hints(tp); | ||
1746 | } | 1748 | } |
1747 | 1749 | ||
1748 | static int tcp_check_sack_reneging(struct sock *sk) | 1750 | static int tcp_check_sack_reneging(struct sock *sk) |