Skip to content

Commit 27fd028

Browse files
Paolo Abenikuba-moo
authored andcommitted
mptcp: clear scheduled subflows on retransmit
When __mptcp_retrans() kicks-in, it schedules one or more subflows for retransmission, but such subflows could be actually left alone if there is no more data to retransmit and/or in case of concurrent fallback. Scheduled subflows could be processed much later in time, i.e. when new data will be transmitted, leading to bad subflow selection. Explicitly clear all scheduled subflows before leaving the retransmission function. Fixes: ee2708a ("mptcp: use get_retrans wrapper") Cc: stable@vger.kernel.org Reported-by: Filip Pokryvka <fpokryvk@redhat.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Link: https://patch.msgid.link/20251125-net-mptcp-clear-sched-rtx-v1-1-1cea4ad2165f@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent da62aba commit 27fd028

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

net/mptcp/protocol.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,7 @@ static void __mptcp_retrans(struct sock *sk)
26652665
}
26662666

26672667
if (!mptcp_send_head(sk))
2668-
return;
2668+
goto clear_scheduled;
26692669

26702670
goto reset_timer;
26712671
}
@@ -2696,7 +2696,7 @@ static void __mptcp_retrans(struct sock *sk)
26962696
if (__mptcp_check_fallback(msk)) {
26972697
spin_unlock_bh(&msk->fallback_lock);
26982698
release_sock(ssk);
2699-
return;
2699+
goto clear_scheduled;
27002700
}
27012701

27022702
while (info.sent < info.limit) {
@@ -2728,6 +2728,15 @@ static void __mptcp_retrans(struct sock *sk)
27282728

27292729
if (!mptcp_rtx_timer_pending(sk))
27302730
mptcp_reset_rtx_timer(sk);
2731+
2732+
clear_scheduled:
2733+
/* If no rtx data was available or in case of fallback, there
2734+
* could be left-over scheduled subflows; clear them all
2735+
* or later xmit could use bad ones
2736+
*/
2737+
mptcp_for_each_subflow(msk, subflow)
2738+
if (READ_ONCE(subflow->scheduled))
2739+
mptcp_subflow_set_scheduled(subflow, false);
27312740
}
27322741

27332742
/* schedule the timeout timer for the relevant event: either close timeout

0 commit comments

Comments
 (0)