kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/30] vfio: Introduce selftests for VFIO
@ 2025-08-22 21:24 David Matlack
  2025-08-22 21:24 ` [PATCH v2 01/30] selftests: Create tools/testing/selftests/vfio David Matlack
                   ` (30 more replies)
  0 siblings, 31 replies; 33+ messages in thread
From: David Matlack @ 2025-08-22 21:24 UTC (permalink / raw)
  To: Alex Williamson
  Cc: Aaron Lewis, Adhemerval Zanella, Adithya Jayachandran,
	Arnaldo Carvalho de Melo, Dan Williams, Dave Jiang, David Matlack,
	dmaengine, Jason Gunthorpe, Joel Granados, Josh Hilke, Kevin Tian,
	kvm, linux-kselftest, Paolo Bonzini, Pasha Tatashin,
	Saeed Mahameed, Sean Christopherson, Shuah Khan,
	Vinicius Costa Gomes, Vipin Sharma, Yury Norov [NVIDIA]

This series introduces VFIO selftests, located in
tools/testing/selftests/vfio/.

VFIO selftests aim to enable kernel developers to write and run tests
that take the form of userspace programs that interact with VFIO and
IOMMUFD uAPIs. VFIO selftests can be used to write functional tests for
new features, regression tests for bugs, and performance tests for
optimizations.

These tests are designed to interact with real PCI devices, i.e. they do
not rely on mocking out or faking any behavior in the kernel. This
allows the tests to exercise not only VFIO but also IOMMUFD, the IOMMU
driver, interrupt remapping, IRQ handling, etc.

For more background on the motivation and design of this series, please
see the RFC:

  https://lore.kernel.org/kvm/20250523233018.1702151-1-dmatlack@google.com/

This series can also be found on GitHub:

  https://github.com/dmatlack/linux/tree/vfio/selftests/v2

Changelog
-----------------------------------------------------------------------

v1: https://lore.kernel.org/kvm/20250620232031.2705638-1-dmatlack@google.com/

 - Collect various Acks
 - Switch myself from Reviewer to Maintainer of VFIO selftests
 - Re-order the new MAINTAINERS entry to be alphabetical
 - Drop the KVM selftests patches from the series
 - Reorder the tools header commits to be closer to the commits that
   use them (Vinicius)
 - Use host virtual addresses instead of magic numbers for IOVAs in
   vfio_pci_driver_test and vfio_dma_mapping_test

RFC: https://lore.kernel.org/kvm/20250523233018.1702151-1-dmatlack@google.com/

 - Add symlink to linux/pci_ids.h instead of copying (Jason)
 - Add symlinks to drivers/dma/*/*.h instead of copying (Jason)
 - Automatically replicate vfio_dma_mapping_test across backing
   sources using fixture variants (Jason)
 - Automatically replicate vfio_dma_mapping_test and
   vfio_pci_driver_test across all iommu_modes using fixture
   variants (Jason)
 - Invert access() check in vfio_dma_mapping_test (me)
 - Use driver_override instead of add/remove_id (Alex)
 - Allow tests to get BDF from env var (Alex)
 - Use KSFT_FAIL instead of 1 to exit with failure (Alex)
 - Unconditionally create $(LIBVFIO_O_DIRS) to avoid target
   conflict with ../cgroup/lib/libcgroup.mk when building
   KVM selftests (me)
 - Allow VFIO selftests to run automatically by switching from
   TEST_GEN_PROGS_EXTENDED to TEST_GEN_PROGS. Automatically run
   selftests will use $VFIO_SELFTESTS_BDF environment variable
   to know which device to use (Alex)
 - Replace hardcoded SZ_4K with getpagesize() in vfio_dma_mapping_test
   to support platforms with other page sizes (me)
 - Make all global variables static where possible (me)
 - Pass argc and argv to test_harness_main() so that users can
   pass flags to the kselftest harness (me)

Instructions
-----------------------------------------------------------------------

Running VFIO selftests requires at a PCI device bound to vfio-pci for
the tests to use. The address of this device is passed to the test as
a segment:bus:device.function string, which must match the path to
the device in /sys/bus/pci/devices/ (e.g. 0000:00:04.0).

Once you have chosen a device, there is a helper script provided to
unbind the device from its current driver, bind it to vfio-pci, export
the environment variable $VFIO_SELFTESTS_BDF, and launch a shell:

  $ tools/testing/selftests/vfio/run.sh -d 0000:00:04.0 -s

The -d option tells the script which device to use and the -s option
tells the script to launch a shell.

Additionally, the VFIO selftest vfio_dma_mapping_test has test cases
that rely on HugeTLB pages being available, otherwise they are skipped.
To enable those tests make sure at least 1 2MB and 1 1GB HugeTLB pages
are available.

  $ echo 1 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  $ echo 1 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages

To run all VFIO selftests using make:

  $ make -C tools/testing/selftests/vfio run_tests

To run individual tests:

  $ tools/testing/selftests/vfio/vfio_dma_mapping_test
  $ tools/testing/selftests/vfio/vfio_dma_mapping_test -v iommufd_anonymous_hugetlb_2mb
  $ tools/testing/selftests/vfio/vfio_dma_mapping_test -r vfio_dma_mapping_test.iommufd_anonymous_hugetlb_2mb.dma_map_unmap

The environment variable $VFIO_SELFTESTS_BDF can be overridden for a
specific test by passing in the BDF on the command line as the last
positional argument.

  $ tools/testing/selftests/vfio/vfio_dma_mapping_test 0000:00:04.0
  $ tools/testing/selftests/vfio/vfio_dma_mapping_test -v iommufd_anonymous_hugetlb_2mb 0000:00:04.0
  $ tools/testing/selftests/vfio/vfio_dma_mapping_test -r vfio_dma_mapping_test.iommufd_anonymous_hugetlb_2mb.dma_map_unmap 0000:00:04.0

When you are done, free the HugeTLB pages and exit the shell started by
run.sh. Exiting the shell will cause the device to be unbound from
vfio-pci and bound back to its original driver.

  $ echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  $ echo 0 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
  $ exit

It's also possible to use run.sh to run just a single test hermetically,
rather than dropping into a shell:

  $ tools/testing/selftests/vfio/run.sh -d 0000:00:04.0 -- tools/testing/selftests/vfio/vfio_dma_mapping_test -v iommufd_anonymous

Tests
-----------------------------------------------------------------------

There are 4 tests in this series, mostly to demonstrate as a
proof-of-concept:

 - tools/testing/selftests/vfio/vfio_pci_device_test.c
 - tools/testing/selftests/vfio/vfio_pci_driver_test.c
 - tools/testing/selftests/vfio/vfio_iommufd_setup_test.c
 - tools/testing/selftests/vfio/vfio_dma_mapping_test.c

Future Areas of Development
-----------------------------------------------------------------------

Library:

 - Driver support for devices that can be used on AMD, ARM, and other
   platforms (e.g. mlx5).
 - Driver support for a device available in QEMU VMs (e.g.
   pcie-ats-testdev [1])
 - Support for tests that use multiple devices.
 - Support for IOMMU groups with multiple devices.
 - Support for multiple devices sharing the same container/iommufd.
 - Sharing TEST_ASSERT() macros and other common code between KVM
   and VFIO selftests.

Tests:

 - DMA mapping performance tests for BARs/HugeTLB/etc.
 - Porting tests from
   https://github.com/awilliam/tests/commits/for-clg/ to selftests.
 - Live Update selftests.
 - Resend Sean's KVM selftest for posted interrupts using the VFIO
   selftests library [2][3]

Cc: Alex Williamson <alex.williamson@redhat.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Kevin Tian <kevin.tian@intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Vipin Sharma <vipinsh@google.com>
Cc: Josh Hilke <jrhilke@google.com>
Cc: Aaron Lewis <aaronlewis@google.com>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: Saeed Mahameed <saeedm@nvidia.com>
Cc: Adithya Jayachandran <ajayachandra@nvidia.com>
Cc: Joel Granados <joel.granados@kernel.org>

[1] https://github.com/Joelgranados/qemu/blob/pcie-testdev/hw/misc/pcie-ats-testdev.c
[2] https://lore.kernel.org/kvm/20250404193923.1413163-68-seanjc@google.com/
[3] https://lore.kernel.org/kvm/20250620232031.2705638-32-dmatlack@google.com/

David Matlack (25):
  selftests: Create tools/testing/selftests/vfio
  vfio: selftests: Add a helper library for VFIO selftests
  vfio: selftests: Introduce vfio_pci_device_test
  vfio: selftests: Keep track of DMA regions mapped into the device
  vfio: selftests: Enable asserting MSI eventfds not firing
  vfio: selftests: Add a helper for matching vendor+device IDs
  vfio: selftests: Add driver framework
  vfio: sefltests: Add vfio_pci_driver_test
  tools headers: Add stub definition for __iomem
  tools headers: Import asm-generic MMIO helpers
  tools headers: Import x86 MMIO helper overrides
  tools headers: Add symlink to linux/pci_ids.h
  dmaengine: ioat: Move system_has_dca_enabled() to dma.h
  vfio: selftests: Add driver for Intel CBDMA
  tools headers: Import iosubmit_cmds512()
  dmaengine: idxd: Allow registers.h to be included from tools/
  vfio: selftests: Add driver for Intel DSA
  vfio: selftests: Move helper to get cdev path to libvfio
  vfio: selftests: Encapsulate IOMMU mode
  vfio: selftests: Replicate tests across all iommu_modes
  vfio: selftests: Add vfio_type1v2_mode
  vfio: selftests: Add iommufd_compat_type1{,v2} modes
  vfio: selftests: Add iommufd mode
  vfio: selftests: Make iommufd the default iommu_mode
  vfio: selftests: Add a script to help with running VFIO selftests

Josh Hilke (5):
  vfio: selftests: Test basic VFIO and IOMMUFD integration
  vfio: selftests: Move vfio dma mapping test to their own file
  vfio: selftests: Add test to reset vfio device.
  vfio: selftests: Add DMA mapping tests for 2M and 1G HugeTLB
  vfio: selftests: Validate 2M/1G HugeTLB are mapped as 2M/1G in IOMMU

 MAINTAINERS                                   |   7 +
 drivers/dma/idxd/registers.h                  |   4 +
 drivers/dma/ioat/dma.h                        |   2 +
 drivers/dma/ioat/hw.h                         |   3 -
 tools/arch/x86/include/asm/io.h               | 101 +++
 tools/arch/x86/include/asm/special_insns.h    |  27 +
 tools/include/asm-generic/io.h                | 482 ++++++++++++++
 tools/include/asm/io.h                        |  11 +
 tools/include/linux/compiler.h                |   4 +
 tools/include/linux/io.h                      |   4 +-
 tools/include/linux/pci_ids.h                 |   1 +
 tools/testing/selftests/Makefile              |   1 +
 tools/testing/selftests/vfio/.gitignore       |   7 +
 tools/testing/selftests/vfio/Makefile         |  21 +
 .../selftests/vfio/lib/drivers/dsa/dsa.c      | 416 ++++++++++++
 .../vfio/lib/drivers/dsa/registers.h          |   1 +
 .../selftests/vfio/lib/drivers/ioat/hw.h      |   1 +
 .../selftests/vfio/lib/drivers/ioat/ioat.c    | 235 +++++++
 .../vfio/lib/drivers/ioat/registers.h         |   1 +
 .../selftests/vfio/lib/include/vfio_util.h    | 295 +++++++++
 tools/testing/selftests/vfio/lib/libvfio.mk   |  24 +
 .../selftests/vfio/lib/vfio_pci_device.c      | 594 ++++++++++++++++++
 .../selftests/vfio/lib/vfio_pci_driver.c      | 126 ++++
 tools/testing/selftests/vfio/run.sh           | 109 ++++
 .../selftests/vfio/vfio_dma_mapping_test.c    | 199 ++++++
 .../selftests/vfio/vfio_iommufd_setup_test.c  | 127 ++++
 .../selftests/vfio/vfio_pci_device_test.c     | 176 ++++++
 .../selftests/vfio/vfio_pci_driver_test.c     | 244 +++++++
 28 files changed, 3219 insertions(+), 4 deletions(-)
 create mode 100644 tools/arch/x86/include/asm/io.h
 create mode 100644 tools/arch/x86/include/asm/special_insns.h
 create mode 100644 tools/include/asm-generic/io.h
 create mode 100644 tools/include/asm/io.h
 create mode 120000 tools/include/linux/pci_ids.h
 create mode 100644 tools/testing/selftests/vfio/.gitignore
 create mode 100644 tools/testing/selftests/vfio/Makefile
 create mode 100644 tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c
 create mode 120000 tools/testing/selftests/vfio/lib/drivers/dsa/registers.h
 create mode 120000 tools/testing/selftests/vfio/lib/drivers/ioat/hw.h
 create mode 100644 tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c
 create mode 120000 tools/testing/selftests/vfio/lib/drivers/ioat/registers.h
 create mode 100644 tools/testing/selftests/vfio/lib/include/vfio_util.h
 create mode 100644 tools/testing/selftests/vfio/lib/libvfio.mk
 create mode 100644 tools/testing/selftests/vfio/lib/vfio_pci_device.c
 create mode 100644 tools/testing/selftests/vfio/lib/vfio_pci_driver.c
 create mode 100755 tools/testing/selftests/vfio/run.sh
 create mode 100644 tools/testing/selftests/vfio/vfio_dma_mapping_test.c
 create mode 100644 tools/testing/selftests/vfio/vfio_iommufd_setup_test.c
 create mode 100644 tools/testing/selftests/vfio/vfio_pci_device_test.c
 create mode 100644 tools/testing/selftests/vfio/vfio_pci_driver_test.c


base-commit: c17b750b3ad9f45f2b6f7e6f7f4679844244f0b9
-- 
2.51.0.rc2.233.g662b1ed5c5-goog


^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2025-08-27 20:21 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-22 21:24 [PATCH v2 00/30] vfio: Introduce selftests for VFIO David Matlack
2025-08-22 21:24 ` [PATCH v2 01/30] selftests: Create tools/testing/selftests/vfio David Matlack
2025-08-22 21:24 ` [PATCH v2 02/30] vfio: selftests: Add a helper library for VFIO selftests David Matlack
2025-08-22 21:24 ` [PATCH v2 03/30] vfio: selftests: Introduce vfio_pci_device_test David Matlack
2025-08-22 21:24 ` [PATCH v2 04/30] vfio: selftests: Test basic VFIO and IOMMUFD integration David Matlack
2025-08-22 21:24 ` [PATCH v2 05/30] vfio: selftests: Move vfio dma mapping test to their own file David Matlack
2025-08-22 21:24 ` [PATCH v2 06/30] vfio: selftests: Add test to reset vfio device David Matlack
2025-08-22 21:24 ` [PATCH v2 07/30] vfio: selftests: Add DMA mapping tests for 2M and 1G HugeTLB David Matlack
2025-08-22 21:24 ` [PATCH v2 08/30] vfio: selftests: Validate 2M/1G HugeTLB are mapped as 2M/1G in IOMMU David Matlack
2025-08-22 21:24 ` [PATCH v2 09/30] vfio: selftests: Keep track of DMA regions mapped into the device David Matlack
2025-08-22 21:24 ` [PATCH v2 10/30] vfio: selftests: Enable asserting MSI eventfds not firing David Matlack
2025-08-22 21:24 ` [PATCH v2 11/30] vfio: selftests: Add a helper for matching vendor+device IDs David Matlack
2025-08-22 21:24 ` [PATCH v2 12/30] vfio: selftests: Add driver framework David Matlack
2025-08-22 21:25 ` [PATCH v2 13/30] vfio: sefltests: Add vfio_pci_driver_test David Matlack
2025-08-22 21:25 ` [PATCH v2 14/30] tools headers: Add stub definition for __iomem David Matlack
2025-08-22 21:25 ` [PATCH v2 15/30] tools headers: Import asm-generic MMIO helpers David Matlack
2025-08-22 21:25 ` [PATCH v2 16/30] tools headers: Import x86 MMIO helper overrides David Matlack
2025-08-22 21:25 ` [PATCH v2 17/30] tools headers: Add symlink to linux/pci_ids.h David Matlack
2025-08-22 21:25 ` [PATCH v2 18/30] dmaengine: ioat: Move system_has_dca_enabled() to dma.h David Matlack
2025-08-22 21:25 ` [PATCH v2 19/30] vfio: selftests: Add driver for Intel CBDMA David Matlack
2025-08-22 21:25 ` [PATCH v2 20/30] tools headers: Import iosubmit_cmds512() David Matlack
2025-08-22 21:25 ` [PATCH v2 21/30] dmaengine: idxd: Allow registers.h to be included from tools/ David Matlack
2025-08-22 21:25 ` [PATCH v2 22/30] vfio: selftests: Add driver for Intel DSA David Matlack
2025-08-22 21:25 ` [PATCH v2 23/30] vfio: selftests: Move helper to get cdev path to libvfio David Matlack
2025-08-22 21:25 ` [PATCH v2 24/30] vfio: selftests: Encapsulate IOMMU mode David Matlack
2025-08-22 21:25 ` [PATCH v2 25/30] vfio: selftests: Replicate tests across all iommu_modes David Matlack
2025-08-22 21:25 ` [PATCH v2 26/30] vfio: selftests: Add vfio_type1v2_mode David Matlack
2025-08-22 21:25 ` [PATCH v2 27/30] vfio: selftests: Add iommufd_compat_type1{,v2} modes David Matlack
2025-08-22 21:25 ` [PATCH v2 28/30] vfio: selftests: Add iommufd mode David Matlack
2025-08-22 21:25 ` [PATCH v2 29/30] vfio: selftests: Make iommufd the default iommu_mode David Matlack
2025-08-22 21:25 ` [PATCH v2 30/30] vfio: selftests: Add a script to help with running VFIO selftests David Matlack
2025-08-27 18:55 ` [PATCH v2 00/30] vfio: Introduce selftests for VFIO Alex Williamson
2025-08-27 20:20   ` David Matlack

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).