svn commit: r362832 - stable/12/sys/netinet/cc

Richard Scheffenegger rscheff at FreeBSD.org
Wed Jul 1 09:35:34 UTC 2020


Author: rscheff
Date: Wed Jul  1 09:35:33 2020
New Revision: 362832
URL: https://svnweb.freebsd.org/changeset/base/362832

Log:
  MFC r362006: 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:
  stable/12/sys/netinet/cc/cc_cubic.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet/cc/cc_cubic.c
==============================================================================
--- stable/12/sys/netinet/cc/cc_cubic.c	Wed Jul  1 09:32:17 2020	(r362831)
+++ stable/12/sys/netinet/cc/cc_cubic.c	Wed Jul  1 09:35:33 2020	(r362832)
@@ -92,6 +92,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. */
@@ -143,8 +144,10 @@ cubic_ack_received(struct cc_var *ccv, uint16_t type)
 		} else {
 			ticks_since_cong = ticks - cubic_data->t_last_cong;
 
-			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;
 			}
@@ -197,6 +200,9 @@ cubic_ack_received(struct cc_var *ccv, uint16_t type)
 			    cubic_data->max_cwnd < CCV(ccv, snd_cwnd))
 				cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
 		}
+	} else if (type == CC_ACK && !IN_RECOVERY(CCV(ccv, t_flags)) &&
+	    !(ccv->flags & CCF_CWND_LIMITED)) {
+		cubic_data->flags |= CUBICFLAG_IN_APPLIMIT;
 	}
 }
 


More information about the svn-src-all mailing list