From: Alexander Lobakin <[email protected]>
Date: Mon, 16 Feb 2026 11:46:05 +0100

> 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);

Better to do that in libeth_xdp rather than here?

>>  
>>      if (!idpf_xskfq_refill(bufq))
>>              netdev_err(bufq->pool->netdev,

Thanks,
Olek

Reply via email to