tcp: simplify window probe aborting on USER_TIMEOUT
Previously we use the next unsent skb's timestamp to determine when to abort a socket stalling on window probes. This no longer works as skb timestamp reflects the last instead of the first transmission. Instead we can estimate how long the socket has been stalling with the probe count and the exponential backoff behavior. Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Neal Cardwell <ncardwell@google.com> Reviewed-by: Soheil Hassas Yeganeh <soheil@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
01a523b071
commit
9721e709fa
@ -333,7 +333,6 @@ static void tcp_probe_timer(struct sock *sk)
|
||||
struct sk_buff *skb = tcp_send_head(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int max_probes;
|
||||
u32 start_ts;
|
||||
|
||||
if (tp->packets_out || !skb) {
|
||||
icsk->icsk_probes_out = 0;
|
||||
@ -348,12 +347,13 @@ static void tcp_probe_timer(struct sock *sk)
|
||||
* corresponding system limit. We also implement similar policy when
|
||||
* we use RTO to probe window in tcp_retransmit_timer().
|
||||
*/
|
||||
start_ts = tcp_skb_timestamp(skb);
|
||||
if (!start_ts)
|
||||
skb->skb_mstamp_ns = tp->tcp_clock_cache;
|
||||
else if (icsk->icsk_user_timeout &&
|
||||
(s32)(tcp_time_stamp(tp) - start_ts) > icsk->icsk_user_timeout)
|
||||
if (icsk->icsk_user_timeout) {
|
||||
u32 elapsed = tcp_model_timeout(sk, icsk->icsk_probes_out,
|
||||
tcp_probe0_base(sk));
|
||||
|
||||
if (elapsed >= icsk->icsk_user_timeout)
|
||||
goto abort;
|
||||
}
|
||||
|
||||
max_probes = sock_net(sk)->ipv4.sysctl_tcp_retries2;
|
||||
if (sock_flag(sk, SOCK_DEAD)) {
|
||||
|
Loading…
Reference in New Issue
Block a user