[Devel] [PATCH vz10] selftests/iommu: skip when /dev/iommu is not available
Konstantin Khorenko
khorenko at virtuozzo.com
Mon Aug 24 12:40:41 MSK 2026
1. We have /dev/iommu device, just need to load a module iommufd.ko
(root at sbHCI)/vz/finist/vzkernel.vz10:grep IOMMUFD .config
CONFIG_IOMMUFD=m
# CONFIG_IOMMUFD_TEST is not set
2. The check for open is too wide - it will skip the test on ANY error, but should - only in case the file is absent, all other errors from open() should be called next ASSERT_NE(-1, self->fd);
3. Tests won't work anyway in out current config because in our current release config we have
# CONFIG_IOMMUFD_TEST is not set
But we have it enabled in debug kernel config though.
4. There is a similar test iommufd_fail_nth.c nearby which should suffer from the same problems, so to fix it likewise.
5. Even in case you modprobe iommufd module, in production config we have
# CONFIG_IOMMUFD_TEST is not set
so all the tests will fail later on test ioctls.
=> better to check /sys/bus/iommufd_mock instead, it appears only in case
iommufd is loaded and CONFIG_IOMMUFD_TEST is set.
6. You can perform a single check, not repeating 8 times the same check.
At the momnent TEST_HARNESS_MAIN is just:
#define TEST_HARNESS_MAIN \
int main(int argc, char **argv) { \
return test_harness_run(argc, argv); \
}
test_harness_run() - static func (kselftest_harness.h:1267), so you can call it from main().
So you can do the following single check:
static bool iommufd_mock_available(void)
{
return access("/sys/bus/iommufd_mock", F_OK) == 0;
}
int main(int argc, char **argv)
{
if (!iommufd_mock_available())
ksft_exit_skip("iommufd mock device is not available, need CONFIG_IOMMUFD_TEST=y and the iommufd module load
return test_harness_run(argc, argv);
}
instead of TEST_HARNESS_MAIN в iommufd.c:3542 and in iommufd_fail_nth.c:748.
=>
summary:
1. pre-load iommufd module in hci-* wrapper if it's not loaded and unload the module after the test if it was not loaded before the test.
2. make a single check for /sys/bus/iommufd_mock
3. fix both iommufd.c and iommufd_fail_nth.c
--
Best regards,
Konstantin Khorenko,
Virtuozzo Linux Kernel Team
On 8/21/26 17:05, Eva Kurchatova wrote:
> Without iommufd all 237 subtests fail in FIXTURE_SETUP on the open().
>
> https://virtuozzo.atlassian.net/browse/VSTOR-142443
> Feature: fix selftests
> Signed-off-by: Eva Kurchatova <eva.kurchatova at virtuozzo.com>
> ---
> tools/testing/selftests/iommu/iommufd.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c
> index de348d641279..0625e1596bbf 100644
> --- a/tools/testing/selftests/iommu/iommufd.c
> +++ b/tools/testing/selftests/iommu/iommufd.c
> @@ -66,6 +66,8 @@ FIXTURE(iommufd)
> FIXTURE_SETUP(iommufd)
> {
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
> }
>
> @@ -254,6 +256,8 @@ FIXTURE_VARIANT(change_process)
> FIXTURE_SETUP(change_process)
> {
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
>
> drop_cap_ipc_lock(_metadata);
> @@ -360,6 +364,8 @@ FIXTURE_SETUP(iommufd_ioas)
>
>
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
> test_ioctl_ioas_alloc(&self->ioas_id);
>
> @@ -1641,6 +1647,8 @@ FIXTURE_SETUP(iommufd_mock_domain)
> unsigned int i;
>
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
> test_ioctl_ioas_alloc(&self->ioas_id);
>
> @@ -2114,6 +2122,8 @@ FIXTURE_SETUP(iommufd_dirty_tracking)
> }
>
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
>
> mmap_flags = MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED;
> @@ -2484,6 +2494,8 @@ FIXTURE_SETUP(vfio_compat_mock_domain)
> };
>
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
>
> /* Create what VFIO would consider a group */
> @@ -2773,6 +2785,8 @@ FIXTURE_VARIANT(iommufd_viommu)
> FIXTURE_SETUP(iommufd_viommu)
> {
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
> test_ioctl_ioas_alloc(&self->ioas_id);
> test_ioctl_set_default_memory_limit();
> @@ -3236,6 +3250,8 @@ FIXTURE_VARIANT(iommufd_device_pasid)
> FIXTURE_SETUP(iommufd_device_pasid)
> {
> self->fd = open("/dev/iommu", O_RDWR);
> + if (self->fd < 0)
> + SKIP(return, "/dev/iommu is not available");
> ASSERT_NE(-1, self->fd);
> test_ioctl_ioas_alloc(&self->ioas_id);
>
More information about the Devel
mailing list