* [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup
@ 2026-08-20 9:05 Ratheesh Kannoth
2026-08-21 9:06 ` sashiko-bot
2026-08-21 10:54 ` Ratheesh Kannoth
0 siblings, 2 replies; 3+ messages in thread
From: Ratheesh Kannoth @ 2026-08-20 9:05 UTC (permalink / raw)
To: bpf, linux-kernel, netdev, pabeni, sumang
Cc: andrew+netdev, ast, daniel, davem, edumazet, hawk, john.fastabend,
kuba, sdf, sgoutham, Geetha sowjanya, Ratheesh Kannoth
From: Suman Ghosh <sumang@marvell.com>
af_xdp_zc_qidx tracks receive queues using AF_XDP zero-copy and is
allocated during PF/VF probe. Representors and other non-AF_XDP paths
leave the pointer NULL, but several call sites used test_bit() on it
unconditionally.
Switching to devlink eswitch mode creates representors and runs
otx2_init_hw_resources(), which reaches otx2_pool_aq_init() and oopses
when dereferencing the NULL bitmap. Add NULL checks before every
af_xdp_zc_qidx test_bit() use in the RSS, ethtool, XSK, and pool init
paths.
Fixes: efabce290151 ("octeontx2-pf: AF_XDP zero copy receive support")
Signed-off-by: Suman Ghosh <sumang@marvell.com>
Signed-off-by: Geetha sowjanya <gakula@marvell.com>
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 6 ++++--
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 3 ++-
drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c | 3 ++-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index 3d253132a17f..8a36ab8ab19e 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -333,7 +333,8 @@ int otx2_set_rss_table(struct otx2_nic *pfvf, int ctx_id, const u32 *ind_tbl)
/* Get memory to put this msg */
for (idx = 0; idx < rss->rss_size; idx++) {
/* Ignore the queue if AF_XDP zero copy is enabled */
- if (test_bit(ind_tbl[idx], pfvf->af_xdp_zc_qidx))
+ if (pfvf->af_xdp_zc_qidx &&
+ test_bit(ind_tbl[idx], pfvf->af_xdp_zc_qidx))
continue;
aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
@@ -1510,7 +1511,8 @@ int otx2_pool_aq_init(struct otx2_nic *pfvf, u16 pool_id,
if (type != AURA_NIX_RQ)
return 0;
- if (!test_bit(pool_id, pfvf->af_xdp_zc_qidx)) {
+ if (pfvf->af_xdp_zc_qidx &&
+ !test_bit(pool_id, pfvf->af_xdp_zc_qidx)) {
pp_params.order = get_order(buf_size);
pp_params.flags = PP_FLAG_DMA_MAP;
pp_params.pool_size = min(OTX2_PAGE_POOL_SZ, numptrs);
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index a0340f3422bf..9bee1b91eeaa 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -939,7 +939,8 @@ static int otx2_get_rxfh(struct net_device *dev,
for (idx = 0; idx < rss->rss_size; idx++) {
/* Ignore if the rx queue is AF_XDP zero copy enabled */
- if (test_bit(rss->ind_tbl[idx], pfvf->af_xdp_zc_qidx))
+ if (pfvf->af_xdp_zc_qidx &&
+ test_bit(rss->ind_tbl[idx], pfvf->af_xdp_zc_qidx))
continue;
indir[idx] = rss->ind_tbl[idx];
}
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
index 7d67b4cbaf71..0e8a6a6486c4 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
@@ -193,7 +193,8 @@ int otx2_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)
void otx2_attach_xsk_buff(struct otx2_nic *pfvf, struct otx2_snd_queue *sq, int qidx)
{
- if (test_bit(qidx, pfvf->af_xdp_zc_qidx))
+ if (pfvf->af_xdp_zc_qidx &&
+ test_bit(qidx, pfvf->af_xdp_zc_qidx))
sq->xsk_pool = xsk_get_pool_from_qid(pfvf->netdev, qidx);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup
2026-08-20 9:05 [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup Ratheesh Kannoth
@ 2026-08-21 9:06 ` sashiko-bot
2026-08-21 10:54 ` Ratheesh Kannoth
1 sibling, 0 replies; 3+ messages in thread
From: sashiko-bot @ 2026-08-21 9:06 UTC (permalink / raw)
To: Ratheesh Kannoth; +Cc: bpf
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
Pre-existing issues:
- [High] Concurrent NAPI execution during AF_XDP pool setup/disable causes data races and Use-After-Free.
- [High] Disabling AF_XDP zero-copy leaves the receive queue permanently disabled and lacking a page_pool.
- [High] The AF_XDP zero-copy RSS reconfiguration logic fails to remove the AF_XDP queue from hardware RSS and desyncs from ethtool.
- [High] Prematurely cancelling a work item before unregistering the network device allows it to be re-queued, leading to a Use-After-Free.
- [High] Incorrect index calculation for attaching the XSK buffer pool to XDP queues.
--
--- Patch [1]: [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup ---
commit c986623a4193b783891a92b6914ca95ab75cf969
Author: Suman Ghosh <sumang@marvell.com>
octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup
This commit adds NULL checks for af_xdp_zc_qidx before calling test_bit()
in several paths (RSS, ethtool, XSK, pool init) to prevent a NULL pointer
dereference during representor setup in devlink eswitch mode.
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> index 3d253132a17f0..8a36ab8ab19ed 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> @@ -333,7 +333,8 @@ int otx2_set_rss_table(struct otx2_nic *pfvf, int ctx_id, const u32 *ind_tbl)
> /* Get memory to put this msg */
> for (idx = 0; idx < rss->rss_size; idx++) {
> /* Ignore the queue if AF_XDP zero copy is enabled */
> - if (test_bit(ind_tbl[idx], pfvf->af_xdp_zc_qidx))
> + if (pfvf->af_xdp_zc_qidx &&
> + test_bit(ind_tbl[idx], pfvf->af_xdp_zc_qidx))
> continue;
[Severity: High]
This isn't a bug introduced by this patch, but does this continue statement
leave the NIX_AQ_CTYPE_RSS initialization message unsent for this index?
If the message is skipped, the hardware RSS table might still point to the
AF_XDP queue. This could cause normal RSS traffic to be incorrectly routed
to the AF_XDP queue.
[ ... ]
[Severity: High]
This is a pre-existing issue in otx2_common.c, but does otx2_sq_init() use
the correct variable for checking XDP queues?
The function currently checks:
if (qidx > pfvf->hw.xdp_queues)
otx2_attach_xsk_buff(pfvf, sq, (qidx - pfvf->hw.xdp_queues));
Since XDP queues start at the tx_queues offset, should this check instead
evaluate against pfvf->hw.tx_queues? If tx_queues differs from the number
of XDP (RX) queues, this logic might skip attaching the XSK buffer pool to
the correct XDP queues and instead attach it to normal TX queues.
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> index a0340f3422bf9..9bee1b91eeaa6 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
> @@ -939,7 +939,8 @@ static int otx2_get_rxfh(struct net_device *dev,
>
> for (idx = 0; idx < rss->rss_size; idx++) {
> /* Ignore if the rx queue is AF_XDP zero copy enabled */
> - if (test_bit(rss->ind_tbl[idx], pfvf->af_xdp_zc_qidx))
> + if (pfvf->af_xdp_zc_qidx &&
> + test_bit(rss->ind_tbl[idx], pfvf->af_xdp_zc_qidx))
> continue;
> indir[idx] = rss->ind_tbl[idx];
> }
[Severity: High]
This is a pre-existing issue, but does skipping this index leave it
unmodified (typically zero) in the ethtool output?
If the index is skipped rather than properly mapped, ethtool might falsely
report queue 0, causing a silent desynchronization with the actual hardware
state.
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
> index 7d67b4cbaf716..0e8a6a6486c4a 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c
> @@ -193,7 +193,8 @@ int otx2_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)
>
> void otx2_attach_xsk_buff(struct otx2_nic *pfvf, struct otx2_snd_queue *sq, int qidx)
> {
> - if (test_bit(qidx, pfvf->af_xdp_zc_qidx))
> + if (pfvf->af_xdp_zc_qidx &&
> + test_bit(qidx, pfvf->af_xdp_zc_qidx))
> sq->xsk_pool = xsk_get_pool_from_qid(pfvf->netdev, qidx);
> }
[Severity: High]
This is a pre-existing issue in otx2_xsk.c, but is it safe to call
otx2_clean_up_rq() in otx2_xsk_pool_enable() without first stopping the
receive queue or disabling NAPI?
If NAPI is not disabled (e.g., via napi_disable()), the NAPI softirq could
concurrently execute otx2_napi_handler(). This could lead to a
use-after-free as the xdp_rxq_info and hardware buffers are destroyed while
still in use, potentially corrupting the hardware completion queue ring.
[Severity: High]
This is another pre-existing issue in otx2_xsk.c, but does
otx2_xsk_pool_disable() leave the receive queue permanently disabled?
The function disables the hardware queue context via otx2_clean_up_rq() ->
otx2_xsk_ctx_disable(), but doesn't appear to re-enable it or recreate the
standard page_pool buffers for the queue. If otx2_set_rss_table() still
points normal RSS traffic to this queue, the packets could be permanently
dropped until the device is administratively brought down and up.
[Severity: High]
This is a pre-existing issue in otx2_pf.c, but can the reset_task be safely
cancelled while the device is still UP?
In otx2_remove(), cancel_work_sync(&pf->reset_task) is called before
unregister_netdev() shuts down the device. Since interrupts are still
active, could an incoming hardware error interrupt (otx2_q_intr_handler)
fire immediately after the cancellation and place the work item back on
the workqueue? Once the netdev is freed, the subsequently executed
reset_task would dereference freed memory.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260820090533.2681578-1-rkannoth@marvell.com?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup
2026-08-20 9:05 [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup Ratheesh Kannoth
2026-08-21 9:06 ` sashiko-bot
@ 2026-08-21 10:54 ` Ratheesh Kannoth
1 sibling, 0 replies; 3+ messages in thread
From: Ratheesh Kannoth @ 2026-08-21 10:54 UTC (permalink / raw)
To: bpf, linux-kernel, netdev, pabeni, sumang
Cc: andrew+netdev, ast, daniel, davem, edumazet, hawk, john.fastabend,
kuba, sdf, sgoutham, Geetha sowjanya
On 2026-08-20 at 14:35:33, Ratheesh Kannoth (rkannoth@marvell.com) wrote:
> From: Suman Ghosh <sumang@marvell.com>
>
> af_xdp_zc_qidx tracks receive queues using AF_XDP zero-copy and is
> allocated during PF/VF probe. Representors and other non-AF_XDP paths
> leave the pointer NULL, but several call sites used test_bit() on it
> unconditionally.
>
> Switching to devlink eswitch mode creates representors and runs
> otx2_init_hw_resources(), which reaches otx2_pool_aq_init() and oopses
> when dereferencing the NULL bitmap. Add NULL checks before every
> af_xdp_zc_qidx test_bit() use in the RSS, ethtool, XSK, and pool init
> paths.
>
> Fixes: efabce290151 ("octeontx2-pf: AF_XDP zero copy receive support")
> Signed-off-by: Suman Ghosh <sumang@marvell.com>
> Signed-off-by: Geetha sowjanya <gakula@marvell.com>
> Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
Will address sashiko comments in v2
pw-bot: changes-requested
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-21 10:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-20 9:05 [PATCH net] octeontx2-pf: fix NULL deref of af_xdp_zc_qidx on rep setup Ratheesh Kannoth
2026-08-21 9:06 ` sashiko-bot
2026-08-21 10:54 ` Ratheesh Kannoth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox