Commit 0e3e0b0c authored by Nicolin Chen's avatar Nicolin Chen Committed by Jason Gunthorpe
Browse files

iommufd/selftest: Add coverage for viommu data

Extend the existing test_cmd/err_viommu_alloc helpers to accept optional
user data. And add a TEST_F for a loopback test.

Link: https://patch.msgid.link/r/8ceb64d30e9953f29270a7d341032ca439317271.1752126748.git.nicolinc@nvidia.com


Reviewed-by: default avatarPranjal Shrivastava <praan@google.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent afeaf592
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -2688,7 +2688,7 @@ FIXTURE_SETUP(iommufd_viommu)

		/* Allocate a vIOMMU taking refcount of the parent hwpt */
		test_cmd_viommu_alloc(self->device_id, self->hwpt_id,
				      IOMMU_VIOMMU_TYPE_SELFTEST,
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
				      &self->viommu_id);

		/* Allocate a regular nested hwpt */
@@ -2727,24 +2727,27 @@ TEST_F(iommufd_viommu, viommu_negative_tests)
	if (self->device_id) {
		/* Negative test -- invalid hwpt (hwpt_id=0) */
		test_err_viommu_alloc(ENOENT, device_id, 0,
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
				      NULL);

		/* Negative test -- not a nesting parent hwpt */
		test_cmd_hwpt_alloc(device_id, ioas_id, 0, &hwpt_id);
		test_err_viommu_alloc(EINVAL, device_id, hwpt_id,
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
				      NULL);
		test_ioctl_destroy(hwpt_id);

		/* Negative test -- unsupported viommu type */
		test_err_viommu_alloc(EOPNOTSUPP, device_id, self->hwpt_id,
				      0xdead, NULL);
				      0xdead, NULL, 0, NULL);
		EXPECT_ERRNO(EBUSY,
			     _test_ioctl_destroy(self->fd, self->hwpt_id));
		EXPECT_ERRNO(EBUSY,
			     _test_ioctl_destroy(self->fd, self->viommu_id));
	} else {
		test_err_viommu_alloc(ENOENT, self->device_id, self->hwpt_id,
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
				      IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
				      NULL);
	}
}

@@ -2791,6 +2794,21 @@ TEST_F(iommufd_viommu, viommu_alloc_nested_iopf)
	}
}

TEST_F(iommufd_viommu, viommu_alloc_with_data)
{
	struct iommu_viommu_selftest data = {
		.in_data = 0xbeef,
	};

	if (!self->device_id)
		SKIP(return, "Skipping test for variant no_viommu");

	test_cmd_viommu_alloc(self->device_id, self->hwpt_id,
			      IOMMU_VIOMMU_TYPE_SELFTEST, &data, sizeof(data),
			      &self->viommu_id);
	ASSERT_EQ(data.out_data, data.in_data);
}

TEST_F(iommufd_viommu, vdevice_alloc)
{
	uint32_t viommu_id = self->viommu_id;
@@ -3105,8 +3123,7 @@ TEST_F(iommufd_device_pasid, pasid_attach)

	/* Allocate a regular nested hwpt based on viommu */
	test_cmd_viommu_alloc(self->device_id, parent_hwpt_id,
			      IOMMU_VIOMMU_TYPE_SELFTEST,
			      &viommu_id);
			      IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0, &viommu_id);
	test_cmd_hwpt_alloc_nested(self->device_id, viommu_id,
				   IOMMU_HWPT_ALLOC_PASID,
				   &nested_hwpt_id[2],
+3 −2
Original line number Diff line number Diff line
@@ -688,8 +688,9 @@ TEST_FAIL_NTH(basic_fail_nth, device)
				 IOMMU_HWPT_DATA_NONE, 0, 0))
		return -1;

	if (_test_cmd_viommu_alloc(self->fd, idev_id, hwpt_id,
				   IOMMU_VIOMMU_TYPE_SELFTEST, 0, &viommu_id))
	if (_test_cmd_viommu_alloc(self->fd, idev_id, hwpt_id, 0,
				   IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
				   &viommu_id))
		return -1;

	if (_test_cmd_vdevice_alloc(self->fd, viommu_id, idev_id, 0, &vdev_id))
+13 −8
Original line number Diff line number Diff line
@@ -897,7 +897,8 @@ static int _test_cmd_trigger_iopf(int fd, __u32 device_id, __u32 pasid,
					    pasid, fault_fd))

static int _test_cmd_viommu_alloc(int fd, __u32 device_id, __u32 hwpt_id,
				  __u32 type, __u32 flags, __u32 *viommu_id)
				  __u32 flags, __u32 type, void *data,
				  __u32 data_len, __u32 *viommu_id)
{
	struct iommu_viommu_alloc cmd = {
		.size = sizeof(cmd),
@@ -905,6 +906,8 @@ static int _test_cmd_viommu_alloc(int fd, __u32 device_id, __u32 hwpt_id,
		.type = type,
		.dev_id = device_id,
		.hwpt_id = hwpt_id,
		.data_uptr = (uint64_t)data,
		.data_len = data_len,
	};
	int ret;

@@ -916,13 +919,15 @@ static int _test_cmd_viommu_alloc(int fd, __u32 device_id, __u32 hwpt_id,
	return 0;
}

#define test_cmd_viommu_alloc(device_id, hwpt_id, type, viommu_id)        \
	ASSERT_EQ(0, _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, \
					    type, 0, viommu_id))
#define test_err_viommu_alloc(_errno, device_id, hwpt_id, type, viommu_id) \
#define test_cmd_viommu_alloc(device_id, hwpt_id, type, data, data_len,      \
			      viommu_id)                                     \
	ASSERT_EQ(0, _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, 0, \
					    type, data, data_len, viommu_id))
#define test_err_viommu_alloc(_errno, device_id, hwpt_id, type, data,        \
			      data_len, viommu_id)                           \
	EXPECT_ERRNO(_errno,                                                 \
		     _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id,  \
					    type, 0, viommu_id))
		     _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, 0, \
					    type, data, data_len, viommu_id))

static int _test_cmd_vdevice_alloc(int fd, __u32 viommu_id, __u32 idev_id,
				   __u64 virt_id, __u32 *vdev_id)