Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Jun 2020 07:32:03 +0000 (UTC)
From:      Richard Scheffenegger <rscheff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r362006 - head/sys/netinet/cc
Message-ID:  <202006100732.05A7W3JB058534@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rscheff
Date: Wed Jun 10 07:32:02 2020
New Revision: 362006
URL: https://svnweb.freebsd.org/changeset/base/362006

Log:
  Prevent TCP Cubic to abruptly increase cwnd after app-limited
  
  Cubic calculates the new cwnd based on absolute time
  elapsed since the start of an epoch. A cubic epoch is
  started on congestion events, or once the congestion
  avoidance phase is started, after slow-start has
  completed.
  
  When a sender is application limited for an extended
  amount of time and subsequently a larger volume of data
  becomes ready for sending, Cubic recalculates cwnd
  with a lingering cubic epoch. This recalculation
  of the cwnd can induce a massive increase in cwnd,
  causing a burst of data to be sent at line rate by
  the sender.
  
  This adds a flag to reset the cubic epoch once a
  session transitions from app-limited to cwnd-limited
  to prevent the above effect.
  
  Reviewed by:	chengc_netapp.com, tuexen (mentor)
  Approved by:	tuexen (mentor), rgrimes (mentor)
  MFC after:	3 weeks
  Sponsored by:	NetApp, Inc.
  Differential Revision:	https://reviews.freebsd.org/D25065

Modified:
  head/sys/netinet/cc/cc_cubic.c

Modified: head/sys/netinet/cc/cc_cubic.c
==============================================================================
--- head/sys/netinet/cc/cc_cubic.c	Wed Jun 10 05:01:00 2020	(r362005)
+++ head/sys/netinet/cc/cc_cubic.c	Wed Jun 10 07:32:02 2020	(r362006)
@@ -94,6 +94,7 @@ struct cubic {
 	uint32_t	flags;
 #define CUBICFLAG_CONG_EVENT	0x00000001	/* congestion experienced */
 #define CUBICFLAG_IN_SLOWSTART	0x00000002	/* in slow start */
+#define CUBICFLAG_IN_APPLIMIT	0x00000004	/* application limited */
 	/* Minimum observed rtt in ticks. */
 	int		min_rtt_ticks;
 	/* Mean observed rtt between congestion epochs. */
@@ -153,8 +154,10 @@ cubic_ack_received(struct cc_var *ccv, uint16_t type)
 				cubic_data->t_last_cong = ticks - INT_MAX;
 			}
 
-			if (cubic_data->flags & CUBICFLAG_IN_SLOWSTART) {
-				cubic_data->flags &= ~CUBICFLAG_IN_SLOWSTART;
+			if (cubic_data->flags & (CUBICFLAG_IN_SLOWSTART |
+						 CUBICFLAG_IN_APPLIMIT)) {
+				cubic_data->flags &= ~(CUBICFLAG_IN_SLOWSTART |
+						       CUBICFLAG_IN_APPLIMIT);
 				cubic_data->t_last_cong = ticks;
 				cubic_data->K = 0;
 			}
@@ -214,6 +217,9 @@ cubic_ack_received(struct cc_var *ccv, uint16_t type)
 				    CCV(ccv, t_maxseg));
 			}
 		}
+	} else if (type == CC_ACK && !IN_RECOVERY(CCV(ccv, t_flags)) &&
+	    !(ccv->flags & CCF_CWND_LIMITED)) {
+		cubic_data->flags |= CUBICFLAG_IN_APPLIMIT;
 	}
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202006100732.05A7W3JB058534>