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