Skip to content

Commit

Permalink
tcp: defer xmit timer reset in tcp_xmit_retransmit_queue()
Browse files Browse the repository at this point in the history
As hinted in prior change ("tcp: refine tcp_pacing_delay()
for very low pacing rates"), it is probably best arming
the xmit timer only when all the packets have been scheduled,
rather than when the head of rtx queue has been re-sent.

This does matter for flows having extremely low pacing rates,
since their tp->tcp_wstamp_ns could be far in the future.

Note that the regular xmit path has a stronger limit
in tcp_small_queue_check(), meaning it is less likely to
go beyond the pacing horizon.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed May 7, 2020
1 parent 8dc242a commit 916e6d1
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions net/ipv4/tcp_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -3112,6 +3112,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
const struct inet_connection_sock *icsk = inet_csk(sk);
struct sk_buff *skb, *rtx_head, *hole = NULL;
struct tcp_sock *tp = tcp_sk(sk);
bool rearm_timer = false;
u32 max_segs;
int mib_idx;

Expand All @@ -3134,7 +3135,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)

segs = tp->snd_cwnd - tcp_packets_in_flight(tp);
if (segs <= 0)
return;
break;
sacked = TCP_SKB_CB(skb)->sacked;
/* In case tcp_shift_skb_data() have aggregated large skbs,
* we need to make sure not sending too bigs TSO packets
Expand All @@ -3159,10 +3160,10 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
continue;

if (tcp_small_queue_check(sk, skb, 1))
return;
break;

if (tcp_retransmit_skb(sk, skb, segs))
return;
break;

NET_ADD_STATS(sock_net(sk), mib_idx, tcp_skb_pcount(skb));

Expand All @@ -3171,10 +3172,13 @@ void tcp_xmit_retransmit_queue(struct sock *sk)

if (skb == rtx_head &&
icsk->icsk_pending != ICSK_TIME_REO_TIMEOUT)
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto,
TCP_RTO_MAX);
rearm_timer = true;

}
if (rearm_timer)
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto,
TCP_RTO_MAX);
}

/* We allow to exceed memory limits for FIN packets to expedite
Expand Down

0 comments on commit 916e6d1

Please sign in to comment.