[PATCH 14/14] iommufd/selftest: Add a selftest for IOMMU_HWPT_ALLOC

Jason Gunthorpe
2023-02-25T00:28:17Z

Test the basic flow.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
tools/testing/selftests/iommu/iommufd.c | 15 +++++++++++++
.../selftests/iommu/iommufd_fail_nth.c | 11 +++++++++-
tools/testing/selftests/iommu/iommufd_utils.h | 21 +++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c
index 7e6fe263e1b62e..65f1847de5a542 100644
--- a/tools/testing/selftests/iommu/iommufd.c
+++ b/tools/testing/selftests/iommu/iommufd.c
@@ -1307,6 +1307,21 @@ TEST_F(iommufd_mock_domain, replace)
test_ioctl_destroy(ioas_id);
}

+TEST_F(iommufd_mock_domain, alloc_hwpt)
+{
+ int i;
+
+ for (i = 0; i != variant->mock_domains; i++) {
+ uint32_t hwpt_id;
+ uint32_t device_id;
+
+ test_cmd_hwpt_alloc(self->idev_ids[0], self->ioas_id, &hwpt_id);
+ test_cmd_mock_domain(hwpt_id, &device_id, NULL, NULL);
+ test_ioctl_destroy(device_id);
+ test_ioctl_destroy(hwpt_id);
+ }
+}
+
/* VFIO compatibility IOCTLs */

TEST_F(iommufd, simple_ioctls)
diff --git a/tools/testing/selftests/iommu/iommufd_fail_nth.c b/tools/testing/selftests/iommu/iommufd_fail_nth.c
index f2012db43fbc16..5f293825fc37a0 100644
--- a/tools/testing/selftests/iommu/iommufd_fail_nth.c
+++ b/tools/testing/selftests/iommu/iommufd_fail_nth.c
@@ -582,6 +582,8 @@ TEST_FAIL_NTH(basic_fail_nth, device)
uint32_t ioas_id;
uint32_t ioas_id2;
uint32_t device_id;
+ uint32_t idev_id;
+ uint32_t hwpt_id;

self->fd = open("/dev/iommu", O_RDWR);
if (self->fd == -1)
@@ -595,11 +597,18 @@ TEST_FAIL_NTH(basic_fail_nth, device)

fail_nth_enable();

- if (_test_cmd_mock_domain(self->fd, ioas_id, &device_id, NULL, NULL))
+ if (_test_cmd_mock_domain(self->fd, ioas_id, &device_id, NULL,
+ &idev_id))
+ return -1;
+
+ if (_test_cmd_hwpt_alloc(self->fd, idev_id, ioas_id, &hwpt_id))
return -1;

if (_test_cmd_mock_domain_replace(self->fd, device_id, ioas_id2, NULL))
return -1;
+
+ if (_test_cmd_mock_domain_replace(self->fd, device_id, hwpt_id, NULL))
+ return -1;
return 0;
}

diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h
index 807a2421121b51..bc0ca8973e7951 100644
--- a/tools/testing/selftests/iommu/iommufd_utils.h
+++ b/tools/testing/selftests/iommu/iommufd_utils.h
@@ -96,6 +96,27 @@ static int _test_cmd_mock_domain_replace(int fd, __u32 device_id, __u32 pt_id,
EXPECT_ERRNO(_errno, _test_cmd_mock_domain_replace( \
self->fd, device_id, pt_id, NULL))

+static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
+ __u32 *hwpt_id)
+{
+ struct iommu_hwpt_alloc cmd = {
+ .size = sizeof(cmd),
+ .dev_id = device_id,
+ .pt_id = pt_id,
+ };
+ int ret;
+
+ ret = ioctl(fd, IOMMU_HWPT_ALLOC, &cmd);
+ if (ret)
+ return ret;
+ if (hwpt_id)
+ *hwpt_id = cmd.out_hwpt_id;
+ return 0;
+}
+
+#define test_cmd_hwpt_alloc(device_id, pt_id, hwpt_id) \
+ ASSERT_EQ(0, _test_cmd_hwpt_alloc(self->fd, device_id, pt_id, hwpt_id))
+
static int _test_cmd_create_access(int fd, unsigned int ioas_id,
__u32 *access_id, unsigned int flags)
{
--
2.39.1