On 2022/10/26 2:12, Jason Gunthorpe wrote:
+/*
- When automatically managing the domains we search for a compatible domain in
- the iopt and if one is found use it, otherwise create a new domain.
- Automatic domain selection will never pick a manually created domain.
- */
+static int iommufd_device_auto_get_domain(struct iommufd_device *idev,
struct iommufd_ioas *ioas,
unsigned int flags)
+{
- struct iommufd_hw_pagetable *hwpt;
- int rc;
- /*
* There is no differentiation when domains are allocated, so any domain
* that is willing to attach to the device is interchangeable with any
* other.
*/
- mutex_lock(&ioas->mutex);
- list_for_each_entry(hwpt, &ioas->hwpt_list, hwpt_item) {
if (!hwpt->auto_domain ||
!refcount_inc_not_zero(&hwpt->obj.users))
continue;
rc = iommufd_device_do_attach(idev, hwpt, flags);
refcount_dec(&hwpt->obj.users);
if (rc) {
/*
* FIXME: Requires the series to return EINVAL for
* incompatible domain attaches.
*/
if (rc == -EINVAL)
continue;
goto out_unlock;
}
goto out_unlock;
Can the above code be simplified as:
if (rc == -EINVAL) continue; goto out_unlock; ?
- }
- hwpt = iommufd_hw_pagetable_alloc(idev->ictx, ioas, idev->dev);
- if (IS_ERR(hwpt)) {
rc = PTR_ERR(hwpt);
goto out_unlock;
- }
- hwpt->auto_domain = true;
- rc = iommufd_device_do_attach(idev, hwpt, flags);
- if (rc)
goto out_abort;
- list_add_tail(&hwpt->hwpt_item, &ioas->hwpt_list);
- mutex_unlock(&ioas->mutex);
- iommufd_object_finalize(idev->ictx, &hwpt->obj);
- return 0;
+out_abort:
- iommufd_object_abort_and_destroy(idev->ictx, &hwpt->obj);
+out_unlock:
- mutex_unlock(&ioas->mutex);
- return rc;
+}
Best regards, baolu