]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommufd/selftest: Add a helper to get test device
authorYi Liu <yi.l.liu@intel.com>
Fri, 21 Mar 2025 17:19:38 +0000 (10:19 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 25 Mar 2025 13:18:31 +0000 (10:18 -0300)
There is need to get the selftest device (sobj->type == TYPE_IDEV) in
multiple places, so have a helper to for it.

Link: https://patch.msgid.link/r/20250321171940.7213-17-yi.l.liu@intel.com
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/selftest.c

index aa3da0adc4e12364833191c75fb406e125741983..04a4b84f5fa1b1401e4e6a5511776719b8d26371 100644 (file)
@@ -996,39 +996,49 @@ out_sobj:
        return rc;
 }
 
-/* Replace the mock domain with a manually allocated hw_pagetable */
-static int iommufd_test_mock_domain_replace(struct iommufd_ucmd *ucmd,
-                                           unsigned int device_id, u32 pt_id,
-                                           struct iommu_test_cmd *cmd)
+static struct selftest_obj *
+iommufd_test_get_selftest_obj(struct iommufd_ctx *ictx, u32 id)
 {
        struct iommufd_object *dev_obj;
        struct selftest_obj *sobj;
-       int rc;
 
        /*
         * Prefer to use the OBJ_SELFTEST because the destroy_rwsem will ensure
         * it doesn't race with detach, which is not allowed.
         */
-       dev_obj =
-               iommufd_get_object(ucmd->ictx, device_id, IOMMUFD_OBJ_SELFTEST);
+       dev_obj = iommufd_get_object(ictx, id, IOMMUFD_OBJ_SELFTEST);
        if (IS_ERR(dev_obj))
-               return PTR_ERR(dev_obj);
+               return ERR_CAST(dev_obj);
 
        sobj = to_selftest_obj(dev_obj);
        if (sobj->type != TYPE_IDEV) {
-               rc = -EINVAL;
-               goto out_dev_obj;
+               iommufd_put_object(ictx, dev_obj);
+               return ERR_PTR(-EINVAL);
        }
+       return sobj;
+}
+
+/* Replace the mock domain with a manually allocated hw_pagetable */
+static int iommufd_test_mock_domain_replace(struct iommufd_ucmd *ucmd,
+                                           unsigned int device_id, u32 pt_id,
+                                           struct iommu_test_cmd *cmd)
+{
+       struct selftest_obj *sobj;
+       int rc;
+
+       sobj = iommufd_test_get_selftest_obj(ucmd->ictx, device_id);
+       if (IS_ERR(sobj))
+               return PTR_ERR(sobj);
 
        rc = iommufd_device_replace(sobj->idev.idev, IOMMU_NO_PASID, &pt_id);
        if (rc)
-               goto out_dev_obj;
+               goto out_sobj;
 
        cmd->mock_domain_replace.pt_id = pt_id;
        rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
 
-out_dev_obj:
-       iommufd_put_object(ucmd->ictx, dev_obj);
+out_sobj:
+       iommufd_put_object(ucmd->ictx, &sobj->obj);
        return rc;
 }