Messages in this thread | | | Date | Thu, 19 May 2022 14:41:06 +0800 | Subject | Re: [PATCH v4 2/6] iommu: Add a helper to do PASID lookup from domain | From | Baolu Lu <> |
| |
On 2022/5/19 02:21, Jacob Pan wrote: > 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.
Do you really need this?
The IOMMU driver has maintained a device tracking list for each domain. It has been used for cache invalidation when unmap() is called against dma domain.
Best regards, baolu
> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> > --- > 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; > + } > + } > + 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
| |