|
@@ -2921,9 +2921,9 @@ static void tcp_update_rtt_min(struct sock *sk, u32 rtt_us)
|
|
|
rtt_us ? : jiffies_to_usecs(1));
|
|
|
}
|
|
|
|
|
|
-static inline bool tcp_ack_update_rtt(struct sock *sk, const int flag,
|
|
|
- long seq_rtt_us, long sack_rtt_us,
|
|
|
- long ca_rtt_us)
|
|
|
+static bool tcp_ack_update_rtt(struct sock *sk, const int flag,
|
|
|
+ long seq_rtt_us, long sack_rtt_us,
|
|
|
+ long ca_rtt_us, struct rate_sample *rs)
|
|
|
{
|
|
|
const struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
|
@@ -2948,6 +2948,7 @@ static inline bool tcp_ack_update_rtt(struct sock *sk, const int flag,
|
|
|
|
|
|
seq_rtt_us = ca_rtt_us = delta_us;
|
|
|
}
|
|
|
+ rs->rtt_us = ca_rtt_us; /* RTT of last (S)ACKed packet (or -1) */
|
|
|
if (seq_rtt_us < 0)
|
|
|
return false;
|
|
|
|
|
@@ -2967,12 +2968,13 @@ static inline bool tcp_ack_update_rtt(struct sock *sk, const int flag,
|
|
|
/* Compute time elapsed between (last) SYNACK and the ACK completing 3WHS. */
|
|
|
void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req)
|
|
|
{
|
|
|
+ struct rate_sample rs;
|
|
|
long rtt_us = -1L;
|
|
|
|
|
|
if (req && !req->num_retrans && tcp_rsk(req)->snt_synack)
|
|
|
rtt_us = tcp_stamp_us_delta(tcp_clock_us(), tcp_rsk(req)->snt_synack);
|
|
|
|
|
|
- tcp_ack_update_rtt(sk, FLAG_SYN_ACKED, rtt_us, -1L, rtt_us);
|
|
|
+ tcp_ack_update_rtt(sk, FLAG_SYN_ACKED, rtt_us, -1L, rtt_us, &rs);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -3177,9 +3179,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
|
|
sack_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, sack->first_sackt);
|
|
|
ca_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, sack->last_sackt);
|
|
|
}
|
|
|
- sack->rate->rtt_us = ca_rtt_us; /* RTT of last (S)ACKed packet, or -1 */
|
|
|
rtt_update = tcp_ack_update_rtt(sk, flag, seq_rtt_us, sack_rtt_us,
|
|
|
- ca_rtt_us);
|
|
|
+ ca_rtt_us, sack->rate);
|
|
|
|
|
|
if (flag & FLAG_ACKED) {
|
|
|
tcp_rearm_rto(sk);
|
|
@@ -3215,7 +3216,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
|
|
|
|
|
if (icsk->icsk_ca_ops->pkts_acked) {
|
|
|
struct ack_sample sample = { .pkts_acked = pkts_acked,
|
|
|
- .rtt_us = ca_rtt_us,
|
|
|
+ .rtt_us = sack->rate->rtt_us,
|
|
|
.in_flight = last_in_flight };
|
|
|
|
|
|
icsk->icsk_ca_ops->pkts_acked(sk, &sample);
|