* [PATCH net] octeontx2-pf: fix XDP frames freed as skbs on interface down
@ 2026-10-30 20:12 Nicolai Buchwitz
2026-10-31 20:12 ` sashiko-bot
0 siblings, 1 reply; 2+ messages in thread
From: Nicolai Buchwitz @ 2026-10-30 20:12 UTC (permalink / raw)
To: Sunil Goutham, Geetha sowjanya, Ratheesh Kannoth,
Subbaraya Sundeep, Bharat Bhushan, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Alexei Starovoitov,
Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Suman Ghosh
Cc: netdev, linux-kernel, bpf, Nicolai Buchwitz
On interface down, the TX completion cleanup also runs on the XDP
queues, but treats the pending xdp_frames as skbs. Freeing them with
dev_kfree_skb_any() corrupts page pool memory.
This happens when XDP_TX or redirected packets are still in flight on
ifdown, or when the XDP program is replaced.
Fixes: 94c80f748873 ("octeontx2-pf: use xdp_return_frame() to free xdp buffers")
Signed-off-by: Nicolai Buchwitz <nb@tipi-net.de>
---
Pre-existing bug, flagged by the clashiko review of my ipsec transmit
fixes for this driver [1], which seems reasonable (and fixable) to me.
The other pre-existing findings there (e.g. the SA lifetime in
cn10k_ipsec_del_state()) may be worth fixing too, but I'll leave those
to the maintainers.
Compile-tested only, I have no octeontx2 hardware.
[1] https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261027-nb-otx2-ipsec-tx-fixes-net-v1-0-2114c4f10c36%40tipi-net.de
---
drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
index 90af9b9044aa0..e3b07e5335fb8 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
@@ -1332,6 +1332,7 @@ void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
struct nix_cqe_tx_s *cqe;
struct netdev_queue *txq;
int processed_cqe = 0;
+ int xsk_frames = 0;
struct sg_list *sg;
int qidx;
@@ -1348,6 +1349,10 @@ void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
if (!cqe)
continue;
+ if (cq->cq_type == CQ_XDP) {
+ otx2_xdp_snd_pkt_handler(pfvf, sq, cqe, &xsk_frames);
+ continue;
+ }
sg = &sq->sg[cqe->comp.sqe_id];
skb = (struct sk_buff *)sg->skb;
if (skb) {
---
base-commit: d8a4f4c59da52b7c31ae337243b8473a19a3f819
change-id: 20261028-nb-otx2-xdp-cqe-cleanup-net-5810d40e1d30
Best regards,
--
Nicolai Buchwitz <nb@tipi-net.de>
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH net] octeontx2-pf: fix XDP frames freed as skbs on interface down
2026-10-30 20:12 [PATCH net] octeontx2-pf: fix XDP frames freed as skbs on interface down Nicolai Buchwitz
@ 2026-10-31 20:12 ` sashiko-bot
0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-10-31 20:12 UTC (permalink / raw)
To: Nicolai Buchwitz; +Cc: bpf
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] octeontx2-pf: missing xsk_tx_completed() call in otx2_cleanup_tx_cqes()
--
commit 40946781f760bef2ef894a136c752dbc204d2650
Author: Nicolai Buchwitz <nb@tipi-net.de>
octeontx2-pf: fix XDP frames freed as skbs on interface down
This commit updates otx2_cleanup_tx_cqes() to handle CQ_XDP completions via
otx2_xdp_snd_pkt_handler() instead of freeing pending xdp_frame pointers with
dev_kfree_skb_any() during interface teardown or XDP program replacement.
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
> index 90af9b9044aa0..e3b07e5335fb8 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c
> @@ -1332,6 +1332,7 @@ void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
> struct nix_cqe_tx_s *cqe;
> struct netdev_queue *txq;
> int processed_cqe = 0;
> + int xsk_frames = 0;
> struct sg_list *sg;
> int qidx;
>
> @@ -1348,6 +1349,10 @@ void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
>
> if (!cqe)
> continue;
> + if (cq->cq_type == CQ_XDP) {
> + otx2_xdp_snd_pkt_handler(pfvf, sq, cqe, &xsk_frames);
> + continue;
> + }
[Severity: Medium]
Does otx2_cleanup_tx_cqes() also need to pass xsk_frames to
xsk_tx_completed() after draining the loop?
When AF_XDP zero-copy TX descriptors are reaped in
drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c:
otx2_xdp_snd_pkt_handler() {
...
sg = &sq->sg[snd_comp->sqe_id];
if (sg->flags & OTX2_AF_XDP_FRAME) {
(*xsk_frames)++;
return;
}
...
}
the handler only increments xsk_frames and relies on the caller to publish
the completions to sq->xsk_pool, as done in the normal NAPI completion path via
otx2_tx_napi_handler() -> otx2_zc_submit_pkts():
if (*xsk_frames)
xsk_tx_completed(xsk_pool, *xsk_frames);
In otx2_cleanup_tx_cqes(), xsk_frames is accumulated across the while
(cq->pend_cqe) loop, but it is never read afterwards. If an interface with an
active AF_XDP zero-copy TX socket is brought down or has its XDP program
replaced while AF_XDP TX completions are pending in a CQ_XDP queue, wouldn't
those completion ring entries be leaked without calling
xsk_tx_completed(sq->xsk_pool, xsk_frames)?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261030-nb-otx2-xdp-cqe-cleanup-net-v1-1-710635c0f504@tipi-net.de?part=1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-10-31 20:12 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-30 20:12 [PATCH net] octeontx2-pf: fix XDP frames freed as skbs on interface down Nicolai Buchwitz
2026-10-31 20:12 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox