[PATCH v3 00/16] KVM: selftests: Link with VFIO selftests lib and test device interrupts

From: Josh Hilke

Date: Tue Apr 21 2026 - 19:16:18 EST


This is v3 of a series which introduces tools/testing/selftests/kvm/irq_test.c
in KVM selftests. This test exercises the delivery of interrupts (both
emulated via eventfd and real from a VFIO device) to guest vCPUs. Beyond basic
injection, the series adds coverage for several complex scenarios, including:
- Dynamic updates to KVM's GSI routing table while interrupts are active.
- Waking up halted vCPUs via interrupts.
- Stressing interrupt delivery during random host IRQ affinity changes.
- Stressing interrupt delivery during random vCPU thread migration across
physical CPUs.
- Testing non-postable interrupt remapping (using NMIs to force transitions).
- Supporting both xAPIC and x2APIC modes in the guest.

The series also links the VFIO selftests library into KVM selftests to enable
testing of VFIO-KVM interactions.

The test can optionally use a PCI device bound to vfio-pci to test physical
device interrupts. If using a device, it can be invoked by passing the BDF to
the VFIO selftests setup script, and then running the test with the device BDF
passed via the -d option:
$ ./tools/testing/selftests/vfio/scripts/setup.sh 0000:6a:01.0
$ tools/testing/selftests/kvm/irq_test -d 0000:6a:01.0

This test only supports x86. Testing physical device interrupts (-d argument)
requires a device with a supported VFIO selftest driver. Currently supported
devices include:
- Intel DSA (Data Streaming Accelerator), 8086:0b25
- Intel IOAT (I/O Acceleration Technology), 8086:2021

The test can be run with following command-line arguments allow for broad
coverage of the interrupt delivery path:
-a: Random IRQ Affinity. Randomly affinitizes the device IRQ to different host
CPUs to verify stable delivery during interrupt steering changes.
-b: Block vCPUs. Causes vCPUs to HLT instead of spinning, verifying that
Posted-interrupt wakeup (PIW) correctly kicks blocked vCPUs.
-c: Clear GSI Routes. Periodically destroys/recreates KVM's GSI routing table to
verify handling of dynamic IRQ updates.
-d: Device MSI Triggers. Uses the physical device to trigger MSIs instead of
eventfd emulation (requires a supported device driver).
-i: IRQ Count. Sets the number of interrupts to generate (default 1000).
-m: vCPU Migration. Migrates vCPUs to random physical CPUs to verify that
posted interrupts follow the vCPU across host cores.
-n: NMI Delivery. Routes interrupts as NMIs into the guest to verify the
VFIO-NMI delivery path.
-v: vCPU Count. Distributes interrupts across multiple vCPUs via round-robin
routing.
-x: xAPIC Mode. Forces legacy xAPIC mode to verify compatibility.

The series also links the VFIO selftests library into KVM selftests to enable
testing of VFIO-KVM interactions.

Changelog
---------
v3:
- Split monolithic test patch into smaller, logical patches (Sean).
- Moved guest read/write macros to separate patch and renamed them (Sean).
- Extracted /proc/interrupts parsing logic into separate helpers (Sean).
- Renamed guest_rng to kvm_rng for consistency (Sean).
- Added helper to generate random u64 in range [min,max] (Sean).
- Added support for printing vCPU affinity on timeout.
- Removed configurable timeout argument.

v2:
- Split the monolithic test into a series of logical patches (Sean)
- Move READ_FROM_GUEST and WRITE_TO_GUEST macros to kvm_util.h (Sean)
- Add gettid, sched_setaffinity, and sched_getaffinity to kvm_syscalls.h (Sean)
- Extract /proc/interrupts parsing logic into lib/irq_util.c (Sean)
- Add -t command-line option for configurable interrupt timeout (Sean)
- Improve assertion messages with specific vCPU failure context (Sean)
- Update guest loop to use cpu_relax() when not blocking (Sean)
- Add KVM_RANDOM_SEED support to kvm_selftest_init for reproducibility (Sean)
- Randomize the default IRQ vector and GSI (Sean)
- Use kvm_mmap() instead of mmap() (Sean)

[v2] https://lore.kernel.org/kvm/20260331194033.3890309-1-jrhilke@xxxxxxxxxx/

David Matlack (13):
KVM: selftests: Build and link sefltests/vfio/lib into KVM selftests
KVM: selftests: Add /proc/interrupts parsing helpers
KVM: selftests: Add guest read/write macros
KVM: selftests: Add IRQ injection test
KVM: selftests: Verify device IRQs are routed to vCPUs
KVM: selftests: Verify IRQ affinity changes
KVM: selftests: Verify IRQs wake up halted vCPUs
KVM: selftests: Verify dynamic IRQ routing updates
KVM: selftests: Configure number of IRQs
KVM: selftests: Verify non-postable IRQ remapping
KVM: selftests: Verify vCPU migration during IRQ delivery
KVM: selftests: Configure number of vCPUs
KVM: selftests: Add xAPIC support

Josh Hilke (3):
KVM: selftests: Rename guest_rng to kvm_rng
KVM: selftests: Add helper to generate random u64 in range [min,max]
KVM: selftests: Print vCPU affinity on timeout

tools/testing/selftests/kvm/Makefile.kvm | 7 +-
.../selftests/kvm/dirty_log_perf_test.c | 4 +-
tools/testing/selftests/kvm/dirty_log_test.c | 8 +-
.../selftests/kvm/include/kvm_syscalls.h | 6 +
.../testing/selftests/kvm/include/kvm_util.h | 13 +
.../testing/selftests/kvm/include/proc_util.h | 28 ++
.../testing/selftests/kvm/include/test_util.h | 26 +-
.../selftests/kvm/include/x86/kvm_util_arch.h | 4 +-
tools/testing/selftests/kvm/irq_test.c | 367 ++++++++++++++++++
tools/testing/selftests/kvm/lib/kvm_util.c | 88 ++++-
tools/testing/selftests/kvm/lib/memstress.c | 8 +-
tools/testing/selftests/kvm/lib/proc_util.c | 62 +++
tools/testing/selftests/kvm/lib/test_util.c | 22 +-
tools/testing/selftests/kvm/mmu_stress_test.c | 9 +-
tools/testing/selftests/kvm/steal_time.c | 21 +-
15 files changed, 615 insertions(+), 58 deletions(-)
create mode 100644 tools/testing/selftests/kvm/include/proc_util.h
create mode 100644 tools/testing/selftests/kvm/irq_test.c
create mode 100644 tools/testing/selftests/kvm/lib/proc_util.c

--
2.54.0.rc2.533.g4f5dca5207-goog