* [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback()
@ 2026-10-19 11:15 Abdul Wasey
2026-10-19 18:20 ` Matthieu Baerts
2026-10-19 20:55 ` Sasha Levin
0 siblings, 2 replies; 3+ messages in thread
From: Abdul Wasey @ 2026-10-19 11:15 UTC (permalink / raw)
To: stable; +Cc: mptcp, Matthieu Baerts, Mat Martineau, Geliang Tang, Paolo Abeni
The 6.6.y backport of upstream commit 1bba3f219c5e ("mptcp: do not
fallback when OoO is present") put the out-of-order queue check
in __mptcp_finish_join() instead of __mptcp_try_fallback().
So the fix itself is missing, as fallback still happens with OoO data
queued. Worse, the passive side now refuses every MP_JOIN while its
OoO queue is not empty, which is the normal state of a connection
already sending data over more than one subflow. The joining subflow
is reset, so such a connection can't add a new path, and a path that
comes back after an outage can't rejoin while data is in flight.
Move the check to __mptcp_try_fallback(), as upstream does. On this
branch that function is in protocol.h.
Tested on 6.6.159 in netns: 6 connections (5 uploading) over two paths,
then a third endpoint added mid-transfer. Without this patch only the
idle connection gets a subflow on the new path and the other 5 joins
are reset. With it, all 6 join. Same result in 3 of 3 runs each.
Fixes: 642561238c98 ("mptcp: do not fallback when OoO is present")
Signed-off-by: Abdul Wasey <w453y.me@gmail.com>
---
net/mptcp/protocol.c | 7 -------
net/mptcp/protocol.h | 8 ++++++++
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 48b6e9ed..c63ccb4a 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -925,13 +925,6 @@ static bool __mptcp_finish_join(struct mptcp_sock *msk, struct sock *ssk)
if (sk->sk_state != TCP_ESTABLISHED)
return false;
- /* The caller possibly is not holding the msk socket lock, but
- * in the fallback case only the current subflow is touching
- * the OoO queue.
- */
- if (!RB_EMPTY_ROOT(&msk->out_of_order_queue))
- return false;
-
spin_lock_bh(&msk->fallback_lock);
if (!msk->allow_subflows) {
spin_unlock_bh(&msk->fallback_lock);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 825f7701..d70c71ee 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1126,6 +1126,14 @@ static inline bool __mptcp_try_fallback(struct mptcp_sock *msk)
pr_debug("TCP fallback already done (msk=%p)\n", msk);
return true;
}
+
+ /* The caller possibly is not holding the msk socket lock, but
+ * in the fallback case only the current subflow is touching
+ * the OoO queue.
+ */
+ if (!RB_EMPTY_ROOT(&msk->out_of_order_queue))
+ return false;
+
spin_lock_bh(&msk->fallback_lock);
if (!msk->allow_infinite_fallback) {
spin_unlock_bh(&msk->fallback_lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback()
2026-10-19 11:15 [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback() Abdul Wasey
@ 2026-10-19 18:20 ` Matthieu Baerts
2026-10-19 20:55 ` Sasha Levin
1 sibling, 0 replies; 3+ messages in thread
From: Matthieu Baerts @ 2026-10-19 18:20 UTC (permalink / raw)
To: Abdul Wasey, stable; +Cc: mptcp, Mat Martineau, Geliang Tang, Paolo Abeni
Hi Abdul,
On 19/10/2026 13:15, Abdul Wasey wrote:
> The 6.6.y backport of upstream commit 1bba3f219c5e ("mptcp: do not
> fallback when OoO is present") put the out-of-order queue check
> in __mptcp_finish_join() instead of __mptcp_try_fallback().
>
> So the fix itself is missing, as fallback still happens with OoO data
> queued. Worse, the passive side now refuses every MP_JOIN while its
> OoO queue is not empty, which is the normal state of a connection
> already sending data over more than one subflow. The joining subflow
> is reset, so such a connection can't add a new path, and a path that
> comes back after an outage can't rejoin while data is in flight.
>
> Move the check to __mptcp_try_fallback(), as upstream does. On this
> branch that function is in protocol.h.
The fix here looks good to me, thank you!
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback()
2026-10-19 11:15 [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback() Abdul Wasey
2026-10-19 18:20 ` Matthieu Baerts
@ 2026-10-19 20:55 ` Sasha Levin
1 sibling, 0 replies; 3+ messages in thread
From: Sasha Levin @ 2026-10-19 20:55 UTC (permalink / raw)
To: stable
Cc: Sasha Levin, mptcp, Matthieu Baerts, Mat Martineau, Geliang Tang,
Paolo Abeni, Abdul Wasey
> The 6.6.y backport of upstream commit 1bba3f219c5e ("mptcp: do not
> fallback when OoO is present") put the out-of-order queue check
> in __mptcp_finish_join() instead of __mptcp_try_fallback().
Queued for 6.6, thanks.
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-19 20:56 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-19 11:15 [PATCH 6.6.y] mptcp: move the OoO check back into __mptcp_try_fallback() Abdul Wasey
2026-10-19 18:20 ` Matthieu Baerts
2026-10-19 20:55 ` Sasha Levin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.