Commit 76174004 authored by Yuchung Cheng's avatar Yuchung Cheng Committed by David S. Miller

tcp: do not slow start when cwnd equals ssthresh

In the original design slow start is only used to raise cwnd
when cwnd is stricly below ssthresh. It makes little sense
to slow start when cwnd == ssthresh: especially
when hystart has set ssthresh in the initial ramp, or after
recovery when cwnd resets to ssthresh. Not doing so will
also help reduce the buffer bloat slightly.
Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarNandita Dukkipati <nanditad@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 071d5080
...@@ -991,7 +991,7 @@ static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp) ...@@ -991,7 +991,7 @@ static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
static inline bool tcp_in_slow_start(const struct tcp_sock *tp) static inline bool tcp_in_slow_start(const struct tcp_sock *tp)
{ {
return tp->snd_cwnd <= tp->snd_ssthresh; return tp->snd_cwnd < tp->snd_ssthresh;
} }
static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp) static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp)
......
...@@ -264,7 +264,7 @@ static void tcp_cdg_cong_avoid(struct sock *sk, u32 ack, u32 acked) ...@@ -264,7 +264,7 @@ static void tcp_cdg_cong_avoid(struct sock *sk, u32 ack, u32 acked)
u32 prior_snd_cwnd; u32 prior_snd_cwnd;
u32 incr; u32 incr;
if (tp->snd_cwnd < tp->snd_ssthresh && hystart_detect) if (tcp_in_slow_start(tp) && hystart_detect)
tcp_cdg_hystart_update(sk); tcp_cdg_hystart_update(sk);
if (after(ack, ca->rtt_seq) && ca->rtt.v64) { if (after(ack, ca->rtt_seq) && ca->rtt.v64) {
......
...@@ -365,10 +365,8 @@ int tcp_set_congestion_control(struct sock *sk, const char *name) ...@@ -365,10 +365,8 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
*/ */
u32 tcp_slow_start(struct tcp_sock *tp, u32 acked) u32 tcp_slow_start(struct tcp_sock *tp, u32 acked)
{ {
u32 cwnd = tp->snd_cwnd + acked; u32 cwnd = min(tp->snd_cwnd + acked, tp->snd_ssthresh);
if (cwnd > tp->snd_ssthresh)
cwnd = tp->snd_ssthresh + 1;
acked -= cwnd - tp->snd_cwnd; acked -= cwnd - tp->snd_cwnd;
tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp);
......
...@@ -112,7 +112,7 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 acked) ...@@ -112,7 +112,7 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 acked)
rho_fractions = ca->rho_3ls - (ca->rho << 3); rho_fractions = ca->rho_3ls - (ca->rho << 3);
if (tp->snd_cwnd < tp->snd_ssthresh) { if (tcp_in_slow_start(tp)) {
/* /*
* slow start * slow start
* INC = 2^RHO - 1 * INC = 2^RHO - 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment