All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.