Commit 6583c865 authored by Jason Gunthorpe's avatar Jason Gunthorpe

iommufd/selftest: Add a selftest for IOMMU_HWPT_ALLOC

Test the basic flow.

Link: https://lore.kernel.org/r/19-v8-6659224517ea+532-iommufd_alloc_jgg@nvidia.comReviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 7a467e02
...@@ -1180,6 +1180,9 @@ int iopt_table_enforce_dev_resv_regions(struct io_pagetable *iopt, ...@@ -1180,6 +1180,9 @@ int iopt_table_enforce_dev_resv_regions(struct io_pagetable *iopt,
unsigned int num_sw_msi = 0; unsigned int num_sw_msi = 0;
int rc; int rc;
if (iommufd_should_fail())
return -EINVAL;
down_write(&iopt->iova_rwsem); down_write(&iopt->iova_rwsem);
/* FIXME: drivers allocate memory but there is no failure propogated */ /* FIXME: drivers allocate memory but there is no failure propogated */
iommu_get_resv_regions(dev, &resv_regions); iommu_get_resv_regions(dev, &resv_regions);
......
...@@ -1338,6 +1338,21 @@ TEST_F(iommufd_mock_domain, replace) ...@@ -1338,6 +1338,21 @@ TEST_F(iommufd_mock_domain, replace)
test_ioctl_destroy(ioas_id); 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 */ /* VFIO compatibility IOCTLs */
TEST_F(iommufd, simple_ioctls) TEST_F(iommufd, simple_ioctls)
......
...@@ -579,6 +579,8 @@ TEST_FAIL_NTH(basic_fail_nth, device) ...@@ -579,6 +579,8 @@ TEST_FAIL_NTH(basic_fail_nth, device)
uint32_t ioas_id; uint32_t ioas_id;
uint32_t ioas_id2; uint32_t ioas_id2;
uint32_t stdev_id; uint32_t stdev_id;
uint32_t idev_id;
uint32_t hwpt_id;
__u64 iova; __u64 iova;
self->fd = open("/dev/iommu", O_RDWR); self->fd = open("/dev/iommu", O_RDWR);
...@@ -605,11 +607,18 @@ TEST_FAIL_NTH(basic_fail_nth, device) ...@@ -605,11 +607,18 @@ TEST_FAIL_NTH(basic_fail_nth, device)
fail_nth_enable(); 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; return -1;
if (_test_cmd_mock_domain_replace(self->fd, stdev_id, ioas_id2, NULL)) if (_test_cmd_mock_domain_replace(self->fd, stdev_id, ioas_id2, NULL))
return -1; return -1;
if (_test_cmd_mock_domain_replace(self->fd, stdev_id, hwpt_id, NULL))
return -1;
return 0; return 0;
} }
......
...@@ -98,6 +98,27 @@ static int _test_cmd_mock_domain_replace(int fd, __u32 stdev_id, __u32 pt_id, ...@@ -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, \ EXPECT_ERRNO(_errno, _test_cmd_mock_domain_replace(self->fd, stdev_id, \
pt_id, NULL)) 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, static int _test_cmd_create_access(int fd, unsigned int ioas_id,
__u32 *access_id, unsigned int flags) __u32 *access_id, unsigned int flags)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment