Use the VFIO selftests library to pick the IOMMU mode in irq_test and drop probe_iommu_type(). Pass NULL to iommu_init() when the user does not specify a mode with -t, and skip the test if the requested mode is not available, or if no mode is available at all. probe_iommu_type() picks iommufd whenever /dev/iommu can be opened, even if VFIO device cdevs are not available (CONFIG_VFIO_DEVICE_CDEV=n), in which case the test fails rather than using the VFIO container. The VFIO selftests library accounts for this when picking a mode, so there is no need for irq_test to probe for a mode itself. Note, this changes irq_test's default container mode from vfio_type1_iommu to vfio_type1v2_iommu, which the VFIO selftests library prefers. This only matters when iommufd is not available. Opportunistically rename iommu_type to iommu_mode to match the terminology used by the VFIO selftests library. Suggested-by: Sean Christopherson Link: https://lore.kernel.org/kvm/aiIG2L_KdPwuxYA1@google.com/ Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftests/kvm/irq_test.c index 791e576c334c..0d6ca1a052c4 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -148,22 +148,6 @@ static void kvm_set_empty_gsi_routing(struct kvm_vm *vm) vm_ioctl(vm, KVM_SET_GSI_ROUTING, &routing); } -static const char *probe_iommu_type(void) -{ - int io_fd; - - io_fd = open("/dev/iommu", O_RDONLY); - if (io_fd >= 0) { - close(io_fd); - return MODE_IOMMUFD; - } - - io_fd = __open_path_or_exit("/dev/vfio/vfio", O_RDONLY, - "Is VFIO (or IOMMUFD) loaded and enabled?"); - close(io_fd); - return MODE_VFIO_TYPE1_IOMMU; -} - static void help(const char *name) { printf("Usage: %s [-a] [-d ] [-e] [-h] [-i nr_irqs] [-m] [-n] [-t iommu_type] [-v nr_vcpus] [-x]\n", name); @@ -205,7 +189,7 @@ int main(int argc, char **argv) int nr_irqs = 1000, nr_vcpus = 1; bool set_empty_routing = false; const char *device_bdf = NULL; - const char *iommu_type = NULL; + const char *iommu_mode = NULL; int i, j, c, msix, eventfd; bool migrate_vcpus = false; cpu_set_t available_cpus; @@ -235,7 +219,7 @@ int main(int argc, char **argv) use_nmi = true; break; case 't': - iommu_type = optarg; + iommu_mode = optarg; break; case 'v': nr_vcpus = atoi_positive("Number of vCPUS", optarg); @@ -266,9 +250,9 @@ int main(int argc, char **argv) } if (device_bdf) { - if (!iommu_type) - iommu_type = probe_iommu_type(); - iommu = iommu_init(iommu_type); + __TEST_REQUIRE(iommu_mode_is_available(iommu_mode), "%s", + iommu_mode_unavailable_msg(iommu_mode)); + iommu = iommu_init(iommu_mode); device = vfio_pci_device_init(device_bdf, iommu); msix = vfio_setup_msi(device); irq = vfio_msix_to_host_irq(device_bdf, msix); -- 2.56.0.506.g506a7eabc5-goog