svn commit: r307899 - in head/sys/netinet: . cc
Hiren Panchasara
hiren at FreeBSD.org
Tue Oct 25 05:04:28 UTC 2016
Sigh. I'll revert this and do it right.
On 10/25/16 at 05:03P, Hiren Panchasara wrote:
> Author: hiren
> Date: Tue Oct 25 05:03:33 2016
> New Revision: 307899
> URL: https://svnweb.freebsd.org/changeset/base/307899
>
> Log:
> In Collaboration with: Matt Macy <mmacy at nextbsd dot com>
> Reviewed by: jtl
> Sponsored by: Limelight Networks
> Differential Revision: https://reviews.freebsd.org/D8225
>
> Modified:
> head/sys/netinet/cc/cc_cdg.c
> head/sys/netinet/cc/cc_chd.c
> head/sys/netinet/cc/cc_cubic.c
> head/sys/netinet/cc/cc_dctcp.c
> head/sys/netinet/cc/cc_htcp.c
> head/sys/netinet/cc/cc_newreno.c
> head/sys/netinet/tcp_input.c
>
> Modified: head/sys/netinet/cc/cc_cdg.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_cdg.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_cdg.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -431,6 +431,11 @@ static void
> cdg_cong_signal(struct cc_var *ccv, uint32_t signal_type)
> {
> struct cdg *cdg_data = ccv->cc_data;
> + uint32_t cwin;
> + u_int mss;
> +
> + cwin = CCV(ccv, snd_cwnd);
> + mss = CCV(ccv, t_maxseg);
>
> switch(signal_type) {
> case CC_CDG_DELAY:
> @@ -448,7 +453,7 @@ cdg_cong_signal(struct cc_var *ccv, uint
> */
> if (IN_CONGRECOVERY(CCV(ccv, t_flags)) ||
> cdg_data->queue_state < CDG_Q_FULL) {
> - CCV(ccv, snd_ssthresh) = CCV(ccv, snd_cwnd);
> + CCV(ccv, snd_ssthresh) = cwin;
> CCV(ccv, snd_recover) = CCV(ccv, snd_max);
> } else {
> /*
> @@ -461,13 +466,17 @@ cdg_cong_signal(struct cc_var *ccv, uint
> cdg_data->shadow_w, RENO_BETA);
>
> CCV(ccv, snd_ssthresh) = max(cdg_data->shadow_w,
> - cdg_window_decrease(ccv, CCV(ccv, snd_cwnd),
> - V_cdg_beta_loss));
> + cdg_window_decrease(ccv, cwin, V_cdg_beta_loss));
> + CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>
> cdg_data->window_incr = cdg_data->rtt_count = 0;
> }
> ENTER_RECOVERY(CCV(ccv, t_flags));
> break;
> + case CC_RTO:
> + CCV(ccv, snd_ssthresh) = max(2*mss, cwin/2);
> + CCV(ccv, snd_cwnd) = mss;
> + break;
> default:
> newreno_cc_algo.cong_signal(ccv, signal_type);
> break;
>
> Modified: head/sys/netinet/cc/cc_chd.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_chd.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_chd.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -330,10 +330,14 @@ chd_cong_signal(struct cc_var *ccv, uint
> struct ertt *e_t;
> struct chd *chd_data;
> int qdly;
> + uint32_t cwin;
> + u_int mss;
>
> e_t = khelp_get_osd(CCV(ccv, osd), ertt_id);
> chd_data = ccv->cc_data;
> qdly = imax(e_t->rtt, chd_data->maxrtt_in_rtt) - e_t->minrtt;
> + cwin = CCV(ccv, snd_cwnd);
> + mss = CCV(ccv, t_maxseg);
>
> switch(signal_type) {
> case CC_CHD_DELAY:
> @@ -373,6 +377,10 @@ chd_cong_signal(struct cc_var *ccv, uint
> }
> ENTER_FASTRECOVERY(CCV(ccv, t_flags));
> break;
> + case CC_RTO:
> + CCV(ccv, snd_ssthresh) = max(2*mss, cwin/2);
> + CCV(ccv, snd_cwnd) = mss;
> + break;
>
> default:
> newreno_cc_algo.cong_signal(ccv, signal_type);
>
> Modified: head/sys/netinet/cc/cc_cubic.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_cubic.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_cubic.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -225,8 +225,12 @@ static void
> cubic_cong_signal(struct cc_var *ccv, uint32_t type)
> {
> struct cubic *cubic_data;
> + uint32_t cwin;
> + u_int mss;
>
> cubic_data = ccv->cc_data;
> + cwin = CCV(ccv, snd_cwnd);
> + mss = CCV(ccv, t_maxseg);
>
> switch (type) {
> case CC_NDUPACK:
> @@ -235,7 +239,8 @@ cubic_cong_signal(struct cc_var *ccv, ui
> cubic_ssthresh_update(ccv);
> cubic_data->num_cong_events++;
> cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
> - cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
> + cubic_data->max_cwnd = cwin;
> + CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
> }
> ENTER_RECOVERY(CCV(ccv, t_flags));
> }
> @@ -246,7 +251,7 @@ cubic_cong_signal(struct cc_var *ccv, ui
> cubic_ssthresh_update(ccv);
> cubic_data->num_cong_events++;
> cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
> - cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
> + cubic_data->max_cwnd = cwin;
> cubic_data->t_last_cong = ticks;
> CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
> ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> @@ -261,9 +266,13 @@ cubic_cong_signal(struct cc_var *ccv, ui
> * chance the first one is a false alarm and may not indicate
> * congestion.
> */
> - if (CCV(ccv, t_rxtshift) >= 2)
> + if (CCV(ccv, t_rxtshift) >= 2) {
> cubic_data->num_cong_events++;
> cubic_data->t_last_cong = ticks;
> + cubic_ssthresh_update(ccv);
> + cubic_data->max_cwnd = cwin;
> + CCV(ccv, snd_cwnd) = mss;
> + }
> break;
> }
> }
>
> Modified: head/sys/netinet/cc/cc_dctcp.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_dctcp.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_dctcp.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -230,10 +230,11 @@ static void
> dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
> {
> struct dctcp *dctcp_data;
> - u_int win, mss;
> + uint32_t cwin;
> + u_int mss;
>
> dctcp_data = ccv->cc_data;
> - win = CCV(ccv, snd_cwnd);
> + cwin = CCV(ccv, snd_cwnd);
> mss = CCV(ccv, t_maxseg);
>
> switch (type) {
> @@ -241,16 +242,16 @@ dctcp_cong_signal(struct cc_var *ccv, ui
> if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
> if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> CCV(ccv, snd_ssthresh) = mss *
> - max(win / 2 / mss, 2);
> + max(cwin / 2 / mss, 2);
> dctcp_data->num_cong_events++;
> } else {
> /* cwnd has already updated as congestion
> * recovery. Reverse cwnd value using
> * snd_cwnd_prev and recalculate snd_ssthresh
> */
> - win = CCV(ccv, snd_cwnd_prev);
> + cwin = CCV(ccv, snd_cwnd_prev);
> CCV(ccv, snd_ssthresh) =
> - max(win / 2 / mss, 2) * mss;
> + max(cwin / 2 / mss, 2) * mss;
> }
> ENTER_RECOVERY(CCV(ccv, t_flags));
> }
> @@ -260,18 +261,18 @@ dctcp_cong_signal(struct cc_var *ccv, ui
> * Save current snd_cwnd when the host encounters both
> * congestion recovery and fast recovery.
> */
> - CCV(ccv, snd_cwnd_prev) = win;
> + CCV(ccv, snd_cwnd_prev) = cwin;
> if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> if (V_dctcp_slowstart &&
> dctcp_data->num_cong_events++ == 0) {
> CCV(ccv, snd_ssthresh) =
> - mss * max(win / 2 / mss, 2);
> + mss * max(cwin / 2 / mss, 2);
> dctcp_data->alpha = MAX_ALPHA_VALUE;
> dctcp_data->bytes_ecn = 0;
> dctcp_data->bytes_total = 0;
> dctcp_data->save_sndnxt = CCV(ccv, snd_nxt);
> } else
> - CCV(ccv, snd_ssthresh) = max((win - ((win *
> + CCV(ccv, snd_ssthresh) = max((cwin - ((cwin *
> dctcp_data->alpha) >> 11)) / mss, 2) * mss;
> CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
> ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> @@ -284,6 +285,8 @@ dctcp_cong_signal(struct cc_var *ccv, ui
> dctcp_update_alpha(ccv);
> dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
> dctcp_data->num_cong_events++;
> + CCV(ccv, snd_ssthresh) = max(2 * mss, cwin / 2);
> + CCV(ccv, snd_cwnd) = mss;
> }
> break;
> }
>
> Modified: head/sys/netinet/cc/cc_htcp.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_htcp.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_htcp.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -271,8 +271,12 @@ static void
> htcp_cong_signal(struct cc_var *ccv, uint32_t type)
> {
> struct htcp *htcp_data;
> + uint32_t cwin;
> + u_int mss;
>
> htcp_data = ccv->cc_data;
> + cwin = CCV(ccv, snd_cwnd);
> + mss = CCV(ccv, t_maxseg);
>
> switch (type) {
> case CC_NDUPACK:
> @@ -287,8 +291,9 @@ htcp_cong_signal(struct cc_var *ccv, uin
> (htcp_data->maxrtt - htcp_data->minrtt) *
> 95) / 100;
> htcp_ssthresh_update(ccv);
> + CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
> htcp_data->t_last_cong = ticks;
> - htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
> + htcp_data->prev_cwnd = cwin;
> }
> ENTER_RECOVERY(CCV(ccv, t_flags));
> }
> @@ -305,7 +310,7 @@ htcp_cong_signal(struct cc_var *ccv, uin
> htcp_ssthresh_update(ccv);
> CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
> htcp_data->t_last_cong = ticks;
> - htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
> + htcp_data->prev_cwnd = cwin;
> ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> }
> break;
> @@ -320,6 +325,8 @@ htcp_cong_signal(struct cc_var *ccv, uin
> */
> if (CCV(ccv, t_rxtshift) >= 2)
> htcp_data->t_last_cong = ticks;
> + CCV(ccv, snd_ssthresh) = max(2 * mss, cwin / 2);
> + CCV(ccv, snd_cwnd) = mss;
> break;
> }
> }
>
> Modified: head/sys/netinet/cc/cc_newreno.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_newreno.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/cc/cc_newreno.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -182,30 +182,39 @@ newreno_after_idle(struct cc_var *ccv)
> static void
> newreno_cong_signal(struct cc_var *ccv, uint32_t type)
> {
> - u_int win;
> + uint32_t cwin;
> + u_int mss;
> +
> + cwin = CCV(ccv, snd_cwnd);
> + mss = CCV(ccv, t_maxseg);
>
> /* Catch algos which mistakenly leak private signal types. */
> KASSERT((type & CC_SIGPRIVMASK) == 0,
> ("%s: congestion signal type 0x%08x is private\n", __func__, type));
>
> - win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
> - CCV(ccv, t_maxseg);
> + cwin = max(2*mss, cwin/2);
>
> switch (type) {
> case CC_NDUPACK:
> if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
> - if (!IN_CONGRECOVERY(CCV(ccv, t_flags)))
> - CCV(ccv, snd_ssthresh) = win;
> + if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> + CCV(ccv, snd_ssthresh) = cwin;
> + CCV(ccv, snd_cwnd) = cwin;
> + }
> ENTER_RECOVERY(CCV(ccv, t_flags));
> }
> break;
> case CC_ECN:
> if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> - CCV(ccv, snd_ssthresh) = win;
> - CCV(ccv, snd_cwnd) = win;
> + CCV(ccv, snd_ssthresh) = cwin;
> + CCV(ccv, snd_cwnd) = cwin;
> ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> }
> break;
> + case CC_RTO:
> + CCV(ccv, snd_ssthresh) = cwin;
> + CCV(ccv, snd_cwnd) = mss;
> + break;
> }
> }
>
>
> Modified: head/sys/netinet/tcp_input.c
> ==============================================================================
> --- head/sys/netinet/tcp_input.c Tue Oct 25 04:14:03 2016 (r307898)
> +++ head/sys/netinet/tcp_input.c Tue Oct 25 05:03:33 2016 (r307899)
> @@ -438,9 +438,15 @@ cc_cong_signal(struct tcpcb *tp, struct
> tp->t_dupacks = 0;
> tp->t_bytes_acked = 0;
> EXIT_RECOVERY(tp->t_flags);
> - tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
> - maxseg) * maxseg;
> - tp->snd_cwnd = maxseg;
> + if (CC_ALGO(tp)->cong_signal == NULL) {
> + /*
> + * RFC5681 Section 3.1
> + * ssthresh = max (FlightSize / 2, 2*SMSS) eq (4)
> + */
> + tp->snd_ssthresh =
> + max((tp->snd_max - tp->snd_una) / 2, 2 * maxseg);
> + tp->snd_cwnd = maxseg;
> + }
> break;
> case CC_RTO_ERR:
> TCPSTAT_INC(tcps_sndrexmitbad);
> @@ -2613,6 +2619,15 @@ tcp_do_segment(struct mbuf *m, struct tc
>
> if (awnd < tp->snd_ssthresh) {
> tp->snd_cwnd += maxseg;
> + /*
> + * RFC5681 Section 3.2 talks about cwnd
> + * inflation on additional dupacks and
> + * deflation on recovering from loss.
> + *
> + * We keep cwnd into check so that
> + * we don't have to 'deflate' it when we
> + * get out of recovery.
> + */
> if (tp->snd_cwnd > tp->snd_ssthresh)
> tp->snd_cwnd = tp->snd_ssthresh;
> }
> @@ -2652,19 +2667,22 @@ tcp_do_segment(struct mbuf *m, struct tc
> TCPSTAT_INC(
> tcps_sack_recovery_episode);
> tp->sack_newdata = tp->snd_nxt;
> - tp->snd_cwnd = maxseg;
> + if (CC_ALGO(tp)->cong_signal == NULL)
> + tp->snd_cwnd = maxseg;
> (void) tp->t_fb->tfb_tcp_output(tp);
> goto drop;
> }
> tp->snd_nxt = th->th_ack;
> - tp->snd_cwnd = maxseg;
> + if (CC_ALGO(tp)->cong_signal == NULL)
> + tp->snd_cwnd = maxseg;
> (void) tp->t_fb->tfb_tcp_output(tp);
> KASSERT(tp->snd_limited <= 2,
> ("%s: tp->snd_limited too big",
> __func__));
> - tp->snd_cwnd = tp->snd_ssthresh +
> - maxseg *
> - (tp->t_dupacks - tp->snd_limited);
> + if (CC_ALGO(tp)->cong_signal == NULL)
> + tp->snd_cwnd = tp->snd_ssthresh +
> + maxseg *
> + (tp->t_dupacks - tp->snd_limited);
> if (SEQ_GT(onxt, tp->snd_nxt))
> tp->snd_nxt = onxt;
> goto drop;
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 603 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/svn-src-all/attachments/20161024/d10a4642/attachment.sig>
More information about the svn-src-all
mailing list