FAILED: patch "[PATCH] net: skbuff: preserve shared-frag marker during coalescing" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe 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.
net/core/skbuff.c +2 -0
@@ -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 ;
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.
[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
@@ -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 ;
Re: [PATCH 5.10] net: skbuff: preserve shared-frag marker during coalescing
Quoted 27 lines · Ben Hutchings
From: William Bowling <[email protected]>
commit
f84eca5817390257cef78013d0112481c503b4a3upstream.
skb_try_coalesce()can attach paged frags from @from to @to. If @from hasSKBFL_SHARED_FRAGset, 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 skipskb_cow_data(). If TCP receive coalescing has moved shared frags into an unmarked skb, ESP can seeskb_has_shared_frag()as false and decrypt in place over page-cache backed frags.Propagate
SKBFL_SHARED_FRAGwhenskb_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")Signed-off-by William Bowling <[email protected]>Reviewed-by Eric Dumazet <[email protected]>Tested-by Jiayuan Chen <[email protected]>Signed-off-by Jakub Kicinski <[email protected]>
Quoted 2 lines
[bwh: Backported to 5.10: Set the
SKBTX_SHARED_FRAGflag in
sk_buff::tx_flags, instead ofSKBFL_SHARED_FRAGinsk_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
Signed-off-by Ben Hutchings <[email protected]>--- net/core/skbuff.c | 2 ++ 1 file changed, 2 insertions(+)net/core/skbuff.c +2
-0@@ -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 ;