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

iommufd/selftest: Support user_data in mock_viommu_alloc

parent 1976cdf6
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -227,6 +227,19 @@ struct iommu_hwpt_invalidate_selftest {

#define IOMMU_VIOMMU_TYPE_SELFTEST 0xdeadbeef

/**
 * struct iommu_viommu_selftest - vIOMMU data for Mock driver
 *                                (IOMMU_VIOMMU_TYPE_SELFTEST)
 * @in_data: Input random data from user space
 * @out_data: Output data (matching @in_data) to user space
 *
 * Simply set @out_data=@in_data for a loopback test
 */
struct iommu_viommu_selftest {
	__u32 in_data;
	__u32 out_data;
};

/* Should not be equal to any defined value in enum iommu_viommu_invalidate_data_type */
#define IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST 0xdeadbeef
#define IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST_INVALID 0xdadbeef
+15 −0
Original line number Diff line number Diff line
@@ -784,6 +784,21 @@ static int mock_viommu_init(struct iommufd_viommu *viommu,
{
	struct mock_iommu_device *mock_iommu = container_of(
		viommu->iommu_dev, struct mock_iommu_device, iommu_dev);
	struct iommu_viommu_selftest data;
	int rc;

	if (user_data) {
		rc = iommu_copy_struct_from_user(
			&data, user_data, IOMMU_VIOMMU_TYPE_SELFTEST, out_data);
		if (rc)
			return rc;

		data.out_data = data.in_data;
		rc = iommu_copy_struct_to_user(
			user_data, &data, IOMMU_VIOMMU_TYPE_SELFTEST, out_data);
		if (rc)
			return rc;
	}

	refcount_inc(&mock_iommu->users);
	viommu->ops = &mock_viommu_ops;