Re: [PATCH bpf v2 7/9] idpf: use truesize as XDP RxQ info frag_size
From: Alexander Lobakin
Date: Mon Feb 16 2026 - 05:52:04 EST
From: Alexander Lobakin <aleksander.lobakin@xxxxxxxxx>
Date: Mon, 16 Feb 2026 11:46:05 +0100
> From: Zaremba, Larysa <larysa.zaremba@xxxxxxxxx>
> 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@xxxxxxxxx>
>> Signed-off-by: Larysa Zaremba <larysa.zaremba@xxxxxxxxx>
>> ---
>> 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);
Better to do that in libeth_xdp rather than here?
>>
>> if (!idpf_xskfq_refill(bufq))
>> netdev_err(bufq->pool->netdev,
Thanks,
Olek