Skip to content

Commit

Permalink
tcp: Make shifting not clear the hints
Browse files Browse the repository at this point in the history
The earlier version was just very basic one which is "playing
safe" by always clearing the hints. However, clearing of a hint
is extremely costly operation with large windows, so it must be
avoided at all cost whenever possible, there is a way with
shifting too achieve not-clearing.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ilpo Järvinen authored and David S. Miller committed Nov 25, 2008
1 parent 832d11c commit 92ee76b
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions net/ipv4/tcp_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -1379,6 +1379,11 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *prev,

BUG_ON(!pcount);

/* Tweak before seqno plays */
if (!tcp_is_fack(tp) && tcp_is_sack(tp) && tp->lost_skb_hint &&
!before(TCP_SKB_CB(tp->lost_skb_hint)->seq, TCP_SKB_CB(skb)->seq))
tp->lost_cnt_hint += pcount;

TCP_SKB_CB(prev)->end_seq += shifted;
TCP_SKB_CB(skb)->seq += shifted;

Expand Down Expand Up @@ -1408,15 +1413,22 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *prev,
/* Difference in this won't matter, both ACKed by the same cumul. ACK */
TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);

tcp_clear_all_retrans_hints(tp);

if (skb->len > 0) {
BUG_ON(!tcp_skb_pcount(skb));
return 0;
}

/* Whole SKB was eaten :-) */

if (skb == tp->retransmit_skb_hint)
tp->retransmit_skb_hint = prev;
if (skb == tp->scoreboard_skb_hint)
tp->scoreboard_skb_hint = prev;
if (skb == tp->lost_skb_hint) {
tp->lost_skb_hint = prev;
tp->lost_cnt_hint -= tcp_skb_pcount(prev);
}

TCP_SKB_CB(skb)->flags |= TCP_SKB_CB(prev)->flags;
if (skb == tcp_highest_sack(sk))
tcp_advance_highest_sack(sk, skb);
Expand Down

0 comments on commit 92ee76b

Please sign in to comment.