> From: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > Sent: Thursday, May 19, 2022 2:21 AM > > IOMMU group maintains a PASID array which stores the associated IOMMU > domains. This patch introduces a helper function to do domain to PASID > look up. It will be used by TLB flush and device-PASID attach verification. > > Signed-off-by: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > --- > drivers/iommu/iommu.c | 22 ++++++++++++++++++++++ > include/linux/iommu.h | 6 +++++- > 2 files changed, 27 insertions(+), 1 deletion(-) > > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c > index 00d0262a1fe9..22f44833db64 100644 > --- a/drivers/iommu/iommu.c > +++ b/drivers/iommu/iommu.c > @@ -3199,3 +3199,25 @@ struct iommu_domain > *iommu_get_domain_for_iopf(struct device *dev, > > return domain; > } > + > +ioasid_t iommu_get_pasid_from_domain(struct device *dev, struct > iommu_domain *domain) > +{ > + struct iommu_domain *tdomain; > + struct iommu_group *group; > + unsigned long index; > + ioasid_t pasid = INVALID_IOASID; > + > + group = iommu_group_get(dev); > + if (!group) > + return pasid; > + > + xa_for_each(&group->pasid_array, index, tdomain) { > + if (domain == tdomain) { > + pasid = index; > + break; > + } > + } Don't we need to acquire the group lock here? Btw the intention of this function is a bit confusing. Patch01 already stores the pasid under domain hence it's redundant to get it indirectly from xarray index. You could simply introduce a flag bit (e.g. dma_pasid_enabled) in device_domain_info and then directly use domain->dma_pasid once the flag is true. > + iommu_group_put(group); > + > + return pasid; > +} > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 36ad007084cc..c0440a4be699 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -694,7 +694,7 @@ void iommu_detach_device_pasid(struct > iommu_domain *domain, > struct device *dev, ioasid_t pasid); > struct iommu_domain * > iommu_get_domain_for_iopf(struct device *dev, ioasid_t pasid); > - > +ioasid_t iommu_get_pasid_from_domain(struct device *dev, struct > iommu_domain *domain); > #else /* CONFIG_IOMMU_API */ > > struct iommu_ops {}; > @@ -1070,6 +1070,10 @@ iommu_get_domain_for_iopf(struct device *dev, > ioasid_t pasid) > { > return NULL; > } > +static ioasid_t iommu_get_pasid_from_domain(struct device *dev, struct > iommu_domain *domain) > +{ > + return INVALID_IOASID; > +} > #endif /* CONFIG_IOMMU_API */ > > #ifdef CONFIG_IOMMU_SVA > -- > 2.25.1