From: Zaremba, Larysa <[email protected]>
Date: Thu, 12 Feb 2026 19:33:22 +0100
> The only user of frag_size field in XDP RxQ info is
> bpf_xdp_frags_increase_tail(). It clearly expects whole buffer size instead
> of DMA write size. Different assumptions in idpf driver configuration lead
> to negative tailroom.
>
> To make it worse, buffer sizes are not actually uniform in idpf when
> splitq is enabled, as there are several buffer queues, so rxq->rx_buf_size
> is meaningless in this case.
>
> Use rxq->truesize as a frag_size for singleq and truesize of the first bufq
> in AF_XDP ZC, as there is only one. Disable growinf tail for regular
> splitq.
>
> Fixes: ac8a861f632e ("idpf: prepare structures to support XDP")
> Reviewed-by: Aleksandr Loktionov <[email protected]>
> Signed-off-by: Larysa Zaremba <[email protected]>
> ---
> drivers/net/ethernet/intel/idpf/xdp.c | 8 +++++++-
> drivers/net/ethernet/intel/idpf/xsk.c | 1 +
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/intel/idpf/xdp.c
> b/drivers/net/ethernet/intel/idpf/xdp.c
> index 958d16f87424..a152c9a26976 100644
> --- a/drivers/net/ethernet/intel/idpf/xdp.c
> +++ b/drivers/net/ethernet/intel/idpf/xdp.c
> @@ -46,11 +46,17 @@ static int __idpf_xdp_rxq_info_init(struct idpf_rx_queue
> *rxq, void *arg)
> {
> const struct idpf_vport *vport = rxq->q_vector->vport;
> bool split = idpf_is_queue_model_split(vport->rxq_model);
> + u32 frag_size = 0;
> int err;
>
> + if (idpf_queue_has(XSK, rxq) && split)
> + frag_size = rxq->bufq_sets[0].bufq.truesize;
> + else if (!split)
> + frag_size = rxq->truesize;
XDP and XSk are supported only in mode splitq mode, so you can remove
the second condition and change the first one to just `has(XSK)`.
> +
> err = __xdp_rxq_info_reg(&rxq->xdp_rxq, vport->netdev, rxq->idx,
> rxq->q_vector->napi.napi_id,
> - rxq->rx_buf_size);
> + frag_size);
> if (err)
> return err;
>
> diff --git a/drivers/net/ethernet/intel/idpf/xsk.c
> b/drivers/net/ethernet/intel/idpf/xsk.c
> index fd2cc43ab43c..febe1073b9b4 100644
> --- a/drivers/net/ethernet/intel/idpf/xsk.c
> +++ b/drivers/net/ethernet/intel/idpf/xsk.c
> @@ -401,6 +401,7 @@ int idpf_xskfq_init(struct idpf_buf_queue *bufq)
> bufq->pending = fq.pending;
> bufq->thresh = fq.thresh;
> bufq->rx_buf_size = fq.buf_len;
> + bufq->truesize = xsk_pool_get_rx_frag_step(fq.pool);
>
> if (!idpf_xskfq_refill(bufq))
> netdev_err(bufq->pool->netdev,
Thanks,
Olek