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

Reply via email to