Skip to contentSkip to conversation

FAILED: patch "[PATCH] net: skbuff: preserve shared-frag marker during coalescing" failed to apply to 5.10-stable tree

PATCH In review [email protected] 3 participants 3 messages May 22 – May 23

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 5.10-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-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x f84eca5817390257cef78013d0112481c503b4a3
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026052258-glamorous-basically-d5e2@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..

Possible dependencies:

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From f84eca5817390257cef78013d0112481c503b4a3 Mon Sep 17 00:00:00 2001
From: William Bowling <[email protected]>
Date: Wed, 13 May 2026 04:16:35 +0000
Subject: [PATCH] net: skbuff: preserve shared-frag marker during coalescing

skb_try_coalesce() can attach paged frags from @from to @to. If @from has SKBFL_SHARED_FRAG set, the resulting @to skb can contain the same externally-owned or page-cache-backed frags, but the shared-frag marker is currently lost.

That breaks the invariant relied on by later in-place writers. In particular, ESP input checks skb_has_shared_frag() before deciding whether an uncloned nonlinear skb can skip skb_cow_data(). If TCP receive coalescing has moved shared frags into an unmarked skb, ESP can see skb_has_shared_frag() as false and decrypt in place over page-cache backed frags.

Propagate SKBFL_SHARED_FRAG when skb_try_coalesce() transfers paged frags. The tailroom copy path does not need the marker because it copies bytes into @to's linear data rather than transferring frag descriptors.

Fixes cef401de7be8 ("net: fix possible wrong checksum generation")
Fixes f4c50a4034e6 ("xfrm: esp: avoid in-place decrypt on shared skb frags")
net/core/skbuff.c +2 -0
index 7dad68e3b518..9c4e8d331d6d 100644
@@ -6200,6 +6200,8 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
 	       from_shinfo->frags,
 	       from_shinfo->nr_frags * sizeof(skb_frag_t));
 	to_shinfo->nr_frags += from_shinfo->nr_frags;
+	if (from_shinfo->nr_frags)
+		to_shinfo->flags |= from_shinfo->flags & SKBFL_SHARED_FRAG;
 
 	if (!skb_cloned(from))
 		from_shinfo->nr_frags = 0;
#1 lore raw

PATCH 1/1 net: skbuff: preserve shared-frag marker during coalescing

From: William Bowling <[email protected]>

commit f84eca5817390257cef78013d0112481c503b4a3 upstream.

skb_try_coalesce() can attach paged frags from @from to @to. If @from has SKBFL_SHARED_FRAG set, the resulting @to skb can contain the same externally-owned or page-cache-backed frags, but the shared-frag marker is currently lost.

That breaks the invariant relied on by later in-place writers. In particular, ESP input checks skb_has_shared_frag() before deciding whether an uncloned nonlinear skb can skip skb_cow_data(). If TCP receive coalescing has moved shared frags into an unmarked skb, ESP can see skb_has_shared_frag() as false and decrypt in place over page-cache backed frags.

Propagate SKBFL_SHARED_FRAG when skb_try_coalesce() transfers paged frags. The tailroom copy path does not need the marker because it copies bytes into @to's linear data rather than transferring frag descriptors.

Fixes cef401de7be8 ("net: fix possible wrong checksum generation")
Fixes f4c50a4034e6 ("xfrm: esp: avoid in-place decrypt on shared skb frags")

[bwh: Backported to 5.10: Set the SKBTX_SHARED_FRAG flag in
sk_buff::tx_flags, instead of SKBFL_SHARED_FRAG in sk_buff::flags]

---
 net/core/skbuff.c | 2 ++
 1 file changed, 2 insertions(+)
net/core/skbuff.c +2 -0
index 297a2efd6322..c195107434b8 100644
@@ -5315,6 +5315,8 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
 	       from_shinfo->frags,
 	       from_shinfo->nr_frags * sizeof(skb_frag_t));
 	to_shinfo->nr_frags += from_shinfo->nr_frags;
+	if (from_shinfo->nr_frags)
+		to_shinfo->tx_flags |= from_shinfo->tx_flags & SKBTX_SHARED_FRAG;
 
 	if (!skb_cloned(from))
 		from_shinfo->nr_frags = 0;
Reviewed-by on v1 1/1
#2 lore raw

Re: [PATCH 5.10] net: skbuff: preserve shared-frag marker during coalescing

Quoted 27 lines · Ben Hutchings

From: William Bowling <[email protected]>

commit f84eca5817390257cef78013d0112481c503b4a3 upstream.

skb_try_coalesce() can attach paged frags from @from to @to. If @from has SKBFL_SHARED_FRAG set, the resulting @to skb can contain the same externally-owned or page-cache-backed frags, but the shared-frag marker is currently lost.

That breaks the invariant relied on by later in-place writers. In particular, ESP input checks skb_has_shared_frag() before deciding whether an uncloned nonlinear skb can skip skb_cow_data(). If TCP receive coalescing has moved shared frags into an unmarked skb, ESP can see skb_has_shared_frag() as false and decrypt in place over page-cache backed frags.

Propagate SKBFL_SHARED_FRAG when skb_try_coalesce() transfers paged frags. The tailroom copy path does not need the marker because it copies bytes into @to's linear data rather than transferring frag descriptors.

Fixes cef401de7be8 ("net: fix possible wrong checksum generation")
Fixes f4c50a4034e6 ("xfrm: esp: avoid in-place decrypt on shared skb frags")
Quoted 2 lines

[bwh: Backported to 5.10: Set the SKBTX_SHARED_FRAG flag in
sk_buff::tx_flags, instead of SKBFL_SHARED_FRAG in sk_buff::flags]

right! due to missing commit: 06b4feb37e64 ("net: group skb_shinfo zerocopy related bits together.") in 5.10.y it is only in 5.12+

Note: I did the same for downstream UEK(OL) trees and was planning to submit them here. Given that you posted them before I did, sending my acknowledgements.

LGTM from a backport point of view.

thanks,
Harshit

Quoted 18 lines
---
  net/core/skbuff.c | 2 ++
  1 file changed, 2 insertions(+)
net/core/skbuff.c +2 -0
index 297a2efd6322..c195107434b8 100644
@@ -5315,6 +5315,8 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
  	       from_shinfo->frags,
  	       from_shinfo->nr_frags * sizeof(skb_frag_t));
  	to_shinfo->nr_frags += from_shinfo->nr_frags;
+	if (from_shinfo->nr_frags)
+		to_shinfo->tx_flags |= from_shinfo->tx_flags & SKBTX_SHARED_FRAG;
 
  	if (!skb_cloned(from))
  		from_shinfo->nr_frags = 0;