svn commit: r330516 - in stable/11/sys/netinet: . cc tcp_stacks

Eitan Adler eadler at FreeBSD.org
Mon Mar 5 17:01:28 UTC 2018


Author: eadler
Date: Mon Mar  5 17:01:26 2018
New Revision: 330516
URL: https://svnweb.freebsd.org/changeset/base/330516

Log:
  Revert r330445
  
  This commit was reverted in r321480 in head
  
  Reported by:	sbruno

Modified:
  stable/11/sys/netinet/cc/cc_cdg.c
  stable/11/sys/netinet/cc/cc_chd.c
  stable/11/sys/netinet/cc/cc_cubic.c
  stable/11/sys/netinet/cc/cc_dctcp.c
  stable/11/sys/netinet/cc/cc_htcp.c
  stable/11/sys/netinet/cc/cc_newreno.c
  stable/11/sys/netinet/tcp_input.c
  stable/11/sys/netinet/tcp_stacks/fastpath.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/netinet/cc/cc_cdg.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_cdg.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_cdg.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -431,12 +431,7 @@ 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:
 		CCV(ccv, snd_ssthresh) = cdg_window_decrease(ccv,
@@ -453,7 +448,7 @@ cdg_cong_signal(struct cc_var *ccv, uint32_t signal_ty
 		 */
 		if (IN_CONGRECOVERY(CCV(ccv, t_flags)) ||
 		    cdg_data->queue_state < CDG_Q_FULL) {
-			CCV(ccv, snd_ssthresh) = cwin;
+			CCV(ccv, snd_ssthresh) = CCV(ccv, snd_cwnd);
 			CCV(ccv, snd_recover) = CCV(ccv, snd_max);
 		} else {
 			/*
@@ -466,18 +461,12 @@ cdg_cong_signal(struct cc_var *ccv, uint32_t signal_ty
 				    cdg_data->shadow_w, RENO_BETA);
 
 			CCV(ccv, snd_ssthresh) = ulmax(cdg_data->shadow_w,
-			    cdg_window_decrease(ccv, cwin, V_cdg_beta_loss));
-			CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
+			    cdg_window_decrease(ccv, CCV(ccv, snd_cwnd),
+			    V_cdg_beta_loss));
 
 			cdg_data->window_incr = cdg_data->rtt_count = 0;
 		}
 		ENTER_RECOVERY(CCV(ccv, t_flags));
-		break;
-	case CC_RTO:
-		CCV(ccv, snd_ssthresh) =
-		    max((CCV(ccv, snd_max) - CCV(ccv, snd_una)) / 2 / mss, 2)
-			* mss;
-		CCV(ccv, snd_cwnd) = mss;
 		break;
 	default:
 		newreno_cc_algo.cong_signal(ccv, signal_type);

Modified: stable/11/sys/netinet/cc/cc_chd.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_chd.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_chd.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -330,12 +330,10 @@ chd_cong_signal(struct cc_var *ccv, uint32_t signal_ty
 	struct ertt *e_t;
 	struct chd *chd_data;
 	int qdly;
-	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;
-	mss = CCV(ccv, t_maxseg);
 
 	switch(signal_type) {
 	case CC_CHD_DELAY:
@@ -374,12 +372,6 @@ chd_cong_signal(struct cc_var *ccv, uint32_t signal_ty
 			    CCV(ccv, t_maxseg) / 2, 2) * CCV(ccv, t_maxseg);
 		}
 		ENTER_FASTRECOVERY(CCV(ccv, t_flags));
-		break;
-	case CC_RTO:
-		CCV(ccv, snd_ssthresh) =
-		    max((CCV(ccv, snd_max) - CCV(ccv, snd_una)) / 2 / mss, 2)
-			* mss;
-		CCV(ccv, snd_cwnd) = mss;
 		break;
 
 	default:

Modified: stable/11/sys/netinet/cc/cc_cubic.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_cubic.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_cubic.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -225,12 +225,8 @@ 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:
@@ -239,8 +235,7 @@ cubic_cong_signal(struct cc_var *ccv, uint32_t type)
 				cubic_ssthresh_update(ccv);
 				cubic_data->num_cong_events++;
 				cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
-				cubic_data->max_cwnd = cwin;
-				CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
+				cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
 			}
 			ENTER_RECOVERY(CCV(ccv, t_flags));
 		}
@@ -251,7 +246,7 @@ cubic_cong_signal(struct cc_var *ccv, uint32_t type)
 			cubic_ssthresh_update(ccv);
 			cubic_data->num_cong_events++;
 			cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
-			cubic_data->max_cwnd = cwin;
+			cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
 			cubic_data->t_last_cong = ticks;
 			CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
 			ENTER_CONGRECOVERY(CCV(ccv, t_flags));
@@ -266,13 +261,9 @@ cubic_cong_signal(struct cc_var *ccv, uint32_t type)
 		 * 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: stable/11/sys/netinet/cc/cc_dctcp.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_dctcp.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_dctcp.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -230,29 +230,27 @@ static void
 dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
 {
 	struct dctcp *dctcp_data;
-	uint32_t cwin, ssthresh_on_loss;
-	u_int mss;
+	u_int win, mss;
 
 	dctcp_data = ccv->cc_data;
-	cwin = CCV(ccv, snd_cwnd);
+	win = CCV(ccv, snd_cwnd);
 	mss = CCV(ccv, t_maxseg);
-	ssthresh_on_loss =
-	    max((CCV(ccv, snd_max) - CCV(ccv, snd_una)) / 2 / mss, 2)
-		* mss;
 
 	switch (type) {
 	case CC_NDUPACK:
 		if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
 			if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
-				CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
+				CCV(ccv, snd_ssthresh) = mss *
+				    max(win / 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
 				 */
-				cwin = CCV(ccv, snd_cwnd_prev);
-				CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
+				win = CCV(ccv, snd_cwnd_prev);
+				CCV(ccv, snd_ssthresh) =
+				    max(win / 2 / mss, 2) * mss;
 			}
 			ENTER_RECOVERY(CCV(ccv, t_flags));
 		}
@@ -262,17 +260,18 @@ dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
 		 * Save current snd_cwnd when the host encounters both
 		 * congestion recovery and fast recovery.
 		 */
-		CCV(ccv, snd_cwnd_prev) = cwin;
+		CCV(ccv, snd_cwnd_prev) = win;
 		if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
 			if (V_dctcp_slowstart &&
 			    dctcp_data->num_cong_events++ == 0) {
-				CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
+				CCV(ccv, snd_ssthresh) =
+				    mss * max(win / 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((cwin - ((cwin *
+				CCV(ccv, snd_ssthresh) = max((win - ((win *
 				    dctcp_data->alpha) >> 11)) / mss, 2) * mss;
 			CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
 			ENTER_CONGRECOVERY(CCV(ccv, t_flags));
@@ -285,8 +284,6 @@ dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
 			dctcp_update_alpha(ccv);
 			dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
 			dctcp_data->num_cong_events++;
-			CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
-			CCV(ccv, snd_cwnd) = mss;
 		}
 		break;
 	}

Modified: stable/11/sys/netinet/cc/cc_htcp.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_htcp.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_htcp.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -271,12 +271,8 @@ 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:
@@ -291,9 +287,8 @@ htcp_cong_signal(struct cc_var *ccv, uint32_t type)
 				    (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 = cwin;
+				htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
 			}
 			ENTER_RECOVERY(CCV(ccv, t_flags));
 		}
@@ -310,7 +305,7 @@ htcp_cong_signal(struct cc_var *ccv, uint32_t type)
 			htcp_ssthresh_update(ccv);
 			CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
 			htcp_data->t_last_cong = ticks;
-			htcp_data->prev_cwnd = cwin;
+			htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
 			ENTER_CONGRECOVERY(CCV(ccv, t_flags));
 		}
 		break;
@@ -325,10 +320,6 @@ htcp_cong_signal(struct cc_var *ccv, uint32_t type)
 		 */
 		if (CCV(ccv, t_rxtshift) >= 2)
 			htcp_data->t_last_cong = ticks;
-		CCV(ccv, snd_ssthresh) =
-		    max((CCV(ccv, snd_max) - CCV(ccv, snd_una)) / 2 / mss, 2)
-			* mss;
-		CCV(ccv, snd_cwnd) = mss;
 		break;
 	}
 }
@@ -520,10 +511,6 @@ htcp_ssthresh_update(struct cc_var *ccv)
 		CCV(ccv, snd_ssthresh) = (CCV(ccv, snd_cwnd) * htcp_data->beta)
 		    >> HTCP_SHIFT;
 	}
-
-	/* Align ssthresh to MSS boundary */
-	CCV(ccv, snd_ssthresh) = (CCV(ccv, snd_ssthresh) / CCV(ccv, t_maxseg))
-	    * CCV(ccv, t_maxseg);
 }
 
 

Modified: stable/11/sys/netinet/cc/cc_newreno.c
==============================================================================
--- stable/11/sys/netinet/cc/cc_newreno.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/cc/cc_newreno.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -181,41 +181,29 @@ newreno_after_idle(struct cc_var *ccv)
 static void
 newreno_cong_signal(struct cc_var *ccv, uint32_t type)
 {
-	uint32_t cwin, ssthresh_on_loss;
-	u_int mss;
+	u_int win;
 
-	cwin = CCV(ccv, snd_cwnd);
-	mss = CCV(ccv, t_maxseg);
-	ssthresh_on_loss =
-	    max((CCV(ccv, snd_max) - CCV(ccv, snd_una)) / 2 / mss, 2)
-		* mss;
-
 	/* Catch algos which mistakenly leak private signal types. */
 	KASSERT((type & CC_SIGPRIVMASK) == 0,
 	    ("%s: congestion signal type 0x%08x is private\n", __func__, type));
 
-	cwin = max(cwin / 2 / mss, 2) * mss;
+	win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
+	    CCV(ccv, t_maxseg);
 
 	switch (type) {
 	case CC_NDUPACK:
 		if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
-			if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
-				CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
-				CCV(ccv, snd_cwnd) = cwin;
-			}
+			if (!IN_CONGRECOVERY(CCV(ccv, t_flags)))
+				CCV(ccv, snd_ssthresh) = win;
 			ENTER_RECOVERY(CCV(ccv, t_flags));
 		}
 		break;
 	case CC_ECN:
 		if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
-			CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
-			CCV(ccv, snd_cwnd) = cwin;
+			CCV(ccv, snd_ssthresh) = win;
+			CCV(ccv, snd_cwnd) = win;
 			ENTER_CONGRECOVERY(CCV(ccv, t_flags));
 		}
-		break;
-	case CC_RTO:
-		CCV(ccv, snd_ssthresh) = ssthresh_on_loss;
-		CCV(ccv, snd_cwnd) = mss;
 		break;
 	}
 }

Modified: stable/11/sys/netinet/tcp_input.c
==============================================================================
--- stable/11/sys/netinet/tcp_input.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/tcp_input.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -429,16 +429,9 @@ cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, ui
 		tp->t_dupacks = 0;
 		tp->t_bytes_acked = 0;
 		EXIT_RECOVERY(tp->t_flags);
-		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 / maxseg, 2)
-				* maxseg;
-			tp->snd_cwnd = maxseg;
-		}
+		tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
+		    maxseg) * maxseg;
+		tp->snd_cwnd = maxseg;
 		break;
 	case CC_RTO_ERR:
 		TCPSTAT_INC(tcps_sndrexmitbad);
@@ -2599,15 +2592,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, stru
 
 						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;
 						}
@@ -2646,22 +2630,19 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, stru
 						TCPSTAT_INC(
 						    tcps_sack_recovery_episode);
 						tp->sack_newdata = tp->snd_nxt;
-						if (CC_ALGO(tp)->cong_signal == NULL)
-							tp->snd_cwnd = maxseg;
+						tp->snd_cwnd = maxseg;
 						(void) tp->t_fb->tfb_tcp_output(tp);
 						goto drop;
 					}
 					tp->snd_nxt = th->th_ack;
-					if (CC_ALGO(tp)->cong_signal == NULL)
-						tp->snd_cwnd = maxseg;
+					tp->snd_cwnd = maxseg;
 					(void) tp->t_fb->tfb_tcp_output(tp);
 					KASSERT(tp->snd_limited <= 2,
 					    ("%s: tp->snd_limited too big",
 					    __func__));
-					if (CC_ALGO(tp)->cong_signal == NULL)
-						tp->snd_cwnd = tp->snd_ssthresh +
-						    maxseg *
-						    (tp->t_dupacks - tp->snd_limited);
+					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;

Modified: stable/11/sys/netinet/tcp_stacks/fastpath.c
==============================================================================
--- stable/11/sys/netinet/tcp_stacks/fastpath.c	Mon Mar  5 16:13:29 2018	(r330515)
+++ stable/11/sys/netinet/tcp_stacks/fastpath.c	Mon Mar  5 17:01:26 2018	(r330516)
@@ -1035,15 +1035,6 @@ tcp_do_slowpath(struct mbuf *m, struct tcphdr *th, str
 
 						if (awnd < tp->snd_ssthresh) {
 							tp->snd_cwnd += tp->t_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;
 						}
@@ -1082,22 +1073,19 @@ tcp_do_slowpath(struct mbuf *m, struct tcphdr *th, str
 						TCPSTAT_INC(
 						    tcps_sack_recovery_episode);
 						tp->sack_newdata = tp->snd_nxt;
-						if (CC_ALGO(tp)->cong_signal == NULL)
-							tp->snd_cwnd = tp->t_maxseg;
+						tp->snd_cwnd = tp->t_maxseg;
 						(void) tp->t_fb->tfb_tcp_output(tp);
 						goto drop;
 					}
 					tp->snd_nxt = th->th_ack;
-					if (CC_ALGO(tp)->cong_signal == NULL)
-						tp->snd_cwnd = tp->t_maxseg;
+					tp->snd_cwnd = tp->t_maxseg;
 					(void) tp->t_fb->tfb_tcp_output(tp);
 					KASSERT(tp->snd_limited <= 2,
 					    ("%s: tp->snd_limited too big",
 					    __func__));
-					if (CC_ALGO(tp)->cong_signal == NULL)
-						tp->snd_cwnd = tp->snd_ssthresh +
-						    tp->t_maxseg *
-						    (tp->t_dupacks - tp->snd_limited);
+					tp->snd_cwnd = tp->snd_ssthresh +
+					     tp->t_maxseg *
+					     (tp->t_dupacks - tp->snd_limited);
 					if (SEQ_GT(onxt, tp->snd_nxt))
 						tp->snd_nxt = onxt;
 					goto drop;


More information about the svn-src-all mailing list