On Tue, Mar 3, 2026 at 7:34 AM Alexander Lobakin
<[email protected]> wrote:
>
> From: Steve Rutherford <[email protected]>
> Date: Fri, 27 Feb 2026 20:34:57 +0000
>
> > When SWIOTLB and header split are enabled, IDPF sees empty packets in the
> > rx queue.
> >
> > This is caused by libeth_rx_sync_for_cpu clobbering the synthesized header
> > in the workaround (i.e. overflow) path. After the header is synthesized by
> > idpf_rx_hsplit_wa, the sync call pulls from the empty SWIOTLB buffer,
> > effectively zeroing out the buffer.
> >
> > This skips the extra sync in the workaround path in most cases. The one
> > exception is that it calls sync to trigger a recycle the header buffer when
> > it fails to find a header in the payload.
> >
> > Fixes: 90912f9f4f2d1 ("idpf: convert header split mode to libeth + 
> > napi_build_skb()")
> > Signed-off-by: Steve Rutherford <[email protected]>
> > ---
> >  drivers/net/ethernet/intel/idpf/idpf_txrx.c | 9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c 
> > b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> > index 3ddf7b1e85ef..946203a6bd86 100644
> > --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> > +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> > @@ -3007,9 +3007,14 @@ static int idpf_rx_splitq_clean(struct idpf_rx_queue 
> > *rxq, int budget)
> >                       u64_stats_update_begin(&rxq->stats_sync);
> >                       u64_stats_inc(&rxq->q_stats.hsplit_buf_ovf);
> >                       u64_stats_update_end(&rxq->stats_sync);
> > -             }
> >
> > -             if (libeth_rx_sync_for_cpu(hdr, hdr_len)) {
> > +                     /* Recycle the hdr buffer if unused.*/
> > +                     if (!hdr_len)
> > +                             libeth_rx_sync_for_cpu(hdr, 0);
> > +             } else if (!libeth_rx_sync_for_cpu(hdr, hdr_len))
> > +                     hdr_len = 0;
> > +
> > +             if (hdr_len) {
>
> This is for a very old tree I believe? We now have
> libeth_xdp_process_buff() there for quite some time already.

It is, yeah. I thought I posted a cover letter with more of a description, but,
frankly, I may have messed up the process of posting.

>From the cover letter -
Found an issue with the IDPF driver when SWIOTLB is enabled. The issue
results in empty headers for packets that hit the split queue workaround
path. It's caused by a spurious sync in that path. The header is synced
from the SWIOTLB even when the header was shoved into the payload.

I cooked up a sample patch, but I'm not an expert in this driver, so I have
no idea if it's the right solution. It did allow my QEMU VM to boot with a
superficially functional passed-through IDPF NIC and SWIOTLB=force.

The patch was written against COS's 6.12, so I assume that it will not
apply cleanly elsewhere, but I figured a wrong sample patch was better than
a long paragraph describing the same thing. My read of more recent kernels
is that this problem is still present, but could be mistaken.

Thanks,
Steve

Reply via email to