> 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