iommufd/selftest: Add a selftest for IOMMU_HWPT_ALLOC
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 17 Jul 2023 18:12:15 +0000 (15:12 -0300)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 26 Jul 2023 13:20:41 +0000 (10:20 -0300)
Test the basic flow.

Link: https://lore.kernel.org/r/19-v8-6659224517ea+532-iommufd_alloc_jgg@nvidia.com
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/io_pagetable.c
tools/testing/selftests/iommu/iommufd.c
tools/testing/selftests/iommu/iommufd_fail_nth.c
tools/testing/selftests/iommu/iommufd_utils.h

index 112bea5..4d09511 100644 (file)
@@ -1180,6 +1180,9 @@ int iopt_table_enforce_dev_resv_regions(struct io_pagetable *iopt,
        unsigned int num_sw_msi = 0;
        int rc;
 
+       if (iommufd_should_fail())
+               return -EINVAL;
+
        down_write(&iopt->iova_rwsem);
        /* FIXME: drivers allocate memory but there is no failure propogated */
        iommu_get_resv_regions(dev, &resv_regions);
index 78841ab..dc09c1d 100644 (file)
@@ -1338,6 +1338,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 stddev_id;
+               uint32_t hwpt_id;
+
+               test_cmd_hwpt_alloc(self->idev_ids[0], self->ioas_id, &hwpt_id);
+               test_cmd_mock_domain(hwpt_id, &stddev_id, NULL, NULL);
+               test_ioctl_destroy(stddev_id);
+               test_ioctl_destroy(hwpt_id);
+       }
+}
+
 /* VFIO compatibility IOCTLs */
 
 TEST_F(iommufd, simple_ioctls)
index 8ab20df..d4c552e 100644 (file)
@@ -579,6 +579,8 @@ TEST_FAIL_NTH(basic_fail_nth, device)
        uint32_t ioas_id;
        uint32_t ioas_id2;
        uint32_t stdev_id;
+       uint32_t idev_id;
+       uint32_t hwpt_id;
        __u64 iova;
 
        self->fd = open("/dev/iommu", O_RDWR);
@@ -605,11 +607,18 @@ TEST_FAIL_NTH(basic_fail_nth, device)
 
        fail_nth_enable();
 
-       if (_test_cmd_mock_domain(self->fd, ioas_id, &stdev_id, NULL, NULL))
+       if (_test_cmd_mock_domain(self->fd, ioas_id, &stdev_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, stdev_id, ioas_id2, NULL))
                return -1;
+
+       if (_test_cmd_mock_domain_replace(self->fd, stdev_id, hwpt_id, NULL))
+               return -1;
        return 0;
 }
 
index 62e0141..53b4d3f 100644 (file)
@@ -98,6 +98,27 @@ static int _test_cmd_mock_domain_replace(int fd, __u32 stdev_id, __u32 pt_id,
        EXPECT_ERRNO(_errno, _test_cmd_mock_domain_replace(self->fd, stdev_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)
 {