|
|
@@ -671,6 +671,7 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
long m = mrtt; /* RTT */
|
|
|
+ u32 srtt = tp->srtt;
|
|
|
|
|
|
/* The following amusing code comes from Jacobson's
|
|
|
* article in SIGCOMM '88. Note that rtt and mdev
|
|
|
@@ -688,11 +689,9 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
|
|
|
* does not matter how to _calculate_ it. Seems, it was trap
|
|
|
* that VJ failed to avoid. 8)
|
|
|
*/
|
|
|
- if (m == 0)
|
|
|
- m = 1;
|
|
|
- if (tp->srtt != 0) {
|
|
|
- m -= (tp->srtt >> 3); /* m is now error in rtt est */
|
|
|
- tp->srtt += m; /* rtt = 7/8 rtt + 1/8 new */
|
|
|
+ if (srtt != 0) {
|
|
|
+ m -= (srtt >> 3); /* m is now error in rtt est */
|
|
|
+ srtt += m; /* rtt = 7/8 rtt + 1/8 new */
|
|
|
if (m < 0) {
|
|
|
m = -m; /* m is now abs(error) */
|
|
|
m -= (tp->mdev >> 2); /* similar update on mdev */
|
|
|
@@ -723,11 +722,12 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
|
|
|
}
|
|
|
} else {
|
|
|
/* no previous measure. */
|
|
|
- tp->srtt = m << 3; /* take the measured time to be rtt */
|
|
|
+ srtt = m << 3; /* take the measured time to be rtt */
|
|
|
tp->mdev = m << 1; /* make sure rto = 3*rtt */
|
|
|
tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));
|
|
|
tp->rtt_seq = tp->snd_nxt;
|
|
|
}
|
|
|
+ tp->srtt = max(1U, srtt);
|
|
|
}
|
|
|
|
|
|
/* Set the sk_pacing_rate to allow proper sizing of TSO packets.
|
|
|
@@ -746,8 +746,10 @@ static void tcp_update_pacing_rate(struct sock *sk)
|
|
|
|
|
|
rate *= max(tp->snd_cwnd, tp->packets_out);
|
|
|
|
|
|
- /* Correction for small srtt : minimum srtt being 8 (1 jiffy << 3),
|
|
|
- * be conservative and assume srtt = 1 (125 us instead of 1.25 ms)
|
|
|
+ /* Correction for small srtt and scheduling constraints.
|
|
|
+ * For small rtt, consider noise is too high, and use
|
|
|
+ * the minimal value (srtt = 1 -> 125 us for HZ=1000)
|
|
|
+ *
|
|
|
* We probably need usec resolution in the future.
|
|
|
* Note: This also takes care of possible srtt=0 case,
|
|
|
* when tcp_rtt_estimator() was not yet called.
|