[PATCH v4 5/9] vfio: selftests: igb: Extend memcpy completion timeout for line-rate hardware

From: Josh Hilke

Date: Fri Jul 10 2026 - 18:07:47 EST


From: Alex Williamson <alex.williamson@xxxxxxxxxx>

The submitted driver waits at most 1 ms (100 * 10 us) for the last RX
descriptor to be written back. QEMU's emulated loopback is synchronous:
by the time igb_memcpy_wait() runs, the receive descriptors are already
written back. Real 82576 hardware processes the descriptor ring at
line rate.

max_memcpy_size is (RING_SIZE - 1) * IGB_MAX_CHUNK_SIZE, approximately
4 MB, split into 4095 1 KB frames. At 1 Gb/s line rate (~125 MB/s),
4 MB takes ~32 ms on the wire, plus per-frame preamble, SFD,
inter-frame gap and FCS overhead (~3%) and descriptor fetch/writeback
latency. The 1 ms cap times out long before any valid transfer can
complete.

Wait up to ~200 ms (200 iterations * 1 ms) for descriptor writeback
before returning -ETIMEDOUT. ~6x the line-rate floor leaves comfortable
headroom for host scheduling jitter while keeping the intentional
invalid-DMA tests (mix_and_match) so they recover quickly on real faults.

Assisted-by: Claude:claude-opus-4-7
Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx>
---
tools/testing/selftests/vfio/lib/drivers/igb/igb.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/vfio/lib/drivers/igb/igb.c b/tools/testing/selftests/vfio/lib/drivers/igb/igb.c
index cd51a72b0e7f..172c95cea3c8 100644
--- a/tools/testing/selftests/vfio/lib/drivers/igb/igb.c
+++ b/tools/testing/selftests/vfio/lib/drivers/igb/igb.c
@@ -428,12 +428,23 @@ static int igb_memcpy_wait(struct vfio_pci_device *device)
prev_tail = (igb->rx_tail + RING_SIZE - 1) % RING_SIZE;
rx = &igb->rx_ring[prev_tail];

- retries = 100;
+ /*
+ * Real 82576 hardware processes the descriptor ring at line rate.
+ * max_memcpy_size = (RING_SIZE - 1) * IGB_MAX_CHUNK_SIZE ~= 4 MB,
+ * split into 4095 1 KB frames. At 1 Gb/s (~125 MB/s) the worst
+ * valid memcpy takes ~32 ms on the wire, plus per-frame preamble,
+ * SFD, IFG and FCS overhead (~3%) and descriptor fetch/writeback
+ * latency. Wait up to ~200 ms before declaring the device hung;
+ * ~6x the line-rate floor leaves comfortable headroom for host
+ * scheduling jitter while keeping the intentional invalid-DMA
+ * tests bounded.
+ */
+ retries = 200;
while (retries-- > 0) {
status = le32_to_cpu(READ_ONCE(rx->wb.status_error));
if (status & 1)
break;
- usleep(10);
+ usleep(1000);
}

if (status & 1)

--
2.55.0.795.g602f6c329a-goog