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;
        }
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to