|
@@ -753,13 +753,29 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
|
|
|
* TCP pacing, to smooth the burst on large writes when packets
|
|
|
* in flight is significantly lower than cwnd (or rwin)
|
|
|
*/
|
|
|
+int sysctl_tcp_pacing_ss_ratio __read_mostly = 200;
|
|
|
+int sysctl_tcp_pacing_ca_ratio __read_mostly = 120;
|
|
|
+
|
|
|
static void tcp_update_pacing_rate(struct sock *sk)
|
|
|
{
|
|
|
const struct tcp_sock *tp = tcp_sk(sk);
|
|
|
u64 rate;
|
|
|
|
|
|
/* set sk_pacing_rate to 200 % of current rate (mss * cwnd / srtt) */
|
|
|
- rate = (u64)tp->mss_cache * 2 * (USEC_PER_SEC << 3);
|
|
|
+ rate = (u64)tp->mss_cache * ((USEC_PER_SEC / 100) << 3);
|
|
|
+
|
|
|
+ /* current rate is (cwnd * mss) / srtt
|
|
|
+ * In Slow Start [1], set sk_pacing_rate to 200 % the current rate.
|
|
|
+ * In Congestion Avoidance phase, set it to 120 % the current rate.
|
|
|
+ *
|
|
|
+ * [1] : Normal Slow Start condition is (tp->snd_cwnd < tp->snd_ssthresh)
|
|
|
+ * If snd_cwnd >= (tp->snd_ssthresh / 2), we are approaching
|
|
|
+ * end of slow start and should slow down.
|
|
|
+ */
|
|
|
+ if (tp->snd_cwnd < tp->snd_ssthresh / 2)
|
|
|
+ rate *= sysctl_tcp_pacing_ss_ratio;
|
|
|
+ else
|
|
|
+ rate *= sysctl_tcp_pacing_ca_ratio;
|
|
|
|
|
|
rate *= max(tp->snd_cwnd, tp->packets_out);
|
|
|
|