svn commit: r350403 - in head: share/man/man4 sys/netinet/cc

Michael Tuexen tuexen at FreeBSD.org
Mon Jul 29 08:50:36 UTC 2019


Author: tuexen
Date: Mon Jul 29 08:50:35 2019
New Revision: 350403
URL: https://svnweb.freebsd.org/changeset/base/350403

Log:
  * Improve input validation of sysctl parameters for DCTPC.
  * Initialize the alpha parameter to a conservative value (like Linux)
  * Improve handling of arithmetic.
  * Improve man-page
  
  Obtained from:		Richard Scheffenegger
  MFC after:		1 week
  Differential Revision:	https://reviews.freebsd.org/D20549

Modified:
  head/share/man/man4/cc_dctcp.4
  head/sys/netinet/cc/cc_dctcp.c

Modified: head/share/man/man4/cc_dctcp.4
==============================================================================
--- head/share/man/man4/cc_dctcp.4	Mon Jul 29 08:23:15 2019	(r350402)
+++ head/share/man/man4/cc_dctcp.4	Mon Jul 29 08:50:35 2019	(r350403)
@@ -28,7 +28,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 12, 2015
+.Dd July 29, 2019
 .Dt CC_DCTCP 4
 .Os
 .Sh NAME
@@ -60,7 +60,7 @@ In addition, when classic ECN is used as sender and DC
 receiver, DCTCP avoids to mirror back ACKs only when the CWR flag is
 set in the incoming packet.
 .Pp
-The other specifications are based on the paper and Internet Draft referenced
+The other specifications are based on the paper and the RFC referenced
 in the
 .Sx SEE ALSO
 section below.
@@ -70,16 +70,27 @@ The algorithm exposes the following tunable variables 
 branch of the
 .Xr sysctl 3
 MIB:
-.Bl -tag -width ".Va alpha"
+.Bl -tag -width ".Va slowstart"
 .It Va alpha
-An initial estimator of the congestion on the link.
-Default is 0.
-.It Va dctcp_shift_g
-An estimation gain in the alpha calculation.
-Default is 16.
+The initial value to estimate the congestion on the link.
+The valid range is from 0 to 1024, where 1024 reduces the congestion
+window to half, if a CE is observed in the first window and
+.Va alpha
+could not yet adjust to the congestion level on that path.
+Default is 1024.
+.It Va shift_g
+An estimation gain in the
+.Va alpha
+calculation.
+This influences the responsiveness when adjusting alpha
+to the most recent observed window.
+Valid range from 0 to 10, the default is 4, resulting in an effective
+gain of 1 / ( 2 ^
+.Va shift_g
+), or 1/16th.
 .It Va slowstart
-A trigger to halve congestion window after slow start.
-Default does nothing to halve window.
+A flag if the congestion window should be reduced by one half after slow start.
+Valid settings 0 and 1, default 0.
 .El
 .Sh SEE ALSO
 .Xr cc_chd 4 ,
@@ -108,10 +119,12 @@ Default does nothing to halve window.
 .Re
 .Rs
 .%A "Stephen Bensley"
-.%A "Lars Eggert"
 .%A "Dave Thaler"
-.%T "Microsoft's Datacenter TCP (DCTCP): TCP Congestion Control for Datacenters"
-.%U "http://tools.ietf.org/html/draft-bensley-tcpm-dctcp-01"
+.%A "Praveen Balasubramanian"
+.%A "Lars Eggert"
+.%A "Glenn Judd"
+.%T "Data Center TCP (DCTCP): TCP Congestion Control for Data Centers"
+.%U "https://tools.ietf.org/html/rfc8257"
 .Re
 .Sh HISTORY
 The

Modified: head/sys/netinet/cc/cc_dctcp.c
==============================================================================
--- head/sys/netinet/cc/cc_dctcp.c	Mon Jul 29 08:23:15 2019	(r350402)
+++ head/sys/netinet/cc/cc_dctcp.c	Mon Jul 29 08:50:35 2019	(r350403)
@@ -56,8 +56,9 @@ __FBSDID("$FreeBSD$");
 #include <netinet/cc/cc.h>
 #include <netinet/cc/cc_module.h>
 
-#define MAX_ALPHA_VALUE 1024
-VNET_DEFINE_STATIC(uint32_t, dctcp_alpha) = 0;
+#define DCTCP_SHIFT 10
+#define MAX_ALPHA_VALUE (1<<DCTCP_SHIFT)
+VNET_DEFINE_STATIC(uint32_t, dctcp_alpha) = MAX_ALPHA_VALUE;
 #define V_dctcp_alpha	    VNET(dctcp_alpha)
 VNET_DEFINE_STATIC(uint32_t, dctcp_shift_g) = 4;
 #define	V_dctcp_shift_g	    VNET(dctcp_shift_g)
@@ -65,14 +66,14 @@ VNET_DEFINE_STATIC(uint32_t, dctcp_slowstart) = 0;
 #define	V_dctcp_slowstart   VNET(dctcp_slowstart)
 
 struct dctcp {
-	int     bytes_ecn;	/* # of marked bytes during a RTT */
-	int     bytes_total;	/* # of acked bytes during a RTT */
-	int     alpha;		/* the fraction of marked bytes */
-	int     ce_prev;	/* CE state of the last segment */
-	int     save_sndnxt;	/* end sequence number of the current window */
-	int	ece_curr;	/* ECE flag in this segment */
-	int	ece_prev;	/* ECE flag in the last segment */
-	uint32_t    num_cong_events; /* # of congestion events */
+	uint32_t bytes_ecn;	  /* # of marked bytes during a RTT */
+	uint32_t bytes_total;	  /* # of acked bytes during a RTT */
+	int      alpha;		  /* the fraction of marked bytes */
+	int      ce_prev;	  /* CE state of the last segment */
+	tcp_seq  save_sndnxt;	  /* end sequence number of the current window */
+	int      ece_curr;	  /* ECE flag in this segment */
+	int      ece_prev;	  /* ECE flag in the last segment */
+	uint32_t num_cong_events; /* # of congestion events */
 };
 
 static MALLOC_DEFINE(M_dctcp, "dctcp data",
@@ -369,18 +370,18 @@ dctcp_update_alpha(struct cc_var *ccv)
 	dctcp_data->bytes_total = max(dctcp_data->bytes_total, 1);
 
 	/*
-	 * Update alpha: alpha = (1 - g) * alpha + g * F.
+	 * Update alpha: alpha = (1 - g) * alpha + g * M.
 	 * Here:
 	 * g is weight factor
 	 *	recommaded to be set to 1/16
 	 *	small g = slow convergence between competitive DCTCP flows
 	 *	large g = impacts low utilization of bandwidth at switches
-	 * F is fraction of marked segments in last RTT
+	 * M is fraction of marked segments in last RTT
 	 *	updated every RTT
 	 * Alpha must be round to 0 - MAX_ALPHA_VALUE.
 	 */
-	dctcp_data->alpha = min(alpha_prev - (alpha_prev >> V_dctcp_shift_g) +
-	    (dctcp_data->bytes_ecn << (10 - V_dctcp_shift_g)) /
+	dctcp_data->alpha = ulmin(alpha_prev - (alpha_prev >> V_dctcp_shift_g) +
+	    ((uint64_t)dctcp_data->bytes_ecn << (DCTCP_SHIFT - V_dctcp_shift_g)) /
 	    dctcp_data->bytes_total, MAX_ALPHA_VALUE);
 
 	/* Initialize internal parameters for next alpha calculation */
@@ -398,14 +399,10 @@ dctcp_alpha_handler(SYSCTL_HANDLER_ARGS)
 	new = V_dctcp_alpha;
 	error = sysctl_handle_int(oidp, &new, 0, req);
 	if (error == 0 && req->newptr != NULL) {
-		if (new > 1)
+		if (new > MAX_ALPHA_VALUE)
 			error = EINVAL;
-		else {
-			if (new > MAX_ALPHA_VALUE)
-				V_dctcp_alpha = MAX_ALPHA_VALUE;
-			else
-				V_dctcp_alpha = new;
-		}
+		else
+			V_dctcp_alpha = new;
 	}
 
 	return (error);
@@ -420,7 +417,7 @@ dctcp_shift_g_handler(SYSCTL_HANDLER_ARGS)
 	new = V_dctcp_shift_g;
 	error = sysctl_handle_int(oidp, &new, 0, req);
 	if (error == 0 && req->newptr != NULL) {
-		if (new > 1)
+		if (new > DCTCP_SHIFT)
 			error = EINVAL;
 		else
 			V_dctcp_shift_g = new;
@@ -454,7 +451,7 @@ SYSCTL_NODE(_net_inet_tcp_cc, OID_AUTO, dctcp, CTLFLAG
 SYSCTL_PROC(_net_inet_tcp_cc_dctcp, OID_AUTO, alpha,
     CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, &VNET_NAME(dctcp_alpha), 0,
     &dctcp_alpha_handler,
-    "IU", "dctcp alpha parameter");
+    "IU", "dctcp alpha parameter at start of session");
 
 SYSCTL_PROC(_net_inet_tcp_cc_dctcp, OID_AUTO, shift_g,
     CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, &VNET_NAME(dctcp_shift_g), 4,


More information about the svn-src-head mailing list