From owner-svn-src-all@freebsd.org Thu Nov 14 16:32:17 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id E808D1AD468; Thu, 14 Nov 2019 16:32:17 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from drew.franken.de (drew.ipv6.franken.de [IPv6:2001:638:a02:a001:20e:cff:fe4a:feaa]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.franken.de", Issuer "COMODO RSA Domain Validation Secure Server CA" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47DRpT2C0Qz4KH8; Thu, 14 Nov 2019 16:32:16 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from mb.fritz.box (ip4d16e760.dynamic.kabel-deutschland.de [77.22.231.96]) (Authenticated sender: macmic) by mail-n.franken.de (Postfix) with ESMTPSA id EA4D2721E280D; Thu, 14 Nov 2019 17:32:10 +0100 (CET) From: Michael Tuexen Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3601.0.10\)) Subject: Re: svn commit: r354708 - head/sys/netinet/cc Date: Thu, 14 Nov 2019 17:32:08 +0100 References: <201911141628.xAEGS3QO052853@repo.freebsd.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org In-Reply-To: <201911141628.xAEGS3QO052853@repo.freebsd.org> Message-Id: X-Mailer: Apple Mail (2.3601.0.10) X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=disabled version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mail-n.franken.de X-Rspamd-Queue-Id: 47DRpT2C0Qz4KH8 X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-1.82 / 15.00]; local_wl_from(0.00)[freebsd.org]; NEURAL_HAM_MEDIUM(-0.82)[-0.822,0]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; ASN(0.00)[asn:680, ipnet:2001:638::/32, country:DE] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Nov 2019 16:32:18 -0000 > On 14. Nov 2019, at 17:28, Michael Tuexen wrote: >=20 > Author: tuexen > Date: Thu Nov 14 16:28:02 2019 > New Revision: 354708 > URL: https://svnweb.freebsd.org/changeset/base/354708 >=20 > Log: > For idle TCP sessions using the CUBIC congestio control, reset = ssthresh > to the higher of the previous ssthresh or 3/4 of the prior cwnd. I mixed that up. It should have been: This patch addresses a very common case of frequent application stalls, where TCP runs idle and looses the state of the network. According to RFC5681 section 4.1, the cwnd should be reset to the Restart Window. However, cwnd will be re-calculated by cubic as soon as=20= cwnd exceeds ssthresh. Without resetting the cubic epoch, the = calculation is based off the last time an actual congestion event happend - which = may be many tens of thousands of RTTs in the past. This results in excessive jumps of cwnd or integer overflows. The observable result are huge traffic burst and self-inflicted drops. Note: This patch ONLY addresses a very frequent problem case around after-idle. Other problematic scenarios revolve around clients signaling a small=20 receive window, where the session is for a long period limited by that. Once the client decides to suddenly signal a larger receive window, the t_cong_last can still be a very long time in the past, resulting in the same issues as observed before this patch with after-idle = sessions. >=20 > Submitted by: Richard Scheffenegger > Reviewed by: Cheng Cui > Differential Revision: https://reviews.freebsd.org/D18982 https://reviews.freebsd.org/D18954 >=20 > Modified: > head/sys/netinet/cc/cc_cubic.c >=20 > Modified: head/sys/netinet/cc/cc_cubic.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- head/sys/netinet/cc/cc_cubic.c Thu Nov 14 15:10:01 2019 = (r354707) > +++ head/sys/netinet/cc/cc_cubic.c Thu Nov 14 16:28:02 2019 = (r354708) > @@ -78,6 +78,7 @@ static int cubic_mod_init(void); > static void cubic_post_recovery(struct cc_var *ccv); > static void cubic_record_rtt(struct cc_var *ccv); > static void cubic_ssthresh_update(struct cc_var *ccv); > +static void cubic_after_idle(struct cc_var *ccv); >=20 > struct cubic { > /* Cubic K in fixed point form with CUBIC_SHIFT worth of = precision. */ > @@ -112,6 +113,7 @@ struct cc_algo cubic_cc_algo =3D { > .conn_init =3D cubic_conn_init, > .mod_init =3D cubic_mod_init, > .post_recovery =3D cubic_post_recovery, > + .after_idle =3D cubic_after_idle, > }; >=20 > static void > @@ -192,7 +194,24 @@ cubic_ack_received(struct cc_var *ccv, uint16_t = type) > } > } >=20 > +/* > + * This is a Cubic specific implementation of after_idle. > + * - Reset cwnd by calling New Reno implementation of after_idle. > + * - Reset t_last_cong. > + */ > static void > +cubic_after_idle(struct cc_var *ccv) > +{ > + struct cubic *cubic_data; > + > + cubic_data =3D ccv->cc_data; > + > + newreno_cc_algo.after_idle(ccv); > + cubic_data->t_last_cong =3D ticks; > +} > + > + > +static void > cubic_cb_destroy(struct cc_var *ccv) > { > free(ccv->cc_data, M_CUBIC); > @@ -287,9 +306,6 @@ cubic_conn_init(struct cc_var *ccv) > static int > cubic_mod_init(void) > { > - > - cubic_cc_algo.after_idle =3D newreno_cc_algo.after_idle; > - > return (0); > } >=20