[Intel-wired-lan] [PATCH bpf v2 7/9] idpf: use truesize as XDP RxQ info frag_size

Alexander Lobakin aleksander.lobakin at intel.com
Mon Feb 16 10:46:05 UTC 2026


From: Zaremba, Larysa <larysa.zaremba at intel.com>
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 <aleksandr.loktionov at intel.com>
> Signed-off-by: Larysa Zaremba <larysa.zaremba at intel.com>
> ---
>  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


More information about the Intel-wired-lan mailing list