]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommufd/selftest: Support user_data in mock_viommu_alloc
authorNicolin Chen <nicolinc@nvidia.com>
Thu, 10 Jul 2025 05:59:00 +0000 (22:59 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 10 Jul 2025 15:38:51 +0000 (12:38 -0300)
Add a simple user_data for an input-to-output loopback test.

Link: https://patch.msgid.link/r/cae4632bb3d98a1efb3b77488fbf81814f2041c6.1752126748.git.nicolinc@nvidia.com
Reviewed-by: Pranjal Shrivastava <praan@google.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/iommufd_test.h
drivers/iommu/iommufd/selftest.c

index 1cd7e8394129802344ca051d9345a5456962d05f..fbf9ecb35a13750f8aa9f0c9374bcf6914377604 100644 (file)
@@ -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
index 0d896a89ace7523dee65d467b35457980d71f1b0..38066dfeb2e762433c07007a4aa7f1e2d788aa2e 100644 (file)
@@ -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;