|
@@ -40,15 +40,17 @@ static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk)
|
|
{
|
|
{
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
u32 elapsed, start_ts;
|
|
u32 elapsed, start_ts;
|
|
|
|
+ s32 remaining;
|
|
|
|
|
|
start_ts = tcp_retransmit_stamp(sk);
|
|
start_ts = tcp_retransmit_stamp(sk);
|
|
if (!icsk->icsk_user_timeout || !start_ts)
|
|
if (!icsk->icsk_user_timeout || !start_ts)
|
|
return icsk->icsk_rto;
|
|
return icsk->icsk_rto;
|
|
elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts;
|
|
elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts;
|
|
- if (elapsed >= icsk->icsk_user_timeout)
|
|
|
|
|
|
+ remaining = icsk->icsk_user_timeout - elapsed;
|
|
|
|
+ if (remaining <= 0)
|
|
return 1; /* user timeout has passed; fire ASAP */
|
|
return 1; /* user timeout has passed; fire ASAP */
|
|
- else
|
|
|
|
- return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - elapsed));
|
|
|
|
|
|
+
|
|
|
|
+ return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(remaining));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -209,7 +211,7 @@ static bool retransmits_timed_out(struct sock *sk,
|
|
(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
|
|
(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
|
|
timeout = jiffies_to_msecs(timeout);
|
|
timeout = jiffies_to_msecs(timeout);
|
|
}
|
|
}
|
|
- return (tcp_time_stamp(tcp_sk(sk)) - start_ts) >= timeout;
|
|
|
|
|
|
+ return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0;
|
|
}
|
|
}
|
|
|
|
|
|
/* A write timeout has occurred. Process the after effects. */
|
|
/* A write timeout has occurred. Process the after effects. */
|