> From: Jason Gunthorpe <j...@nvidia.com>
> Sent: Friday, May 6, 2022 12:16 AM
> 
> Call iommu_group_do_attach_device() only from
> __iommu_group_attach_domain() which should be used to attach any
> domain to
> the group.
> 
> The only unique thing __iommu_attach_group() does is to check if the group
> is already attached to some caller specified group. Put this test into
> __iommu_group_is_core_domain(), matching the
> __iommu_group_attach_core_domain() nomenclature.
> 
> Change the two callers to directly call __iommu_group_attach_domain() and
> test __iommu_group_is_core_domain().
> 
> iommu_attach_device() should trigger a WARN_ON if the group is attached
> as
> the caller is using the function wrong.
> 
> Suggested-by: "Tian, Kevin" <kevin.t...@intel.com>
> Signed-off-by: Jason Gunthorpe <j...@nvidia.com>

Reviewed-by: Kevin Tian <kevin.t...@intel.com>

> ---
>  drivers/iommu/iommu.c | 42 +++++++++++++++++++-----------------------
>  1 file changed, 19 insertions(+), 23 deletions(-)
> 
> This goes after "iommu: iommu_group_claim_dma_owner() must always
> assign a
> domain" and simplifies some of the remaining duplication.
> 
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index c1bdec807ea381..09d00be887f924 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -81,9 +81,10 @@ static struct iommu_domain
> *__iommu_domain_alloc(struct bus_type *bus,
>                                                unsigned type);
>  static int __iommu_attach_device(struct iommu_domain *domain,
>                                struct device *dev);
> -static int __iommu_attach_group(struct iommu_domain *domain,
> -                             struct iommu_group *group);
> +static int __iommu_group_attach_domain(struct iommu_group *group,
> +                                    struct iommu_domain *new_domain);
>  static void __iommu_group_attach_core_domain(struct iommu_group
> *group);
> +static bool __iommu_group_is_core_domain(struct iommu_group *group);
>  static int iommu_create_device_direct_mappings(struct iommu_group
> *group,
>                                              struct device *dev);
>  static struct iommu_group *iommu_group_get_for_dev(struct device *dev);
> @@ -1938,10 +1939,11 @@ int iommu_attach_device(struct iommu_domain
> *domain, struct device *dev)
>        */
>       mutex_lock(&group->mutex);
>       ret = -EINVAL;
> -     if (iommu_group_device_count(group) != 1)
> +     if (iommu_group_device_count(group) != 1 ||
> +         WARN_ON(!__iommu_group_is_core_domain(group)))
>               goto out_unlock;
> 
> -     ret = __iommu_attach_group(domain, group);
> +     ret = __iommu_group_attach_domain(group, domain);
> 
>  out_unlock:
>       mutex_unlock(&group->mutex);
> @@ -2032,31 +2034,19 @@ static int iommu_group_do_attach_device(struct
> device *dev, void *data)
>       return __iommu_attach_device(domain, dev);
>  }
> 
> -static int __iommu_attach_group(struct iommu_domain *domain,
> -                             struct iommu_group *group)
> -{
> -     int ret;
> -
> -     if (group->domain && group->domain != group->default_domain &&
> -         group->domain != group->blocking_domain)
> -             return -EBUSY;
> -
> -     ret = __iommu_group_for_each_dev(group, domain,
> -                                      iommu_group_do_attach_device);
> -     if (ret == 0)
> -             group->domain = domain;
> -
> -     return ret;
> -}
> -
>  int iommu_attach_group(struct iommu_domain *domain, struct
> iommu_group *group)
>  {
>       int ret;
> 
>       mutex_lock(&group->mutex);
> -     ret = __iommu_attach_group(domain, group);
> -     mutex_unlock(&group->mutex);
> +     if (!__iommu_group_is_core_domain(group)) {
> +             ret = -EBUSY;
> +             goto out_unlock;
> +     }
> 
> +     ret = __iommu_group_attach_domain(group, domain);
> +out_unlock:
> +     mutex_unlock(&group->mutex);
>       return ret;
>  }
>  EXPORT_SYMBOL_GPL(iommu_attach_group);
> @@ -2110,6 +2100,12 @@ static int __iommu_group_attach_domain(struct
> iommu_group *group,
>       return 0;
>  }
> 
> +static bool __iommu_group_is_core_domain(struct iommu_group *group)
> +{
> +     return !group->domain || group->domain == group-
> >default_domain ||
> +            group->domain == group->blocking_domain;
> +}
> +
>  /*
>   * Put the group's domain back to the appropriate core-owned domain -
> either the
>   * standard kernel-mode DMA configuration or an all-DMA-blocked domain.
> 
> base-commit: f9169ee95787fe691287eeed1a1c269ea72c8fb4
> --
> 2.36.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to