]> www.infradead.org Git - users/hch/misc.git/commitdiff
vfio: selftests: Replicate tests across all iommu_modes
authorDavid Matlack <dmatlack@google.com>
Fri, 22 Aug 2025 21:25:12 +0000 (21:25 +0000)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 27 Aug 2025 18:14:10 +0000 (12:14 -0600)
Automatically replicate vfio_dma_mapping_test and vfio_pci_driver_test
across all supported IOMMU modes using fixture variants. Both of these
tests exercise DMA mapping to some degree so having automatic coverage
across all IOMMU modes will help catch bugs.

Acked-by: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: David Matlack <dmatlack@google.com>
Link: https://lore.kernel.org/r/20250822212518.4156428-26-dmatlack@google.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
tools/testing/selftests/vfio/lib/include/vfio_util.h
tools/testing/selftests/vfio/lib/vfio_pci_device.c
tools/testing/selftests/vfio/vfio_dma_mapping_test.c
tools/testing/selftests/vfio/vfio_pci_driver_test.c

index d50debd848139d8026add3530a6dcc75a422e07a..bf0b636a9c0c139da73e5b2953c4fc6fc3f5f221 100644 (file)
@@ -53,6 +53,14 @@ struct vfio_iommu_mode {
        unsigned long iommu_type;
 };
 
+/*
+ * Generator for VFIO selftests fixture variants that replicate across all
+ * possible IOMMU modes. Tests must define FIXTURE_VARIANT_ADD_IOMMU_MODE()
+ * which should then use FIXTURE_VARIANT_ADD() to create the variant.
+ */
+#define FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(...) \
+FIXTURE_VARIANT_ADD_IOMMU_MODE(vfio_type1_iommu, ##__VA_ARGS__)
+
 struct vfio_pci_bar {
        struct vfio_region_info info;
        void *vaddr;
index 15e5adb770c34024e986715b1ff5d07ae427da1d..5c4d008f2a25ef462d696dd41c35567cee40a633 100644 (file)
@@ -364,6 +364,7 @@ const char *vfio_pci_get_cdev_path(const char *bdf)
        return cdev_path;
 }
 
+/* Reminder: Keep in sync with FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(). */
 static const struct vfio_iommu_mode iommu_modes[] = {
        {
                .name = "vfio_type1_iommu",
index f07bdb602422221a790f83d842b9487ca184fa0d..b65949c6b8465e1ec8337167ab13e30002125a80 100644 (file)
@@ -96,27 +96,25 @@ FIXTURE(vfio_dma_mapping_test) {
 };
 
 FIXTURE_VARIANT(vfio_dma_mapping_test) {
+       const char *iommu_mode;
        u64 size;
        int mmap_flags;
 };
 
-FIXTURE_VARIANT_ADD(vfio_dma_mapping_test, anonymous) {
-       .mmap_flags = MAP_ANONYMOUS | MAP_PRIVATE,
-};
-
-FIXTURE_VARIANT_ADD(vfio_dma_mapping_test, anonymous_hugetlb_2mb) {
-       .size = SZ_2M,
-       .mmap_flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB | MAP_HUGE_2MB,
-};
+#define FIXTURE_VARIANT_ADD_IOMMU_MODE(_iommu_mode, _name, _size, _mmap_flags) \
+FIXTURE_VARIANT_ADD(vfio_dma_mapping_test, _iommu_mode ## _ ## _name) {               \
+       .iommu_mode = #_iommu_mode,                                            \
+       .size = (_size),                                                       \
+       .mmap_flags = MAP_ANONYMOUS | MAP_PRIVATE | (_mmap_flags),             \
+}
 
-FIXTURE_VARIANT_ADD(vfio_dma_mapping_test, anonymous_hugetlb_1gb) {
-       .size = SZ_1G,
-       .mmap_flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB | MAP_HUGE_1GB,
-};
+FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(anonymous, 0, 0);
+FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(anonymous_hugetlb_2mb, SZ_2M, MAP_HUGETLB | MAP_HUGE_2MB);
+FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(anonymous_hugetlb_1gb, SZ_1G, MAP_HUGETLB | MAP_HUGE_1GB);
 
 FIXTURE_SETUP(vfio_dma_mapping_test)
 {
-       self->device = vfio_pci_device_init(device_bdf, default_iommu_mode);
+       self->device = vfio_pci_device_init(device_bdf, variant->iommu_mode);
 }
 
 FIXTURE_TEARDOWN(vfio_dma_mapping_test)
index 14ec862c0b1126bfd0589ee74b19b3fc2729c8aa..2dbd70b7db6275a1f2fcecc652cba46d44d099a8 100644 (file)
@@ -56,11 +56,22 @@ FIXTURE(vfio_pci_driver_test) {
        iova_t unmapped_iova;
 };
 
+FIXTURE_VARIANT(vfio_pci_driver_test) {
+       const char *iommu_mode;
+};
+
+#define FIXTURE_VARIANT_ADD_IOMMU_MODE(_iommu_mode)            \
+FIXTURE_VARIANT_ADD(vfio_pci_driver_test, _iommu_mode) {       \
+       .iommu_mode = #_iommu_mode,                             \
+}
+
+FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES();
+
 FIXTURE_SETUP(vfio_pci_driver_test)
 {
        struct vfio_pci_driver *driver;
 
-       self->device = vfio_pci_device_init(device_bdf, default_iommu_mode);
+       self->device = vfio_pci_device_init(device_bdf, variant->iommu_mode);
 
        driver = &self->device->driver;