On 2024/8/28 0:59, Nicolin Chen wrote:
+int iommufd_viommu_alloc_ioctl(struct iommufd_ucmd *ucmd)
+{
+       struct iommu_viommu_alloc *cmd = ucmd->cmd;
+       struct iommufd_hwpt_paging *hwpt_paging;
+       struct iommufd_viommu *viommu;
+       struct iommufd_device *idev;
+       int rc;
+
+       if (cmd->flags)
+               return -EOPNOTSUPP;
+
+       idev = iommufd_get_device(ucmd, cmd->dev_id);

Why does a device reference count is needed here? When is this reference
count released after the VIOMMU is allocated?

+       if (IS_ERR(idev))
+               return PTR_ERR(idev);
+
+       hwpt_paging = iommufd_get_hwpt_paging(ucmd, cmd->hwpt_id);
+       if (IS_ERR(hwpt_paging)) {
+               rc = PTR_ERR(hwpt_paging);
+               goto out_put_idev;
+       }
+
+       if (!hwpt_paging->nest_parent) {
+               rc = -EINVAL;
+               goto out_put_hwpt;
+       }
+
+       if (cmd->type != IOMMU_VIOMMU_TYPE_DEFAULT) {
+               rc = -EOPNOTSUPP;
+               goto out_put_hwpt;
+       }
+
+       viommu = iommufd_object_alloc(ucmd->ictx, viommu, IOMMUFD_OBJ_VIOMMU);
+       if (IS_ERR(viommu)) {
+               rc = PTR_ERR(viommu);
+               goto out_put_hwpt;
+       }
+
+       viommu->type = cmd->type;
+       viommu->ictx = ucmd->ictx;
+       viommu->hwpt = hwpt_paging;
+
+       refcount_inc(&viommu->hwpt->common.obj.users);
+
+       cmd->out_viommu_id = viommu->obj.id;
+       rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
+       if (rc)
+               goto out_abort;
+       iommufd_object_finalize(ucmd->ictx, &viommu->obj);
+       goto out_put_hwpt;
+
+out_abort:
+       iommufd_object_abort_and_destroy(ucmd->ictx, &viommu->obj);
+out_put_hwpt:
+       iommufd_put_object(ucmd->ictx, &hwpt_paging->common.obj);
+out_put_idev:
+       iommufd_put_object(ucmd->ictx, &idev->obj);
+       return rc;
+}

Thanks,
baolu

Reply via email to