From: Wesley Atwell <atwellwea@gmail.com>
To: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
davem@davemloft.net, dsahern@kernel.org, edumazet@google.com,
horms@kernel.org, kuba@kernel.org, kuniyu@google.com,
ncardwell@google.com, pabeni@redhat.com, shuah@kernel.org,
Wesley Atwell <atwellwea@gmail.com>
Subject: [PATCH net-next 0/3] tcp: fix scaled no-shrink rwnd quantization slack
Date: Tue, 17 Mar 2026 00:51:34 -0600 [thread overview]
Message-ID: <20260317065137.1533226-1-atwellwea@gmail.com> (raw)
Hi,
this is a new, narrow series for one specific receive-window problem in
the scaled no-shrink path.
The earlier larger receive-window accounting series tried to address
multiple cases at once: quantization slack, live scaling-ratio drift,
retracted windows, repair state, MPTCP state, and extra test plumbing.
Review on that version was useful, but it also made clear that the
series was trying to carry more mechanism than the currently proven
problem justified.
This repost keeps only the part with a clear fail-before/pass-after
story today, and it keeps the stored receive-window state representable
so later no-shrink decisions continue to reason from a right edge the
peer could actually have seen on the wire.
Problem
=======
In the scaled no-shrink path, __tcp_select_window() rounds free_space up
to the receive-window scale quantum:
window = ALIGN(free_space, 1 << tp->rx_opt.rcv_wscale);
When free_space sits just below the next quantum, that can expose fresh
sender-visible credit that is not actually backed by the current receive
memory state.
That is not just a presentation artifact. Later hard admission can still
reject data which is within the sender-visible offer.
A narrower first rework that stored raw free_space would not have been
safe either. Later no-shrink preservation derives the current offer from
tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt
so the stored window still needs to remain representable in scaled
units.
Approach
========
Instead of rounding larger raw windows up in the scaled no-shrink path,
keep only the cases we actually need:
- relax one unrelated packetdrill test which was pinning an
incidental advertised window
- keep tp->rcv_wnd representable in scaled units by rounding larger
windows down to the scale quantum
- preserve only the small non-zero case that would otherwise scale
away to zero
- rely on the existing tcp_select_window() no-shrink preservation
logic for already-exposed credit
That removes the larger-window quantization slack from rounding
free_space up, while preserving the small non-zero case needed to avoid
scaling away to zero.
Tests
=====
The packetdrill reproducer exercises both the immediate quantization
case and a follow-on ACK after a small OOO receive-memory change.
Before the TCP change, it fails on the first outbound packet with the
advertised window one scaled unit too large:
expected: win 84
actual: win 85
After the TCP change, the reproducer passes and the follow-on ACK also
stays at 84.
Series layout
=============
1/3 selftests: packetdrill: stop pinning rwnd in tcp_ooo_rcv_mss
2/3 tcp: keep scaled no-shrink window representable
3/3 selftests: packetdrill: cover scaled rwnd quantization slack
Thanks,
Wesley Atwell
---
net/ipv4/tcp_output.c | 16 +++++---
.../selftests/net/packetdrill/tcp_ooo_rcv_mss.pkt | 8 ++--
.../packetdrill/tcp_rcv_quantization_credit.pkt | 45 ++++++++++++++++++++++
3 files changed, 61 insertions(+), 8 deletions(-)
--
2.43.0
next reply other threads:[~2026-03-17 6:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-17 6:51 Wesley Atwell [this message]
2026-03-17 6:51 ` [PATCH net-next 1/3] selftests: packetdrill: stop pinning rwnd in tcp_ooo_rcv_mss Wesley Atwell
2026-03-19 10:22 ` Paolo Abeni
2026-03-19 14:51 ` Neal Cardwell
2026-03-19 20:53 ` Wesley Atwell
2026-03-17 6:51 ` [PATCH net-next 2/3] tcp: keep scaled no-shrink window representable Wesley Atwell
2026-03-19 10:50 ` Paolo Abeni
2026-03-19 21:21 ` Wesley Atwell
2026-03-17 6:51 ` [PATCH net-next 3/3] selftests: packetdrill: cover scaled rwnd quantization slack Wesley Atwell
2026-03-22 16:32 ` Simon Baatz
2026-03-24 5:27 ` Wesley Atwell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260317065137.1533226-1-atwellwea@gmail.com \
--to=atwellwea@gmail.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox