From nobody Fri Sep 09 13:00:48 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4MPGM52F7lz4cZvr; Fri, 9 Sep 2022 13:00:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4MPGM51nx6z3d7N; Fri, 9 Sep 2022 13:00:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1662728449; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a5BbmUrTcxZf4NBMUGKFGHdok1ghhh0TG/Kh9ILOW/o=; b=BU+wSKs4FAo9zv/BoOhSBLle1+t9sNICfCZLemN8sGad7TJCrg6pBEOMMkStD2ATTNUr/9 QuPPOVDddfwTSjziGt6qDe0qg0B2QteH1hIwsxp9O34rTifc2DnIVJgx1QiyMtvVesKZdt 3JVJIlSrpaa2fS5s5Y9aMq+K1sYQije1MoCmXq7h4xWNiDsR1T4hB7Mh47FtHyEOjAF39b KZQfMj8ZYsEb5ZjbAR8ITCcaXfQ0Hfywm7M0hH+Kh4YFt4y66d2dTx08Rg5Nw1wNqaTXsH 5MbAs2LBTB4yfBo+RsmlGoMM8eXeyiNwG1UUr/PVWQgsbrEGD6hH8+CSlDKdag== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4MPGM50sH2z1Cj0; Fri, 9 Sep 2022 13:00:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 289D0nCc030023; Fri, 9 Sep 2022 13:00:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 289D0mEm030022; Fri, 9 Sep 2022 13:00:48 GMT (envelope-from git) Date: Fri, 9 Sep 2022 13:00:48 GMT Message-Id: <202209091300.289D0mEm030022@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Randall Stewart Subject: git: 81560c55823b - main - TCP: Rack ends up sending all that is outstanding every timeout. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rrs X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 81560c55823b2c4193ab293b210ba9d681b6e53f Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1662728449; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a5BbmUrTcxZf4NBMUGKFGHdok1ghhh0TG/Kh9ILOW/o=; b=F7VCd7cEkHPNjbZYMuye9b7BEdxORtgmhMv6riKCH/60FyGREetgRo0UWSmaJRGZWW7F3c w1Nv0CJHzEL+YotUqG+c280a+PR1Y3H132m/z2Hyh81Ll3jw7xIdxhduOb73plo3A/j6Q5 x+f/DiRVb42NuHMB7DrfwS2LryCIsbquo4pvkwuH6Agd/6HEgxe59ipweWtyiuvqV/kl19 V8V0MCPLkv4VVGxAlKNv7BWn8ZRzEZpIcCwEhUH5KlYAvpb+gwxi4PLA8VfbewFJspUQ1V neckLjDqlzVLj2M/eP3vVwl7DrKwhoF3qLz+pW6jPUXKSdVJr0SNTo6QEssCow== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1662728449; a=rsa-sha256; cv=none; b=Dl9YdAE4sfwNqmO+yhFEPYFJVb6xAfD2pab1Smzm5zkWS/LJnZ4/HF3pGI8KIKwHPRrPmZ mWMb3ZHzAb4jKkJHrAj+4EoAXyVYDKhNvXBwah8PJBJ8JeX1pFhNGTclAT7cRIjTVqqIkh Or8m1p1JuLmEMk3ui2wmI5Neys/0+X/BfYv0i9duUxMpgNtP4DaVn4yAio8HyLjTmmHCMc SLokcnBngQTOjjY9ViTRHpsY8RTIFtwhWtg3vzc8m6MkvfPRidhHa58yrtk55OWnpmVFoC pFWc7i+zV5oEN1YANrXxYPNY4s4lUTjqhRuYF5ZVI91ZW6C+H7aKQGhsJ218TA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by rrs: URL: https://cgit.FreeBSD.org/src/commit/?id=81560c55823b2c4193ab293b210ba9d681b6e53f commit 81560c55823b2c4193ab293b210ba9d681b6e53f Author: Randall Stewart AuthorDate: 2022-09-09 12:59:21 +0000 Commit: Randall Stewart CommitDate: 2022-09-09 12:59:21 +0000 TCP: Rack ends up sending all that is outstanding every timeout. In doing some testing for a different problem, I have found rack retransmitting all outstanding data every time a timeout occurs. The outstanding is sent 1ms apart between each packet, and then the timeout runs off again. This causes extra retransmissions when we should be waiting for an ack after sending the very first segment. Reviewed by: tuexen Sponsored by: Netflix Inc Differential Revision: https://reviews.freebsd.org/D36494 --- sys/netinet/tcp_stacks/rack.c | 21 +++++++++++++++++++++ sys/netinet/tcp_stacks/tcp_rack.h | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c index a97f82a02b85..3ab4494865a5 100644 --- a/sys/netinet/tcp_stacks/rack.c +++ b/sys/netinet/tcp_stacks/rack.c @@ -6685,6 +6685,7 @@ rack_timeout_rxt(struct tcpcb *tp, struct tcp_rack *rack, uint32_t cts) } rack->r_ctl.rc_hpts_flags &= ~PACE_TMR_RXT; rack->r_ctl.retran_during_recovery = 0; + rack->rc_ack_required = 1; rack->r_ctl.dsack_byte_cnt = 0; if (IN_FASTRECOVERY(tp->t_flags)) tp->t_flags |= TF_WASFRECOVERY; @@ -14068,6 +14069,11 @@ rack_do_segment_nounlock(struct mbuf *m, struct tcphdr *th, struct socket *so, */ rack = (struct tcp_rack *)tp->t_fb_ptr; if (m->m_flags & M_ACKCMP) { + /* + * All compressed ack's are ack's by definition so + * remove any ack required flag and then do the processing. + */ + rack->rc_ack_required = 0; return (rack_do_compressed_ack_processing(tp, so, m, nxt_pkt, tv)); } if (m->m_flags & M_ACKCMP) { @@ -14238,6 +14244,9 @@ rack_do_segment_nounlock(struct mbuf *m, struct tcphdr *th, struct socket *so, TCP_LOG_EVENTP(tp, th, &so->so_rcv, &so->so_snd, TCP_LOG_IN, 0, tlen, &log, true, <v); } + /* Remove ack required flag if set, we have one */ + if (thflags & TH_ACK) + rack->rc_ack_required = 0; if ((thflags & TH_SYN) && (thflags & TH_FIN) && V_drop_synfin) { way_out = 4; retval = 0; @@ -16798,6 +16807,18 @@ rack_output(struct tcpcb *tp) } #ifdef TCP_ACCOUNTING sched_unpin(); +#endif + return (0); + } + if ((rack->rc_ack_required == 1) && + (rack->r_timer_override == 0)){ + /* A timeout occurred and no ack has arrived */ + if (tcp_in_hpts(rack->rc_inp) == 0) { + /* Timer is not running */ + rack_start_hpts_timer(rack, tp, cts, 0, 0, 0); + } +#ifdef TCP_ACCOUNTING + sched_unpin(); #endif return (0); } diff --git a/sys/netinet/tcp_stacks/tcp_rack.h b/sys/netinet/tcp_stacks/tcp_rack.h index 798a1ba4364f..6f447d5ea470 100644 --- a/sys/netinet/tcp_stacks/tcp_rack.h +++ b/sys/netinet/tcp_stacks/tcp_rack.h @@ -549,7 +549,7 @@ struct tcp_rack { struct inpcb *rc_inp; /* The inpcb Lock(a) */ uint8_t rc_free_cnt; /* Number of free entries on the rc_free list * Lock(a) */ - uint8_t client_bufferlvl : 4, /* Expected range [0,5]: 0=unset, 1=low/empty */ + uint8_t client_bufferlvl : 3, /* Expected range [0,5]: 0=unset, 1=low/empty */ rack_deferred_inited : 1, /* ******************************************************************** */ /* Note for details of next two fields see rack_init_retransmit_rate() */ @@ -557,6 +557,7 @@ struct tcp_rack { full_size_rxt: 1, shape_rxt_to_pacing_min : 1, /* ******************************************************************** */ + rc_ack_required: 1, spare : 1; uint8_t no_prr_addback : 1, gp_ready : 1,