> From: Lu Baolu <baolu...@linux.intel.com>
> Sent: Sunday, April 10, 2022 6:25 PM
> +struct iommu_sva *
> +iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, void
> *drvdata)
> +{
> +     int ret = -EINVAL;
> +     struct iommu_sva *handle;
> +     struct iommu_domain *domain;
> +     struct iommu_sva_ioas *ioas;
> +
> +     /*
> +      * TODO: Remove the drvdata parameter after kernel PASID support
> is
> +      * enabled for the idxd driver.
> +      */
> +     if (drvdata)
> +             return ERR_PTR(-EOPNOTSUPP);
> +
> +     /* Allocate mm->pasid if necessary. */
> +     ret = iommu_sva_alloc_pasid(mm, 1, (1U << dev->iommu->pasid_bits)
> - 1);
> +     if (ret)
> +             return ERR_PTR(ret);
> +
> +     mutex_lock(&iommu_sva_lock);
> +     ioas = iommu_sva_ioas_get(mm, mm->pasid);
> +     if (!ioas) {
> +             ret = -ENOMEM;

ioas can be NULL for multiple reasons, e.g. :

1) ioas->mm != mm;
2) kzalloc failure;
3) xa_store failure;

It's more sensible to return error from iommu_sva_ioas_get() directly.

> +             goto out_unlock;
> +     }
> +
> +     /* Search for an existing bond. */
> +     list_for_each_entry(handle, &ioas->bonds, node) {
> +             if (handle->dev == dev) {
> +                     refcount_inc(&handle->users);
> +                     /* No new bond, drop the counter. */
> +                     iommu_sva_ioas_put(ioas);
> +                     goto out_success;
> +             }
> +     }
> +
> +     handle = kzalloc(sizeof(*handle), GFP_KERNEL);

s/handle/bond/?

> +     if (!handle) {
> +             ret = -ENOMEM;
> +             goto out_put_ioas;
> +     }
> +
> +     /* The reference to ioas will be kept until domain free. */
> +     domain = iommu_sva_alloc_domain(dev, ioas);

Shouldn't we first try whether existing domains are compatible to this
device?

> @@ -1952,6 +1954,7 @@ EXPORT_SYMBOL_GPL(iommu_domain_alloc);
>  void iommu_domain_free(struct iommu_domain *domain)
>  {
>       iommu_put_dma_cookie(domain);
> +     iommu_sva_ioas_put(domain->sva_ioas);
>       domain->ops->free(domain);
>  }

is it good to have general iommu_domain_free() to always call a put()
function for a specific domain type? Why cannot it be done before
calling iommu_domain_free() in sva-lib.c?
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to