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

Josh Hilke posted 16 patches 1 month, 3 weeks ago
There is a newer version of this series
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
[PATCH v3 00/16] KVM: selftests: Link with VFIO selftests lib and test device interrupts
Posted by Josh Hilke 1 month, 3 weeks ago
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@google.com/

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
Re: [PATCH v3 00/16] KVM: selftests: Link with VFIO selftests lib and test device interrupts
Posted by Sean Christopherson 3 weeks ago
On Tue, Apr 21, 2026, Josh Hilke wrote:
> v3:
> - Split monolithic test patch into smaller, logical patches (Sean).

Needs to go farther.  E.g. "KVM: selftests: Verify vCPU migration during IRQ delivery"
should be ~4 patches:

 1. Add gettid() wrapper (because what you proposed doesn't compile for me).
 2. Add sched_getaffinity() wrapper *AND* convert existing users.
 3. Add pin_task_to_random_cpu()
 4. Implement IRQ bypass vCPU migration

Maybe combine #3 and #4?  Adding helpers/APIs without users isn't ideal, but
pin_task_to_random_cpu() is interesting enough that I think it's worth isolating
in this case.

> 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

All of these shortlogs need more context.  E.g. "Add xAPIC support" suggests the
patch adds xAPIC support to _all_ of selftests.  We generally discourage trying
to set the scope to a specific test, because it inevitably falls apart, but it's
easy enough to "manually" call out the relevant test.

  KVM: selftests: Add xAPIC support to the IRQ bypass test

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