From nobody Fri Oct 31 16:12:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 57436314A7E; Tue, 28 Oct 2025 11:58:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652696; cv=none; b=FjZNV9mBuyBJTRtJGiUQxaT2fImVfkfAJBJcAsVR8i0lKfjYAm78PnIAb+sykoJzB3gRBZhYFKDrqUc4wuYGX+uRnCoSdFGMtcE+vLWwuf1Py8f83o0ayv2GBo2qmCrO/rcorZ3iiTxIQCcaNfFHCmWxfWACuZIOIgUHwPWvAWs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652696; c=relaxed/simple; bh=Bo6hSc3JJXASPAkps9ya5E8A9BBCOb0A7yQWK1KqnTw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eBQuptEVmXW4r1ng9Bfn1VzzUNMp4yvIQjsHL+9uhywbZwesELNKMQpOT7adr7LwlDVvDXblyPPKyovxzPK6fma/ypKJE1bqzrTqbZc6bI/vHszRRl4S/1GaWqS7oZotWC0vDt+/19nRDguTbI3wvtKnqDA9I4OfADhBTSjBBm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cjx/73B/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cjx/73B/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7901C116B1; Tue, 28 Oct 2025 11:58:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761652696; bh=Bo6hSc3JJXASPAkps9ya5E8A9BBCOb0A7yQWK1KqnTw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cjx/73B/qjq1GxLHC1GFw8brSHOGozMVoJGs54Cp6NbaVzUVg0AZWOfgQc093p0he AEsFDH9ZM59cv/bVaSnnOxN/AM0bWtKQzXUr1KXZnsj0v+ORX64O4KYLyvXmu57rLE wN2fB4plg6xPfByvQ8ZZf6j1mj4LR0OjTFaAjdEKfOh8eVGo8W2T6tIKVmBde+DQpK aak0bxnKIF57ZcfTgMZedUtvqlSMNttsCdlmSsuEVNb4KIZtIae8e8r0Lcr/ucFvKc NfODrKLkbiygadVHw0UAyr+yYh6zzihMWyHsT6hkJMVI78yEGzpqWR2x06o/irz62u xqRA0NMvyuu8w== From: "Matthieu Baerts (NGI0)" Date: Tue, 28 Oct 2025 12:57:59 +0100 Subject: [PATCH net v3 1/4] mptcp: fix subflow rcvbuf adjust Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251028-net-tcp-recv-autotune-v3-1-74b43ba4c84c@kernel.org> References: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> In-Reply-To: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> To: Eric Dumazet , Neal Cardwell , Kuniyuki Iwashima , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Simon Horman , David Ahern , Matthieu Baerts , Mat Martineau , Geliang Tang Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, mptcp@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1530; i=matttbe@kernel.org; h=from:subject:message-id; bh=RfFDmayrd1G2Z2Wi+ylIVloQeITK72fIlA8bFaeMXNo=; b=owGbwMvMwCVWo/Th0Gd3rumMp9WSGDIZ1p/dpThb+8uHtW6fgkvzdaPFtb5cubnE9eKt1L+Nf xI3Cyurd5SyMIhxMciKKbJIt0Xmz3xexVvi5WcBM4eVCWQIAxenAExEPpnhn/b8b2VLlfhzbz0P +bjh7KF1zrt70yO5H6zR6ZoUZhogNo2Roen9qVd7Y+Vu9Gy5cOZD6Y+ry+/KTzz26KpWg+jPR+c 5gpkB X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Paolo Abeni The mptcp PM can add subflow to the conn_list before tcp_init_transfer(). Calling tcp_rcvbuf_grow() on such subflow is not correct as later init will overwrite the update. Fix the issue calling tcp_rcvbuf_grow() only after init buffer initialization. Fixes: e118cdc34dd1 ("mptcp: rcvbuf auto-tuning improvement") Signed-off-by: Paolo Abeni Signed-off-by: Matthieu Baerts (NGI0) --- net/mptcp/protocol.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 0292162a14ee..a8a3bdf95543 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2051,6 +2051,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock = *msk, int copied) =20 msk->rcvq_space.space =3D msk->rcvq_space.copied; if (mptcp_rcvbuf_grow(sk)) { + int copied =3D msk->rcvq_space.copied; =20 /* Make subflows follow along. If we do not do this, we * get drops at subflow level if skbs can't be moved to @@ -2063,8 +2064,11 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock= *msk, int copied) =20 ssk =3D mptcp_subflow_tcp_sock(subflow); slow =3D lock_sock_fast(ssk); - tcp_sk(ssk)->rcvq_space.space =3D msk->rcvq_space.copied; - tcp_rcvbuf_grow(ssk); + /* subflows can be added before tcp_init_transfer() */ + if (tcp_sk(ssk)->rcvq_space.space) { + tcp_sk(ssk)->rcvq_space.space =3D copied; + tcp_rcvbuf_grow(ssk); + } unlock_sock_fast(ssk, slow); } } --=20 2.51.0 From nobody Fri Oct 31 16:12:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE2F531960D; Tue, 28 Oct 2025 11:58:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652699; cv=none; b=o6D5rpgk7HbREGBNv54gmEUOajQqRjLZUfBWgHHKfn0Etc7QYTEDYcSbNfXb3UHN9DvCNlqTPF6ejvhdR/6iFqB6J31GKn1nddVhb80/fQkZNknlqN1LFOq3VNoM1NzBkKDPsGf/pev9NtAHmrjgYGi8AqWdWAX57jNMTZ17O1k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652699; c=relaxed/simple; bh=qGYs0DLzW08coKCc8jkFrJyAxhu+Nf/cV/UOBJyzkN8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gJADO93iq4nYTQYpmmznJH2PRzGPajbaMhfK37w65JDkmq6DUZ5p3FKL2gEXE36xGX4o1ZzkW3WgQrMqj37ar+jh2eenNjPTbb1zguoWDrJc12Ou04vjxDZ81wd66saK181SjKPsGMvAap2/q1TRpSWotohg9Hy1nKbZPmiiSLA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MUgj8yP0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MUgj8yP0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 628A4C4CEE7; Tue, 28 Oct 2025 11:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761652699; bh=qGYs0DLzW08coKCc8jkFrJyAxhu+Nf/cV/UOBJyzkN8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MUgj8yP0ESwX62sPUlJnZpYSqp1/Ih36ePZ01jMxGmS6EG3o1ef8rb+s2EoFfoqRd GOl3Nn9ktJKWvsNOylaQJNbDS9blnQQTHXK+dwcZaX5rUkbK0FM21z/Sgg+61dp5dx glz9wJtVwAm1P++cevqERdLYyDpuvqWz2pWpn32gZqWPDXuA15RpabWjN6HvrcKpgf /wexZEL6CqmbUj7XHZ/iTl2okvf5lb4YTQhCVYoKYGdyVEOITSwfMnW/x4NW9f0iGX EEfEX1UEKyBLWmVASYPlSyD7FDZnUAHulJ7mmUle0VQHvJA4s61HFPgiXm0mQO1vWX mz7zyKpzZWC/g== From: "Matthieu Baerts (NGI0)" Date: Tue, 28 Oct 2025 12:58:00 +0100 Subject: [PATCH net v3 2/4] trace: tcp: add three metrics to trace_tcp_rcvbuf_grow() Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251028-net-tcp-recv-autotune-v3-2-74b43ba4c84c@kernel.org> References: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> In-Reply-To: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> To: Eric Dumazet , Neal Cardwell , Kuniyuki Iwashima , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Simon Horman , David Ahern , Matthieu Baerts , Mat Martineau , Geliang Tang Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, mptcp@lists.linux.dev, Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3122; i=matttbe@kernel.org; h=from:subject:message-id; bh=FKVsH/2wDJdmfPbL8tB+fxeV7oTsmdA5vp27hpF0BUE=; b=owGbwMvMwCVWo/Th0Gd3rumMp9WSGDIZ1p/3izRN77R4K/Nhc6tPq3qFl8XfN+vWbeGQa3+su sAy18O5o5SFQYyLQVZMkUW6LTJ/5vMq3hIvPwuYOaxMIEMYuDgFYCKfXjMyfGg/43dANe180/Y5 kav/mC2oVC4Rzl9wQ+eg3TTZ0DPdJQz/9KZtZ7jbln7AtTqkTO6YaorgiqsbxZScQxSXCy4R7T3 LCgA= X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Eric Dumazet While chasing yet another receive autotuning bug, I found useful to add rcv_ssthresh, window_clamp and rcv_wnd. tcp_stream 40597 [068] 2172.978198: tcp:tcp_rcvbuf_grow: time=3D50307 rtt_= us=3D50179 copied=3D77824 inq=3D0 space=3D40960 ooo=3D0 scaling_ratio=3D219= rcvbuf=3D131072 rcv_ssthresh=3D107474 window_clamp=3D112128 rcv_wnd=3D1105= 92 tcp_stream 40597 [068] 2173.028528: tcp:tcp_rcvbuf_grow: time=3D50336 rtt_= us=3D50206 copied=3D110592 inq=3D0 space=3D77824 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D509444 rcv_ssthresh=3D328658 window_clamp=3D435813 rcv_wnd=3D331= 776 tcp_stream 40597 [068] 2173.078830: tcp:tcp_rcvbuf_grow: time=3D50305 rtt_= us=3D50070 copied=3D270336 inq=3D0 space=3D110592 ooo=3D0 scaling_ratio=3D2= 19 rcvbuf=3D509444 rcv_ssthresh=3D431159 window_clamp=3D435813 rcv_wnd=3D43= 4176 tcp_stream 40597 [068] 2173.129137: tcp:tcp_rcvbuf_grow: time=3D50313 rtt_= us=3D50118 copied=3D434176 inq=3D0 space=3D270336 ooo=3D0 scaling_ratio=3D2= 19 rcvbuf=3D2457847 rcv_ssthresh=3D1299511 window_clamp=3D2102611 rcv_wnd= =3D1302528 tcp_stream 40597 [068] 2173.179451: tcp:tcp_rcvbuf_grow: time=3D50318 rtt_= us=3D50041 copied=3D1019904 inq=3D0 space=3D434176 ooo=3D0 scaling_ratio=3D= 219 rcvbuf=3D2457847 rcv_ssthresh=3D2087445 window_clamp=3D2102611 rcv_wnd= =3D2088960 Signed-off-by: Eric Dumazet Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Neal Cardwell --- To: Steven Rostedt To: Masami Hiramatsu To: Mathieu Desnoyers Cc: linux-trace-kernel@vger.kernel.org --- include/trace/events/tcp.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h index 9d2c36c6a0ed..6757233bd064 100644 --- a/include/trace/events/tcp.h +++ b/include/trace/events/tcp.h @@ -218,6 +218,9 @@ TRACE_EVENT(tcp_rcvbuf_grow, __field(__u32, space) __field(__u32, ooo_space) __field(__u32, rcvbuf) + __field(__u32, rcv_ssthresh) + __field(__u32, window_clamp) + __field(__u32, rcv_wnd) __field(__u8, scaling_ratio) __field(__u16, sport) __field(__u16, dport) @@ -245,6 +248,9 @@ TRACE_EVENT(tcp_rcvbuf_grow, tp->rcv_nxt; =20 __entry->rcvbuf =3D sk->sk_rcvbuf; + __entry->rcv_ssthresh =3D tp->rcv_ssthresh; + __entry->window_clamp =3D tp->window_clamp; + __entry->rcv_wnd =3D tp->rcv_wnd; __entry->scaling_ratio =3D tp->scaling_ratio; __entry->sport =3D ntohs(inet->inet_sport); __entry->dport =3D ntohs(inet->inet_dport); @@ -264,11 +270,14 @@ TRACE_EVENT(tcp_rcvbuf_grow, ), =20 TP_printk("time=3D%u rtt_us=3D%u copied=3D%u inq=3D%u space=3D%u ooo=3D%u= scaling_ratio=3D%u rcvbuf=3D%u " + "rcv_ssthresh=3D%u window_clamp=3D%u rcv_wnd=3D%u " "family=3D%s sport=3D%hu dport=3D%hu saddr=3D%pI4 daddr=3D%pI4 " "saddrv6=3D%pI6c daddrv6=3D%pI6c skaddr=3D%p sock_cookie=3D%llx", __entry->time, __entry->rtt_us, __entry->copied, __entry->inq, __entry->space, __entry->ooo_space, __entry->scaling_ratio, __entry->rcvbuf, + __entry->rcv_ssthresh, __entry->window_clamp, + __entry->rcv_wnd, show_family_name(__entry->family), __entry->sport, __entry->dport, __entry->saddr, __entry->daddr, --=20 2.51.0 From nobody Fri Oct 31 16:12:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7481031A055; Tue, 28 Oct 2025 11:58:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652702; cv=none; b=uaf7aGYd/wK0JxKGhsL+iHbVEelrFbXj3781p9qtSkUYn+5MF38hogq9RhjZd3KXbeCfMUgtKGYDs0W7T0tvm6hwn500K84MgN351TVGqu3IUaV370fEbU2iOaaMZHczwrVUxNa0v1WBe3PI3d2IUYQk44ZmwWWI+SOmG3fOqrc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652702; c=relaxed/simple; bh=yH7KKdEncOuWCw0Rid4HIJ22FlA/XySvA55XieJCyrU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W8ZBE32jaCLQ8Yczmm7HJh68JKMNlR77XOIecEYQs7wwwZS32jPqTCD04s9S7+GIpZ65FBK67u7N1z3J7zsvKxMiONaGlPny82Mrwh6R4JwnwJGWV4AaMEq7j6SkwH2/lztLukJFSaQ3Q7Ga1T5vdcNiDB4k1mOozE42IBXn1KU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iAoXuQRD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iAoXuQRD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B633CC4CEF7; Tue, 28 Oct 2025 11:58:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761652702; bh=yH7KKdEncOuWCw0Rid4HIJ22FlA/XySvA55XieJCyrU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iAoXuQRDsLaiKRZ97y/llHd1GOecjuUjwJfPebP/aM3BZxCUuV5QqeDF5Y3adjmPw +6V8wC0WBYc5fnFT21A8P93jVSKZN9f7D7TY4BcnXDK6eRWq0dn2KSHb9+NMW2PW/t 7fslb4ZMoFwQXJE4fj2UwQKpgsvwm+d+tD+d3ce3V9KDyhJK/sG6jLWkirhHiVfajS 1k2aqnQXUOfFGx1Ul81hpyqRJpYd5MImZhd5ZFpHekIFamXReYp7DuhpznGEGyLTdr 18zAVNbX6WfwxzObH5N+J7yzIr0hBqbqr87SV2Annkla0kmZlQbbhv9MJ0I8W4SXQ7 N3StzOLo1NMMw== From: "Matthieu Baerts (NGI0)" Date: Tue, 28 Oct 2025 12:58:01 +0100 Subject: [PATCH net v3 3/4] tcp: add newval parameter to tcp_rcvbuf_grow() Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251028-net-tcp-recv-autotune-v3-3-74b43ba4c84c@kernel.org> References: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> In-Reply-To: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> To: Eric Dumazet , Neal Cardwell , Kuniyuki Iwashima , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Simon Horman , David Ahern , Matthieu Baerts , Mat Martineau , Geliang Tang Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, mptcp@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5164; i=matttbe@kernel.org; h=from:subject:message-id; bh=CEgLJN/G2utHiPRzDgGJA0SRmsiXroTRCizCIPg4FdY=; b=owGbwMvMwCVWo/Th0Gd3rumMp9WSGDIZ1l841RPr7rjv+Pqpm1adMdx+0uvf5JpVP037GfJ8r 6e5ffVJ6ihlYRDjYpAVU2SRbovMn/m8irfEy88CZg4rE8gQBi5OAZhI/G9Ghq6fyRtdtGJ402/0 L88yOn3eeZ9Bktf0Z/2blvw3YOor4WFk6DArO237Z4LPhWPP/lzT01i1aP7LK/WpVxcvurpZzG/ iMzYA X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Eric Dumazet This patch has no functional change, and prepares the following one. tcp_rcvbuf_grow() will need to have access to tp->rcvq_space.space old and new values. Change mptcp_rcvbuf_grow() in a similar way. Signed-off-by: Eric Dumazet [ Moved 'oldval' declaration to the next patch to avoid warnings at build time. ] Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Neal Cardwell --- include/net/tcp.h | 2 +- net/ipv4/tcp_input.c | 14 +++++++------- net/mptcp/protocol.c | 20 ++++++++------------ 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 5ca230ed526a..ab20f549b8f9 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -370,7 +370,7 @@ void tcp_delack_timer_handler(struct sock *sk); int tcp_ioctl(struct sock *sk, int cmd, int *karg); enum skb_drop_reason tcp_rcv_state_process(struct sock *sk, struct sk_buff= *skb); void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); -void tcp_rcvbuf_grow(struct sock *sk); +void tcp_rcvbuf_grow(struct sock *sk, u32 newval); void tcp_rcv_space_adjust(struct sock *sk); int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp); void tcp_twsk_destructor(struct sock *sk); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 31ea5af49f2d..cb4e07f84ae2 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -891,18 +891,20 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock= *sk, } } =20 -void tcp_rcvbuf_grow(struct sock *sk) +void tcp_rcvbuf_grow(struct sock *sk, u32 newval) { const struct net *net =3D sock_net(sk); struct tcp_sock *tp =3D tcp_sk(sk); - int rcvwin, rcvbuf, cap; + u32 rcvwin, rcvbuf, cap; + + tp->rcvq_space.space =3D newval; =20 if (!READ_ONCE(net->ipv4.sysctl_tcp_moderate_rcvbuf) || (sk->sk_userlocks & SOCK_RCVBUF_LOCK)) return; =20 /* slow start: allow the sender to double its rate. */ - rcvwin =3D tp->rcvq_space.space << 1; + rcvwin =3D newval << 1; =20 if (!RB_EMPTY_ROOT(&tp->out_of_order_queue)) rcvwin +=3D TCP_SKB_CB(tp->ooo_last_skb)->end_seq - tp->rcv_nxt; @@ -943,9 +945,7 @@ void tcp_rcv_space_adjust(struct sock *sk) =20 trace_tcp_rcvbuf_grow(sk, time); =20 - tp->rcvq_space.space =3D copied; - - tcp_rcvbuf_grow(sk); + tcp_rcvbuf_grow(sk, copied); =20 new_measure: tp->rcvq_space.seq =3D tp->copied_seq; @@ -5270,7 +5270,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struc= t sk_buff *skb) } /* do not grow rcvbuf for not-yet-accepted or orphaned sockets. */ if (sk->sk_socket) - tcp_rcvbuf_grow(sk); + tcp_rcvbuf_grow(sk, tp->rcvq_space.space); } =20 static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index a8a3bdf95543..052a0c62023f 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -194,17 +194,18 @@ static bool mptcp_ooo_try_coalesce(struct mptcp_sock = *msk, struct sk_buff *to, * - mptcp does not maintain a msk-level window clamp * - returns true when the receive buffer is actually updated */ -static bool mptcp_rcvbuf_grow(struct sock *sk) +static bool mptcp_rcvbuf_grow(struct sock *sk, u32 newval) { struct mptcp_sock *msk =3D mptcp_sk(sk); const struct net *net =3D sock_net(sk); - int rcvwin, rcvbuf, cap; + u32 rcvwin, rcvbuf, cap; =20 + msk->rcvq_space.space =3D newval; if (!READ_ONCE(net->ipv4.sysctl_tcp_moderate_rcvbuf) || (sk->sk_userlocks & SOCK_RCVBUF_LOCK)) return false; =20 - rcvwin =3D msk->rcvq_space.space << 1; + rcvwin =3D newval << 1; =20 if (!RB_EMPTY_ROOT(&msk->out_of_order_queue)) rcvwin +=3D MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq - msk->ack_seq; @@ -334,7 +335,7 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk= , struct sk_buff *skb) skb_set_owner_r(skb, sk); /* do not grow rcvbuf for not-yet-accepted or orphaned sockets. */ if (sk->sk_socket) - mptcp_rcvbuf_grow(sk); + mptcp_rcvbuf_grow(sk, msk->rcvq_space.space); } =20 static void mptcp_init_skb(struct sock *ssk, struct sk_buff *skb, int offs= et, @@ -2049,10 +2050,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock= *msk, int copied) if (msk->rcvq_space.copied <=3D msk->rcvq_space.space) goto new_measure; =20 - msk->rcvq_space.space =3D msk->rcvq_space.copied; - if (mptcp_rcvbuf_grow(sk)) { - int copied =3D msk->rcvq_space.copied; - + if (mptcp_rcvbuf_grow(sk, msk->rcvq_space.copied)) { /* Make subflows follow along. If we do not do this, we * get drops at subflow level if skbs can't be moved to * the mptcp rx queue fast enough (announced rcv_win can @@ -2065,10 +2063,8 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock= *msk, int copied) ssk =3D mptcp_subflow_tcp_sock(subflow); slow =3D lock_sock_fast(ssk); /* subflows can be added before tcp_init_transfer() */ - if (tcp_sk(ssk)->rcvq_space.space) { - tcp_sk(ssk)->rcvq_space.space =3D copied; - tcp_rcvbuf_grow(ssk); - } + if (tcp_sk(ssk)->rcvq_space.space) + tcp_rcvbuf_grow(ssk, msk->rcvq_space.copied); unlock_sock_fast(ssk, slow); } } --=20 2.51.0 From nobody Fri Oct 31 16:12:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B7C931A57A; Tue, 28 Oct 2025 11:58:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652705; cv=none; b=hyLuugxraY7bPNb0UGpzselrdPK95+BbU+Ju7YEHaXjALWE6TTG9vqBJU5/d2yf1UjQCN/wfAFp/Fal4FX1voPGRtxJ8i5ooL+PdXsmdkzHRjzDafjRUmk4QsuXUMWmJwbAE9fUsmtkX0MPCjtUrwMheQ0qHXkgACGrYRuoB1tE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761652705; c=relaxed/simple; bh=GmHXkdInkwrHHB/fwx6KL5afGG/UEzE3X5JMsjJco6s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JpyCjFrG9Lj3FVWzK9YLk8I7ogCv3t+2U+cub6ksqcAmwBXXdY6YOdbhyAOJ5Ymdwz2/QjuFKEO05+t76ykzTbWieR8srsgaSULU+lufv7vgtR3LzKki1dX5DVszxwUvvS3C7sfVspqIRmQeZNMiZ2IN4m8FFB8gsfYlaMYdz1Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=p5tu+un5; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="p5tu+un5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70F2AC4CEE7; Tue, 28 Oct 2025 11:58:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1761652704; bh=GmHXkdInkwrHHB/fwx6KL5afGG/UEzE3X5JMsjJco6s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=p5tu+un5af7ooxSB3AUPMJ2Yr0lOwUut9mirp3q1nYyebICWrUHh77iNWS/8rFgGx 9Ecs+fWl0yswAVGaJt945EUO7ZWzSVpAvmOIZNjbhquIhshVOkm1FESP3Qn76RycHn Xi2TT5x/tNR8lpXXontQdu9M6ioGk3H7ViPdTl35Jjl8DKRQ7oS5fAP4ubx4C9VjKm 3x4ahhTMxODX5OMYPjczb4Wvp5uPaW9vP2OHjVP17V7R6VOVaGjA1oRbXLidmBq0a1 efMaGNPaZ4WIsOkv2tBNHfrEeJqeanHZPCNuK8/CEDobXG6u7OoCqFWhrAwzZrY6QS 7+t78T0MT4MRA== From: "Matthieu Baerts (NGI0)" Date: Tue, 28 Oct 2025 12:58:02 +0100 Subject: [PATCH net v3 4/4] tcp: fix too slow tcp_rcvbuf_grow() action Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251028-net-tcp-recv-autotune-v3-4-74b43ba4c84c@kernel.org> References: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> In-Reply-To: <20251028-net-tcp-recv-autotune-v3-0-74b43ba4c84c@kernel.org> To: Eric Dumazet , Neal Cardwell , Kuniyuki Iwashima , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Simon Horman , David Ahern , Matthieu Baerts , Mat Martineau , Geliang Tang Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, mptcp@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=12065; i=matttbe@kernel.org; h=from:subject:message-id; bh=h92uSafpnw8i/Qp5co+OjVSTK8rmje1D218J6OdeVuA=; b=owGbwMvMwCVWo/Th0Gd3rumMp9WSGDIZ1l9cWqOeHsMu9H8Tf9ULa9ar95Wk9B8WqL3L8gspF eU40SPSUcrCIMbFICumyCLdFpk/83kVb4mXnwXMHFYmkCEMXJwCMJGaMEaGH6ldWzZ1xnK966ya dLws/peUX3F2O59cP9PW/euW2izNZfgft0B1/fNrtab2JpkCkavT5Jf4muTcXZBl2MA482f1MzU eAA== X-Developer-Key: i=matttbe@kernel.org; a=openpgp; fpr=E8CB85F76877057A6E27F77AF6B7824F4269A073 From: Eric Dumazet While the blamed commits apparently avoided an overshoot, they also limited how fast a sender can increase BDP at each RTT. This is not exactly a revert, we do not add the 16 * tp->advmss cushion we had, and we are keeping the out_of_order_queue contribution. Do the same in mptcp_rcvbuf_grow(). Tested: emulated 50ms rtt (tcp_stream --tcp-tx-delay 50000), cubic 20 second flow. net.ipv4.tcp_rmem set to "4096 131072 67000000" perf record -a -e tcp:tcp_rcvbuf_grow sleep 20 perf script Before: We can see we fail to roughly double RWIN at each RTT. Sender is RWIN limited while CWND is ramping up (before getting tcp_wmem limited). tcp_stream 33793 [010] 825.717525: tcp:tcp_rcvbuf_grow: time=3D100869 rtt_= us=3D50428 copied=3D49152 inq=3D0 space=3D40960 ooo=3D0 scaling_ratio=3D219= rcvbuf=3D131072 rcv_ssthresh=3D103970 window_clamp=3D112128 rcv_wnd=3D1064= 96 tcp_stream 33793 [010] 825.768966: tcp:tcp_rcvbuf_grow: time=3D51447 rtt_u= s=3D50362 copied=3D86016 inq=3D0 space=3D49152 ooo=3D0 scaling_ratio=3D219 = rcvbuf=3D131072 rcv_ssthresh=3D107474 window_clamp=3D112128 rcv_wnd=3D106496 tcp_stream 33793 [010] 825.821539: tcp:tcp_rcvbuf_grow: time=3D52577 rtt_u= s=3D50243 copied=3D114688 inq=3D0 space=3D86016 ooo=3D0 scaling_ratio=3D219= rcvbuf=3D201096 rcv_ssthresh=3D167377 window_clamp=3D172031 rcv_wnd=3D1679= 36 tcp_stream 33793 [010] 825.871781: tcp:tcp_rcvbuf_grow: time=3D50248 rtt_u= s=3D50237 copied=3D167936 inq=3D0 space=3D114688 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D268129 rcv_ssthresh=3D224722 window_clamp=3D229375 rcv_wnd=3D225= 280 tcp_stream 33793 [010] 825.922475: tcp:tcp_rcvbuf_grow: time=3D50698 rtt_u= s=3D50183 copied=3D241664 inq=3D0 space=3D167936 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D392617 rcv_ssthresh=3D331217 window_clamp=3D335871 rcv_wnd=3D323= 584 tcp_stream 33793 [010] 825.973326: tcp:tcp_rcvbuf_grow: time=3D50855 rtt_u= s=3D50213 copied=3D339968 inq=3D0 space=3D241664 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D564986 rcv_ssthresh=3D478674 window_clamp=3D483327 rcv_wnd=3D462= 848 tcp_stream 33793 [010] 826.023970: tcp:tcp_rcvbuf_grow: time=3D50647 rtt_u= s=3D50248 copied=3D491520 inq=3D0 space=3D339968 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D794811 rcv_ssthresh=3D671778 window_clamp=3D679935 rcv_wnd=3D651= 264 tcp_stream 33793 [010] 826.074612: tcp:tcp_rcvbuf_grow: time=3D50648 rtt_u= s=3D50227 copied=3D700416 inq=3D0 space=3D491520 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D1149124 rcv_ssthresh=3D974881 window_clamp=3D983039 rcv_wnd=3D94= 2080 tcp_stream 33793 [010] 826.125452: tcp:tcp_rcvbuf_grow: time=3D50845 rtt_u= s=3D50225 copied=3D987136 inq=3D8192 space=3D700416 ooo=3D0 scaling_ratio= =3D219 rcvbuf=3D1637502 rcv_ssthresh=3D1392674 window_clamp=3D1400831 rcv_w= nd=3D1339392 tcp_stream 33793 [010] 826.175698: tcp:tcp_rcvbuf_grow: time=3D50250 rtt_u= s=3D50198 copied=3D1347584 inq=3D0 space=3D978944 ooo=3D0 scaling_ratio=3D2= 19 rcvbuf=3D2288672 rcv_ssthresh=3D1949729 window_clamp=3D1957887 rcv_wnd= =3D1945600 tcp_stream 33793 [010] 826.225947: tcp:tcp_rcvbuf_grow: time=3D50252 rtt_u= s=3D50240 copied=3D1945600 inq=3D0 space=3D1347584 ooo=3D0 scaling_ratio=3D= 219 rcvbuf=3D3150516 rcv_ssthresh=3D2687010 window_clamp=3D2695167 rcv_wnd= =3D2691072 tcp_stream 33793 [010] 826.276175: tcp:tcp_rcvbuf_grow: time=3D50233 rtt_u= s=3D50224 copied=3D2691072 inq=3D0 space=3D1945600 ooo=3D0 scaling_ratio=3D= 219 rcvbuf=3D4548617 rcv_ssthresh=3D3883041 window_clamp=3D3891199 rcv_wnd= =3D3887104 tcp_stream 33793 [010] 826.326403: tcp:tcp_rcvbuf_grow: time=3D50233 rtt_u= s=3D50229 copied=3D3887104 inq=3D0 space=3D2691072 ooo=3D0 scaling_ratio=3D= 219 rcvbuf=3D6291456 rcv_ssthresh=3D5370482 window_clamp=3D5382144 rcv_wnd= =3D5373952 tcp_stream 33793 [010] 826.376723: tcp:tcp_rcvbuf_grow: time=3D50323 rtt_u= s=3D50218 copied=3D5373952 inq=3D0 space=3D3887104 ooo=3D0 scaling_ratio=3D= 219 rcvbuf=3D9087658 rcv_ssthresh=3D7755537 window_clamp=3D7774207 rcv_wnd= =3D7757824 tcp_stream 33793 [010] 826.426991: tcp:tcp_rcvbuf_grow: time=3D50274 rtt_u= s=3D50196 copied=3D7757824 inq=3D180224 space=3D5373952 ooo=3D0 scaling_rat= io=3D219 rcvbuf=3D12563759 rcv_ssthresh=3D10729233 window_clamp=3D10747903 = rcv_wnd=3D10575872 tcp_stream 33793 [010] 826.477229: tcp:tcp_rcvbuf_grow: time=3D50241 rtt_u= s=3D50078 copied=3D10731520 inq=3D180224 space=3D7577600 ooo=3D0 scaling_ra= tio=3D219 rcvbuf=3D17715667 rcv_ssthresh=3D15136529 window_clamp=3D15155199= rcv_wnd=3D14983168 tcp_stream 33793 [010] 826.527482: tcp:tcp_rcvbuf_grow: time=3D50258 rtt_u= s=3D50153 copied=3D15138816 inq=3D360448 space=3D10551296 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D24667870 rcv_ssthresh=3D21073410 window_clamp=3D2110259= 1 rcv_wnd=3D20766720 tcp_stream 33793 [010] 826.577712: tcp:tcp_rcvbuf_grow: time=3D50234 rtt_u= s=3D50228 copied=3D21073920 inq=3D0 space=3D14778368 ooo=3D0 scaling_ratio= =3D219 rcvbuf=3D34550339 rcv_ssthresh=3D29517041 window_clamp=3D29556735 rc= v_wnd=3D29519872 tcp_stream 33793 [010] 826.627982: tcp:tcp_rcvbuf_grow: time=3D50275 rtt_u= s=3D50220 copied=3D29519872 inq=3D540672 space=3D21073920 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D49268707 rcv_ssthresh=3D42090625 window_clamp=3D4214783= 9 rcv_wnd=3D41627648 tcp_stream 33793 [010] 826.678274: tcp:tcp_rcvbuf_grow: time=3D50296 rtt_u= s=3D50185 copied=3D42053632 inq=3D761856 space=3D28979200 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57238168 window_clamp=3D5731640= 6 rcv_wnd=3D56606720 tcp_stream 33793 [010] 826.728627: tcp:tcp_rcvbuf_grow: time=3D50357 rtt_u= s=3D50128 copied=3D43913216 inq=3D851968 space=3D41291776 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D56524800 tcp_stream 33793 [010] 827.131364: tcp:tcp_rcvbuf_grow: time=3D50239 rtt_u= s=3D50127 copied=3D43843584 inq=3D655360 space=3D43061248 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D56696832 tcp_stream 33793 [010] 827.181613: tcp:tcp_rcvbuf_grow: time=3D50254 rtt_u= s=3D50115 copied=3D43843584 inq=3D524288 space=3D43188224 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D56807424 tcp_stream 33793 [010] 828.339635: tcp:tcp_rcvbuf_grow: time=3D50283 rtt_u= s=3D50110 copied=3D43843584 inq=3D458752 space=3D43319296 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D56864768 tcp_stream 33793 [010] 828.440350: tcp:tcp_rcvbuf_grow: time=3D50404 rtt_u= s=3D50099 copied=3D43843584 inq=3D393216 space=3D43384832 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D56922112 tcp_stream 33793 [010] 829.195106: tcp:tcp_rcvbuf_grow: time=3D50154 rtt_u= s=3D50077 copied=3D43843584 inq=3D196608 space=3D43450368 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57290728 window_clamp=3D5731640= 6 rcv_wnd=3D57090048 After: It takes few steps to increase RWIN. Sender is no longer RWIN limited. tcp_stream 50826 [010] 935.634212: tcp:tcp_rcvbuf_grow: time=3D100788 rtt_= us=3D50315 copied=3D49152 inq=3D0 space=3D40960 ooo=3D0 scaling_ratio=3D219= rcvbuf=3D131072 rcv_ssthresh=3D103970 window_clamp=3D112128 rcv_wnd=3D1064= 96 tcp_stream 50826 [010] 935.685642: tcp:tcp_rcvbuf_grow: time=3D51437 rtt_u= s=3D50361 copied=3D86016 inq=3D0 space=3D49152 ooo=3D0 scaling_ratio=3D219 = rcvbuf=3D160875 rcv_ssthresh=3D132969 window_clamp=3D137623 rcv_wnd=3D131072 tcp_stream 50826 [010] 935.738299: tcp:tcp_rcvbuf_grow: time=3D52660 rtt_u= s=3D50256 copied=3D139264 inq=3D0 space=3D86016 ooo=3D0 scaling_ratio=3D219= rcvbuf=3D502741 rcv_ssthresh=3D411497 window_clamp=3D430079 rcv_wnd=3D4136= 96 tcp_stream 50826 [010] 935.788544: tcp:tcp_rcvbuf_grow: time=3D50249 rtt_u= s=3D50233 copied=3D307200 inq=3D0 space=3D139264 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D728690 rcv_ssthresh=3D618717 window_clamp=3D623371 rcv_wnd=3D618= 496 tcp_stream 50826 [010] 935.838796: tcp:tcp_rcvbuf_grow: time=3D50258 rtt_u= s=3D50202 copied=3D618496 inq=3D0 space=3D307200 ooo=3D0 scaling_ratio=3D21= 9 rcvbuf=3D2450338 rcv_ssthresh=3D1855709 window_clamp=3D2096187 rcv_wnd=3D= 1859584 tcp_stream 50826 [010] 935.889140: tcp:tcp_rcvbuf_grow: time=3D50347 rtt_u= s=3D50166 copied=3D1261568 inq=3D0 space=3D618496 ooo=3D0 scaling_ratio=3D2= 19 rcvbuf=3D4376503 rcv_ssthresh=3D3725291 window_clamp=3D3743961 rcv_wnd= =3D3706880 tcp_stream 50826 [010] 935.939435: tcp:tcp_rcvbuf_grow: time=3D50300 rtt_u= s=3D50185 copied=3D2478080 inq=3D24576 space=3D1261568 ooo=3D0 scaling_rati= o=3D219 rcvbuf=3D9082648 rcv_ssthresh=3D7733731 window_clamp=3D7769921 rcv_= wnd=3D7692288 tcp_stream 50826 [010] 935.989681: tcp:tcp_rcvbuf_grow: time=3D50251 rtt_u= s=3D50221 copied=3D4915200 inq=3D114688 space=3D2453504 ooo=3D0 scaling_rat= io=3D219 rcvbuf=3D16574936 rcv_ssthresh=3D14108110 window_clamp=3D14179339 = rcv_wnd=3D14024704 tcp_stream 50826 [010] 936.039967: tcp:tcp_rcvbuf_grow: time=3D50289 rtt_u= s=3D50279 copied=3D9830400 inq=3D114688 space=3D4800512 ooo=3D0 scaling_rat= io=3D219 rcvbuf=3D32695050 rcv_ssthresh=3D27896187 window_clamp=3D27969593 = rcv_wnd=3D27815936 tcp_stream 50826 [010] 936.090172: tcp:tcp_rcvbuf_grow: time=3D50211 rtt_u= s=3D50200 copied=3D19841024 inq=3D114688 space=3D9715712 ooo=3D0 scaling_ra= tio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57245176 window_clamp=3D57316406= rcv_wnd=3D57163776 tcp_stream 50826 [010] 936.140430: tcp:tcp_rcvbuf_grow: time=3D50262 rtt_u= s=3D50197 copied=3D39501824 inq=3D114688 space=3D19726336 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57245176 window_clamp=3D5731640= 6 rcv_wnd=3D57163776 tcp_stream 50826 [010] 936.190527: tcp:tcp_rcvbuf_grow: time=3D50101 rtt_u= s=3D50071 copied=3D43655168 inq=3D262144 space=3D39387136 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57259192 window_clamp=3D5731640= 6 rcv_wnd=3D57032704 tcp_stream 50826 [010] 936.240719: tcp:tcp_rcvbuf_grow: time=3D50197 rtt_u= s=3D50057 copied=3D43843584 inq=3D262144 space=3D43393024 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57259192 window_clamp=3D5731640= 6 rcv_wnd=3D57032704 tcp_stream 50826 [010] 936.341271: tcp:tcp_rcvbuf_grow: time=3D50297 rtt_u= s=3D50123 copied=3D43843584 inq=3D131072 space=3D43581440 ooo=3D0 scaling_r= atio=3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57259192 window_clamp=3D5731640= 6 rcv_wnd=3D57147392 tcp_stream 50826 [010] 936.642503: tcp:tcp_rcvbuf_grow: time=3D50131 rtt_u= s=3D50084 copied=3D43843584 inq=3D0 space=3D43712512 ooo=3D0 scaling_ratio= =3D219 rcvbuf=3D67000000 rcv_ssthresh=3D57259192 window_clamp=3D57316406 rc= v_wnd=3D57262080 Fixes: 65c5287892e9 ("tcp: fix sk_rcvbuf overshoot") Fixes: e118cdc34dd1 ("mptcp: rcvbuf auto-tuning improvement") Reported-by: Neal Cardwell Signed-off-by: Eric Dumazet Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/589 Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Neal Cardwell --- net/ipv4/tcp_input.c | 11 +++++++++-- net/mptcp/protocol.c | 10 +++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index cb4e07f84ae2..e4a979b75cc6 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -895,17 +895,24 @@ void tcp_rcvbuf_grow(struct sock *sk, u32 newval) { const struct net *net =3D sock_net(sk); struct tcp_sock *tp =3D tcp_sk(sk); - u32 rcvwin, rcvbuf, cap; + u32 rcvwin, rcvbuf, cap, oldval; + u64 grow; =20 + oldval =3D tp->rcvq_space.space; tp->rcvq_space.space =3D newval; =20 if (!READ_ONCE(net->ipv4.sysctl_tcp_moderate_rcvbuf) || (sk->sk_userlocks & SOCK_RCVBUF_LOCK)) return; =20 - /* slow start: allow the sender to double its rate. */ + /* DRS is always one RTT late. */ rcvwin =3D newval << 1; =20 + /* slow start: allow the sender to double its rate. */ + grow =3D (u64)rcvwin * (newval - oldval); + do_div(grow, oldval); + rcvwin +=3D grow << 1; + if (!RB_EMPTY_ROOT(&tp->out_of_order_queue)) rcvwin +=3D TCP_SKB_CB(tp->ooo_last_skb)->end_seq - tp->rcv_nxt; =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 052a0c62023f..875027b9319c 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -198,15 +198,23 @@ static bool mptcp_rcvbuf_grow(struct sock *sk, u32 ne= wval) { struct mptcp_sock *msk =3D mptcp_sk(sk); const struct net *net =3D sock_net(sk); - u32 rcvwin, rcvbuf, cap; + u32 rcvwin, rcvbuf, cap, oldval; + u64 grow; =20 + oldval =3D msk->rcvq_space.space; msk->rcvq_space.space =3D newval; if (!READ_ONCE(net->ipv4.sysctl_tcp_moderate_rcvbuf) || (sk->sk_userlocks & SOCK_RCVBUF_LOCK)) return false; =20 + /* DRS is always one RTT late. */ rcvwin =3D newval << 1; =20 + /* slow start: allow the sender to double its rate. */ + grow =3D (u64)rcvwin * (newval - oldval); + do_div(grow, oldval); + rcvwin +=3D grow << 1; + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue)) rcvwin +=3D MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq - msk->ack_seq; =20 --=20 2.51.0