Commit c589e69b authored by Neal Cardwell's avatar Neal Cardwell Committed by David S. Miller

tcp_bbr: record "full bw reached" decision in new full_bw_reached bit

This commit records the "full bw reached" decision in a new
full_bw_reached bit. This is a pure refactor that does not change the
current behavior, but enables subsequent fixes and improvements.

In particular, this enables simple and clean fixes because the full_bw
and full_bw_cnt can be unconditionally zeroed without worrying about
forgetting that we estimated we filled the pipe in Startup. And it
enables future improvements because multiple code paths can be used
for estimating that we filled the pipe in Startup; any new code paths
only need to set this bit when they think the pipe is full.

Note that this fix intentionally reduces the width of the full_bw_cnt
counter, since we have never used the most significant bit.
Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
Reviewed-by: default avatarYuchung Cheng <ycheng@google.com>
Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d4a7a889
...@@ -110,7 +110,8 @@ struct bbr { ...@@ -110,7 +110,8 @@ struct bbr {
u32 lt_last_lost; /* LT intvl start: tp->lost */ u32 lt_last_lost; /* LT intvl start: tp->lost */
u32 pacing_gain:10, /* current gain for setting pacing rate */ u32 pacing_gain:10, /* current gain for setting pacing rate */
cwnd_gain:10, /* current gain for setting cwnd */ cwnd_gain:10, /* current gain for setting cwnd */
full_bw_cnt:3, /* number of rounds without large bw gains */ full_bw_reached:1, /* reached full bw in Startup? */
full_bw_cnt:2, /* number of rounds without large bw gains */
cycle_idx:3, /* current index in pacing_gain cycle array */ cycle_idx:3, /* current index in pacing_gain cycle array */
has_seen_rtt:1, /* have we seen an RTT sample yet? */ has_seen_rtt:1, /* have we seen an RTT sample yet? */
unused_b:5; unused_b:5;
...@@ -180,7 +181,7 @@ static bool bbr_full_bw_reached(const struct sock *sk) ...@@ -180,7 +181,7 @@ static bool bbr_full_bw_reached(const struct sock *sk)
{ {
const struct bbr *bbr = inet_csk_ca(sk); const struct bbr *bbr = inet_csk_ca(sk);
return bbr->full_bw_cnt >= bbr_full_bw_cnt; return bbr->full_bw_reached;
} }
/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ /* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */
...@@ -717,6 +718,7 @@ static void bbr_check_full_bw_reached(struct sock *sk, ...@@ -717,6 +718,7 @@ static void bbr_check_full_bw_reached(struct sock *sk,
return; return;
} }
++bbr->full_bw_cnt; ++bbr->full_bw_cnt;
bbr->full_bw_reached = bbr->full_bw_cnt >= bbr_full_bw_cnt;
} }
/* If pipe is probably full, drain the queue and then enter steady-state. */ /* If pipe is probably full, drain the queue and then enter steady-state. */
...@@ -850,6 +852,7 @@ static void bbr_init(struct sock *sk) ...@@ -850,6 +852,7 @@ static void bbr_init(struct sock *sk)
bbr->restore_cwnd = 0; bbr->restore_cwnd = 0;
bbr->round_start = 0; bbr->round_start = 0;
bbr->idle_restart = 0; bbr->idle_restart = 0;
bbr->full_bw_reached = 0;
bbr->full_bw = 0; bbr->full_bw = 0;
bbr->full_bw_cnt = 0; bbr->full_bw_cnt = 0;
bbr->cycle_mstamp = 0; bbr->cycle_mstamp = 0;
......
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