* [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
@ 2026-03-24 21:14 David Carlier
2026-03-25 9:14 ` Meghana Malladi
2026-03-25 9:28 ` David Carlier
0 siblings, 2 replies; 6+ messages in thread
From: David Carlier @ 2026-03-24 21:14 UTC (permalink / raw)
To: danishanwar, rogerq, andrew+netdev, davem, edumazet, kuba, pabeni
Cc: m-malladi, netdev, David Carlier
emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
never copies the packet data from the XDP buffer into it. The skb is
passed up the stack containing uninitialized heap memory instead of
the actual received packet, leaking kernel heap contents to userspace.
Add the missing memcpy from xdp->data into the skb data area.
Additionally, remove the skb_mark_for_recycle() call since the skb is
backed by the NAPI page frag allocator, not page_pool. Marking a
non-page_pool skb for recycle causes the free path to return pages to
a page_pool that does not own them, corrupting page_pool state.
The non-ZC path (emac_rx_packet) does not have these issues because it
uses napi_build_skb() to wrap the existing page_pool page directly,
requiring no copy, and correctly marks for recycle since the page comes
from page_pool_dev_alloc_pages().
Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
Signed-off-by: David Carlier <devnexen@gmail.com>
---
drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
index fd4e7622f123..9638a03bebb4 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_common.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
@@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb_reserve(skb, headroom);
skb_put(skb, pkt_len);
+ memcpy(skb->data, xdp->data, pkt_len);
skb->dev = ndev;
/* RX HW timestamp */
@@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb->offload_fwd_mark = emac->offload_fwd_mark;
skb->protocol = eth_type_trans(skb, ndev);
- skb_mark_for_recycle(skb);
napi_gro_receive(&emac->napi_rx, skb);
ndev->stats.rx_bytes += pkt_len;
ndev->stats.rx_packets++;
--
2.53.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
2026-03-24 21:14 [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch David Carlier
@ 2026-03-25 9:14 ` Meghana Malladi
2026-03-25 9:23 ` David CARLIER
2026-03-25 9:28 ` David Carlier
1 sibling, 1 reply; 6+ messages in thread
From: Meghana Malladi @ 2026-03-25 9:14 UTC (permalink / raw)
To: David Carlier, danishanwar, rogerq, andrew+netdev, davem,
edumazet, kuba, pabeni
Cc: netdev
Hi David,
On 3/25/26 02:44, David Carlier wrote:
> emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
> never copies the packet data from the XDP buffer into it. The skb is
> passed up the stack containing uninitialized heap memory instead of
> the actual received packet, leaking kernel heap contents to userspace.
>
> Add the missing memcpy from xdp->data into the skb data area.
>
> Additionally, remove the skb_mark_for_recycle() call since the skb is
> backed by the NAPI page frag allocator, not page_pool. Marking a
> non-page_pool skb for recycle causes the free path to return pages to
> a page_pool that does not own them, corrupting page_pool state.
>
> The non-ZC path (emac_rx_packet) does not have these issues because it
> uses napi_build_skb() to wrap the existing page_pool page directly,
> requiring no copy, and correctly marks for recycle since the page comes
> from page_pool_dev_alloc_pages().
>
Thanks for the patch. I wonder how were you able to catch this bug?
> Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
> Signed-off-by: David Carlier <devnexen@gmail.com>
> ---
> drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
> index fd4e7622f123..9638a03bebb4 100644
> --- a/drivers/net/ethernet/ti/icssg/icssg_common.c
> +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
> @@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
>
> skb_reserve(skb, headroom);
> skb_put(skb, pkt_len);
> + memcpy(skb->data, xdp->data, pkt_len);
Why not use skb_copy_to_linear_data() ?
> skb->dev = ndev;
>
> /* RX HW timestamp */
> @@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
> skb->offload_fwd_mark = emac->offload_fwd_mark;
> skb->protocol = eth_type_trans(skb, ndev);
>
> - skb_mark_for_recycle(skb);
> napi_gro_receive(&emac->napi_rx, skb);
> ndev->stats.rx_bytes += pkt_len;
> ndev->stats.rx_packets++;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
2026-03-25 9:14 ` Meghana Malladi
@ 2026-03-25 9:23 ` David CARLIER
0 siblings, 0 replies; 6+ messages in thread
From: David CARLIER @ 2026-03-25 9:23 UTC (permalink / raw)
To: Meghana Malladi
Cc: danishanwar, rogerq, andrew+netdev, davem, edumazet, kuba, pabeni,
netdev
Hi,
On Wed, 25 Mar 2026 at 09:14, Meghana Malladi <m-malladi@ti.com> wrote:
>
> Hi David,
>
> On 3/25/26 02:44, David Carlier wrote:
> > emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
> > never copies the packet data from the XDP buffer into it. The skb is
> > passed up the stack containing uninitialized heap memory instead of
> > the actual received packet, leaking kernel heap contents to userspace.
> >
> > Add the missing memcpy from xdp->data into the skb data area.
> >
> > Additionally, remove the skb_mark_for_recycle() call since the skb is
> > backed by the NAPI page frag allocator, not page_pool. Marking a
> > non-page_pool skb for recycle causes the free path to return pages to
> > a page_pool that does not own them, corrupting page_pool state.
> >
> > The non-ZC path (emac_rx_packet) does not have these issues because it
> > uses napi_build_skb() to wrap the existing page_pool page directly,
> > requiring no copy, and correctly marks for recycle since the page comes
> > from page_pool_dev_alloc_pages().
> >
>
> Thanks for the patch. I wonder how were you able to catch this bug?
By code review, comparing emac_dispatch_skb_zc() with the non-ZC path
emac_rx_packet() and noticing the ZC path allocates a separate skb but
never copies data into it.
>
> > Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
> > Signed-off-by: David Carlier <devnexen@gmail.com>
> > ---
> > drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
> > index fd4e7622f123..9638a03bebb4 100644
> > --- a/drivers/net/ethernet/ti/icssg/icssg_common.c
> > +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
> > @@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
> >
> > skb_reserve(skb, headroom);
> > skb_put(skb, pkt_len);
> > + memcpy(skb->data, xdp->data, pkt_len);
>
> Why not use skb_copy_to_linear_data() ?
Ah, that is a good suggestion, did not know it.
>
> > skb->dev = ndev;
> >
> > /* RX HW timestamp */
> > @@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
> > skb->offload_fwd_mark = emac->offload_fwd_mark;
> > skb->protocol = eth_type_trans(skb, ndev);
> >
> > - skb_mark_for_recycle(skb);
> > napi_gro_receive(&emac->napi_rx, skb);
> > ndev->stats.rx_bytes += pkt_len;
> > ndev->stats.rx_packets++;
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
2026-03-24 21:14 [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch David Carlier
2026-03-25 9:14 ` Meghana Malladi
@ 2026-03-25 9:28 ` David Carlier
2026-03-25 11:44 ` Meghana Malladi
1 sibling, 1 reply; 6+ messages in thread
From: David Carlier @ 2026-03-25 9:28 UTC (permalink / raw)
To: danishanwar, rogerq, andrew+netdev, davem, edumazet, kuba, pabeni
Cc: m-malladi, netdev, David Carlier
emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
never copies the packet data from the XDP buffer into it. The skb is
passed up the stack containing uninitialized heap memory instead of
the actual received packet, leaking kernel heap contents to userspace.
Add the missing memcpy from xdp->data into the skb data area.
Additionally, remove the skb_mark_for_recycle() call since the skb is
backed by the NAPI page frag allocator, not page_pool. Marking a
non-page_pool skb for recycle causes the free path to return pages to
a page_pool that does not own them, corrupting page_pool state.
The non-ZC path (emac_rx_packet) does not have these issues because it
uses napi_build_skb() to wrap the existing page_pool page directly,
requiring no copy, and correctly marks for recycle since the page comes
from page_pool_dev_alloc_pages().
Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
Signed-off-by: David Carlier <devnexen@gmail.com>
---
drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
index fd4e7622f123..a28a608f9bf4 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_common.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
@@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb_reserve(skb, headroom);
skb_put(skb, pkt_len);
+ skb_copy_to_linear_data(skb, xdp->data, pkt_len);
skb->dev = ndev;
/* RX HW timestamp */
@@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb->offload_fwd_mark = emac->offload_fwd_mark;
skb->protocol = eth_type_trans(skb, ndev);
- skb_mark_for_recycle(skb);
napi_gro_receive(&emac->napi_rx, skb);
ndev->stats.rx_bytes += pkt_len;
ndev->stats.rx_packets++;
--
2.53.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
2026-03-25 9:28 ` David Carlier
@ 2026-03-25 11:44 ` Meghana Malladi
0 siblings, 0 replies; 6+ messages in thread
From: Meghana Malladi @ 2026-03-25 11:44 UTC (permalink / raw)
To: David Carlier, danishanwar, rogerq, andrew+netdev, davem,
edumazet, kuba, pabeni
Cc: netdev
Hi David,
I think you might be missing to put some maintainers in cc. Can you
please check:
https://patchwork.kernel.org/project/netdevbpf/patch/20260325092857.47962-1-devnexen@gmail.com/
Also check "resending after review" section here:
https://docs.kernel.org/process/maintainer-netdev.html
Grace period of min 24 hours is needed for re-posting and "The new
version of patches should be posted as a separate thread, not as a reply
to the previous posting."
On 3/25/26 14:58, David Carlier wrote:
> emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
> never copies the packet data from the XDP buffer into it. The skb is
> passed up the stack containing uninitialized heap memory instead of
> the actual received packet, leaking kernel heap contents to userspace.
>
> Add the missing memcpy from xdp->data into the skb data area.
>
You did make changes in the code as requested but the commit message is
stale. Can you post a v2 with updated patch and commit message.
> Additionally, remove the skb_mark_for_recycle() call since the skb is
> backed by the NAPI page frag allocator, not page_pool. Marking a
> non-page_pool skb for recycle causes the free path to return pages to
> a page_pool that does not own them, corrupting page_pool state.
>
> The non-ZC path (emac_rx_packet) does not have these issues because it
> uses napi_build_skb() to wrap the existing page_pool page directly,
> requiring no copy, and correctly marks for recycle since the page comes
> from page_pool_dev_alloc_pages().
>
> Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
> Signed-off-by: David Carlier <devnexen@gmail.com>
> ---
> drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
> index fd4e7622f123..a28a608f9bf4 100644
> --- a/drivers/net/ethernet/ti/icssg/icssg_common.c
> +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
> @@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
>
> skb_reserve(skb, headroom);
> skb_put(skb, pkt_len);
> + skb_copy_to_linear_data(skb, xdp->data, pkt_len);
> skb->dev = ndev;
>
> /* RX HW timestamp */
> @@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
> skb->offload_fwd_mark = emac->offload_fwd_mark;
> skb->protocol = eth_type_trans(skb, ndev);
>
> - skb_mark_for_recycle(skb);
> napi_gro_receive(&emac->napi_rx, skb);
> ndev->stats.rx_bytes += pkt_len;
> ndev->stats.rx_packets++;
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch
@ 2026-03-25 12:51 David Carlier
0 siblings, 0 replies; 6+ messages in thread
From: David Carlier @ 2026-03-25 12:51 UTC (permalink / raw)
To: danishanwar, rogerq, andrew+netdev, davem, edumazet, kuba, pabeni
Cc: m-malladi, jacob.e.keller, horms, linux-arm-kernel, netdev,
linux-kernel, David Carlier
emac_dispatch_skb_zc() allocates a new skb via napi_alloc_skb() but
never copies the packet data from the XDP buffer into it. The skb is
passed up the stack containing uninitialized heap memory instead of
the actual received packet, leaking kernel heap contents to userspace.
Copy the received packet data from the XDP buffer into the skb using
skb_copy_to_linear_data().
Additionally, remove the skb_mark_for_recycle() call since the skb is
backed by the NAPI page frag allocator, not page_pool. Marking a
non-page_pool skb for recycle causes the free path to return pages to
a page_pool that does not own them, corrupting page_pool state.
The non-ZC path (emac_rx_packet) does not have these issues because it
uses napi_build_skb() to wrap the existing page_pool page directly,
requiring no copy, and correctly marks for recycle since the page comes
from page_pool_dev_alloc_pages().
Fixes: 7a64bb388df3 ("net: ti: icssg-prueth: Add AF_XDP zero copy for RX")
Signed-off-by: David Carlier <devnexen@gmail.com>
---
drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
index fd4e7622f123..a28a608f9bf4 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_common.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
@@ -902,6 +902,7 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb_reserve(skb, headroom);
skb_put(skb, pkt_len);
+ skb_copy_to_linear_data(skb, xdp->data, pkt_len);
skb->dev = ndev;
/* RX HW timestamp */
@@ -912,7 +913,6 @@ static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff *xdp,
skb->offload_fwd_mark = emac->offload_fwd_mark;
skb->protocol = eth_type_trans(skb, ndev);
- skb_mark_for_recycle(skb);
napi_gro_receive(&emac->napi_rx, skb);
ndev->stats.rx_bytes += pkt_len;
ndev->stats.rx_packets++;
--
2.53.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-03-25 12:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-24 21:14 [PATCH] net: ti: icssg-prueth: fix missing data copy and wrong recycle in ZC RX dispatch David Carlier
2026-03-25 9:14 ` Meghana Malladi
2026-03-25 9:23 ` David CARLIER
2026-03-25 9:28 ` David Carlier
2026-03-25 11:44 ` Meghana Malladi
-- strict thread matches above, loose matches on Subject: below --
2026-03-25 12:51 David Carlier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox