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

iommufd/selftest: Add a selftest for IOMMU_HWPT_ALLOC

parent 7a467e02
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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);
+15 −0
Original line number Diff line number Diff line
@@ -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)
+10 −1
Original line number Diff line number Diff line
@@ -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;
}

+21 −0
Original line number Diff line number Diff line
@@ -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)
{