FAILED: patch "[PATCH] mptcp: fix rx timestamp corruption on fastopen" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 6254a16d6f0c672e3809ca5d7c9a28a55d71f764
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026051256-grime-usual-23e7@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6254a16d6f0c672e3809ca5d7c9a28a55d71f764 Mon Sep 17 00:00:00 2001
From: Paolo Abeni <[email protected]>
Date: Fri, 1 May 2026 21:35:36 +0200
Subject: [PATCH] mptcp: fix rx timestamp corruption on fastopen
The skb cb offset containing the timestamp presence flag is cleared before loading such information. Cache such value before MPTCP CB initialization.
net/mptcp/fastopen.c +3 -1
@@ -12,6 +12,7 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subfstruct sock *sk, *ssk;struct sk_buff *skb;struct tcp_sock *tp; +bool has_rxtstamp;/* on early fallback the subflow context is deleted by * subflow_syn_recv_sock()
@@ -40,12 +41,13 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subf*/ tp->copied_seq += skb->len; subflow->ssn_offset += skb->len; + has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp;/* Only the sequence delta is relevant */ MPTCP_SKB_CB (skb)->map_seq = -skb->len;MPTCP_SKB_CB (skb)->end_seq =0 ;MPTCP_SKB_CB (skb)->offset =0 ; -MPTCP_SKB_CB (skb)->has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp; +MPTCP_SKB_CB (skb)->has_rxtstamp = has_rxtstamp;MPTCP_SKB_CB (skb)->cant_coalesce =1 ;mptcp_data_lock (sk);
Sasha Levin
maintainerPATCH 1/2 mptcp: drop __mptcp_fastopen_gen_msk_ackseq()
From: Paolo Abeni <[email protected]>
[ Upstream commit f03afb3aeb9d81f6c5ab728a61a040012923e3b3 ]
When we will move the whole RX path under the msk socket lock, updating the already queued skb for passive fastopen socket at 3rd ack time will be extremely painful and race prone
The map_seq for already enqueued skbs is used only to allow correct coalescing with later data; preventing collapsing to the first skb of a fastopen connect we can completely remove the __mptcp_fastopen_gen_msk_ackseq() helper.
Before dropping this helper, a new item had to be added to the mptcp_skb_cb structure. Because this item will be frequently tested in the fast path -- almost on every packet -- and because there is free space there, a single byte is used instead of a bitfield. This micro optimisation slightly reduces the number of CPU operations to do the associated check.
Stable-dep-of: 6254a16d6f0c ("mptcp: fix rx timestamp corruption on fastopen")
--- net/mptcp/fastopen.c | 24 ++---------------------- net/mptcp/protocol.c | 4 +++- net/mptcp/protocol.h | 5 ++--- net/mptcp/subflow.c | 3 --- 4 files changed, 7 insertions(+), 29 deletions(-)
net/mptcp/fastopen.c +2 -22
@@ -40,13 +40,12 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subf tp->copied_seq += skb->len; subflow->ssn_offset += skb->len; -/* initialize a dummy sequence number, we will update it at MPC -* completion, if needed -*/ +/* Only the sequence delta is relevant */ MPTCP_SKB_CB (skb)->map_seq = -skb->len;MPTCP_SKB_CB (skb)->end_seq =0 ;MPTCP_SKB_CB (skb)->offset =0 ;MPTCP_SKB_CB (skb)->has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp; +MPTCP_SKB_CB (skb)->cant_coalesce =1 ;mptcp_data_lock (sk);
@@ -58,22 +57,3 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subfmptcp_data_unlock (sk); } - -void __mptcp_fastopen_gen_msk_ackseq (struct mptcp_sock *msk,struct mptcp_subflow_context *subflow, -const struct mptcp_options_received *mp_opt) -{ -struct sock *sk = (struct sock *)msk; -struct sk_buff *skb; - - skb =skb_peek_tail (&sk->sk_receive_queue); -if (skb) { -WARN_ON_ONCE (MPTCP_SKB_CB (skb)->end_seq); -pr_debug ("msk %p moving seq %llx -> %llx end_seq %llx -> %llx\n" , sk, -MPTCP_SKB_CB (skb)->map_seq,MPTCP_SKB_CB (skb)->map_seq + msk->ack_seq, -MPTCP_SKB_CB (skb)->end_seq,MPTCP_SKB_CB (skb)->end_seq + msk->ack_seq); -MPTCP_SKB_CB (skb)->map_seq += msk->ack_seq; -MPTCP_SKB_CB (skb)->end_seq += msk->ack_seq; - } - -pr_debug ("msk=%p ack_seq=%llx\n" , msk, msk->ack_seq); -}
net/mptcp/protocol.c +3 -1
@@ -139,7 +139,8 @@ static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,bool fragstolen;int delta; -if (MPTCP_SKB_CB (from)->offset || +if (unlikely (MPTCP_SKB_CB (to)->cant_coalesce) || +MPTCP_SKB_CB (from)->offset || ((to->len + from->len) > (sk->sk_rcvbuf >>3 )) || !skb_try_coalesce (to, from, &fragstolen, &delta))return false;
@@ -370,6 +371,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,MPTCP_SKB_CB (skb)->end_seq =MPTCP_SKB_CB (skb)->map_seq + copy_len;MPTCP_SKB_CB (skb)->offset = offset;MPTCP_SKB_CB (skb)->has_rxtstamp = has_rxtstamp; +MPTCP_SKB_CB (skb)->cant_coalesce =0 ;if (MPTCP_SKB_CB (skb)->map_seq == msk->ack_seq) {/* in sequence */
net/mptcp/protocol.h +2 -3
@@ -129,7 +129,8 @@ struct mptcp_skb_cb {u64 map_seq;u64 end_seq;u32 offset; - u8 has_rxtstamp:1; +u8 has_rxtstamp; +u8 cant_coalesce; };#define MPTCP_SKB_CB (__skb) ((struct mptcp_skb_cb *)&((__skb)->cb[0]))
@@ -988,8 +989,6 @@ void mptcp_event_pm_listener(const struct sock *ssk, enum mptcp_event_type event);bool mptcp_userspace_pm_active (const struct mptcp_sock *msk); -void __mptcp_fastopen_gen_msk_ackseq (struct mptcp_sock *msk,struct mptcp_subflow_context *subflow, -const struct mptcp_options_received *mp_opt);void mptcp_fastopen_subflow_synack_set_params (struct mptcp_subflow_context *subflow,struct request_sock *req);
net/mptcp/subflow.c +0 -3
@@ -778,9 +778,6 @@ void __mptcp_subflow_fully_established(struct mptcp_sock *msk,subflow_set_remote_key (msk, subflow, mp_opt); subflow->fully_established =1 ;WRITE_ONCE (msk->fully_established, true); - -if (subflow->is_mptfo) -__mptcp_fastopen_gen_msk_ackseq (msk, subflow, mp_opt); } static struct sock *subflow_syn_recv_sock(const struct sock *sk,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 mptcp: fix rx timestamp corruption on fastopen
From: Paolo Abeni <[email protected]>
[ Upstream commit 6254a16d6f0c672e3809ca5d7c9a28a55d71f764 ]
The skb cb offset containing the timestamp presence flag is cleared before loading such information. Cache such value before MPTCP CB initialization.
--- net/mptcp/fastopen.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mptcp/fastopen.c +3 -1
@@ -12,6 +12,7 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subfstruct sock *sk, *ssk;struct sk_buff *skb;struct tcp_sock *tp; +bool has_rxtstamp;/* on early fallback the subflow context is deleted by * subflow_syn_recv_sock()
@@ -39,12 +40,13 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subf*/ tp->copied_seq += skb->len; subflow->ssn_offset += skb->len; + has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp;/* Only the sequence delta is relevant */ MPTCP_SKB_CB (skb)->map_seq = -skb->len;MPTCP_SKB_CB (skb)->end_seq =0 ;MPTCP_SKB_CB (skb)->offset =0 ; -MPTCP_SKB_CB (skb)->has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp; +MPTCP_SKB_CB (skb)->has_rxtstamp = has_rxtstamp;MPTCP_SKB_CB (skb)->cant_coalesce =1 ;mptcp_data_lock (sk);
Signature · 1 line
2.53.0