[PATCH RFC mptcp-next v2 3/4] mptcp: sched: do not penalise when receive-window-limited
Shardul Bankar <[email protected]>
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <20260815-mptcp_penalise_send_v2-v2-3-3e5049a73681@mpiricsoftware.com> |
The penalty in the previous patch shifts load off a slow subflow onto the fastest one, which only helps if the fastest path can absorb it. When the connection is receive-window-limited (the receiver's advertised window, not our congestion window, is the bottleneck), the fastest path is capped by that shared window too and cannot send more, so halving the slow path's cwnd just sheds its throughput. In a receive-window-limited transfer this was measured roughly 2x slower than baseline. Gate on the application's queued data fitting within the send window: penalise only while write_seq <= wnd_end. If the application has queued past the window edge the receive window is the binding constraint, so skip the penalty. Neither write_seq (application demand) nor wnd_end (peer window) is derived from cwnd, so the test is not made circular by the window itself suppressing cwnd. Co-developed-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: Shardul Bankar <[email protected]> --- net/mptcp/protocol.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 075d468d0e14..e6c10816df8d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1635,6 +1635,14 @@ static bool mptcp_penalise_throttle_ok(struct mptcp_subflow_context *subflow) return tcp_jiffies32 - subflow->last_penalise >= max_t(u32, rtt, 1); } +/* Like tcp_snd_wnd_test() but without an skb: true while queued data still fits + * the send window, i.e. not receive-window-limited. + */ +static bool mptcp_snd_wnd_test(const struct mptcp_sock *msk) +{ + return !after64(msk->write_seq, mptcp_wnd_end(msk)); +} + /* Halve cwnd (and ssthresh if past it) under the subflow socket lock. */ static void mptcp_penalise_cwnd(struct sock *ssk) { @@ -1735,6 +1743,7 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk) tcp_snd_cwnd(tcp_sk(ssk)) > MPTCP_PENALISE_MIN_CWND && inet_csk(ssk)->icsk_ca_state == TCP_CA_Open && tcp_is_cwnd_limited(fastest) && + mptcp_snd_wnd_test(msk) && mptcp_penalise_throttle_ok(subflow); burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); -- 2.34.1