Skip to content

Commit

Permalink
tcp: tso: remove tp->tso_deferred
Browse files Browse the repository at this point in the history
TSO relies on ability to defer sending a small amount of packets.
Heuristic is to wait for future ACKS in hope to send more packets at once.
Current algorithm uses a per socket tso_deferred field as a pseudo timer.

This pseudo timer relies on future ACK, but there is no guarantee
we receive them in time.

Fix would be to use a real timer, but cost of such timer is probably too
expensive for typical cases.

This patch changes the logic to test the time of last transmit,
because we should not add bursts of more than 1ms for any given flow.

We've used this patch for about two years at Google, before FQ/pacing
as it would reduce a fair amount of bursts.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Feb 28, 2015
1 parent 6588af6 commit 5f852eb
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 10 deletions.
1 change: 0 additions & 1 deletion include/linux/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,6 @@ struct tcp_sock {
u32 lost_out; /* Lost packets */
u32 sacked_out; /* SACK'd packets */
u32 fackets_out; /* FACK'd packets */
u32 tso_deferred;

/* from STCP, retrans queue hinting */
struct sk_buff* lost_skb_hint;
Expand Down
14 changes: 5 additions & 9 deletions net/ipv4/tcp_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -1763,9 +1763,10 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb,
if (icsk->icsk_ca_state != TCP_CA_Open)
goto send_now;

/* Defer for less than two clock ticks. */
if (tp->tso_deferred &&
(((u32)jiffies << 1) >> 1) - (tp->tso_deferred >> 1) > 1)
/* Avoid bursty behavior by allowing defer
* only if the last write was recent.
*/
if ((s32)(tcp_time_stamp - tp->lsndtime) > 0)
goto send_now;

in_flight = tcp_packets_in_flight(tp);
Expand Down Expand Up @@ -1807,19 +1808,14 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb,
goto send_now;
}

/* Ok, it looks like it is advisable to defer.
* Do not rearm the timer if already set to not break TCP ACK clocking.
*/
if (!tp->tso_deferred)
tp->tso_deferred = 1 | (jiffies << 1);
/* Ok, it looks like it is advisable to defer. */

if (cong_win < send_win && cong_win < skb->len)
*is_cwnd_limited = true;

return true;

send_now:
tp->tso_deferred = 0;
return false;
}

Expand Down

0 comments on commit 5f852eb

Please sign in to comment.