There is need to get the selftest device (sobj->type == TYPE_IDEV) in
multiple places, so have a helper to for it.

Signed-off-by: Yi Liu <yi.l....@intel.com>
---
 drivers/iommu/iommufd/selftest.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
index 7fd8dc5a667f..b7e0cbb46f9f 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -831,29 +831,39 @@ static int iommufd_test_mock_domain(struct iommufd_ucmd 
*ucmd,
        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_self_test_device(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 = container_of(dev_obj, struct selftest_obj, 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_self_test_device(ucmd->ictx, device_id);
+       if (IS_ERR(sobj))
+               return PTR_ERR(sobj);
 
        rc = iommufd_device_replace(sobj->idev.idev, &pt_id);
        if (rc)
@@ -863,7 +873,7 @@ static int iommufd_test_mock_domain_replace(struct 
iommufd_ucmd *ucmd,
        rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
 
 out_dev_obj:
-       iommufd_put_object(ucmd->ictx, dev_obj);
+       iommufd_put_object(ucmd->ictx, &sobj->obj);
        return rc;
 }
 
-- 
2.34.1


Reply via email to