Messages in this thread | | | Subject | Re: [PATCH v2 21/24] iommu/dma: Factor out flush queue init | From | Lu Baolu <> | Date | Fri, 30 Jul 2021 14:11:20 +0800 |
| |
On 7/28/21 11:58 PM, Robin Murphy wrote: > Factor out flush queue setup from the initial domain init so that we > can potentially trigger it from sysfs later on in a domain's lifetime. > > Signed-off-by: Robin Murphy <robin.murphy@arm.com> > --- > drivers/iommu/dma-iommu.c | 30 ++++++++++++++++++++---------- > include/linux/dma-iommu.h | 9 ++++++--- > 2 files changed, 26 insertions(+), 13 deletions(-) > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index 7f3968865387..304a3ec71223 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -310,6 +310,25 @@ static bool dev_is_untrusted(struct device *dev) > return dev_is_pci(dev) && to_pci_dev(dev)->untrusted; > } > > +int iommu_dma_init_fq(struct iommu_domain *domain) > +{ > + struct iommu_dma_cookie *cookie = domain->iova_cookie; > + > + if (domain->type != IOMMU_DOMAIN_DMA_FQ) > + return -EINVAL; > + if (cookie->fq_domain) > + return 0; > + > + if (init_iova_flush_queue(&cookie->iovad, iommu_dma_flush_iotlb_all, > + iommu_dma_entry_dtor)) { > + pr_warn("iova flush queue initialization failed\n"); > + domain->type = IOMMU_DOMAIN_DMA; > + return -ENODEV; > + } > + cookie->fq_domain = domain; > + return 0; > +} > + > /** > * iommu_dma_init_domain - Initialise a DMA mapping domain > * @domain: IOMMU domain previously prepared by iommu_get_dma_cookie() > @@ -362,16 +381,7 @@ static int iommu_dma_init_domain(struct iommu_domain *domain, dma_addr_t base, > } > > init_iova_domain(iovad, 1UL << order, base_pfn); > - > - if (domain->type == IOMMU_DOMAIN_DMA_FQ && !cookie->fq_domain) { > - if (init_iova_flush_queue(iovad, iommu_dma_flush_iotlb_all, > - iommu_dma_entry_dtor)) { > - pr_warn("iova flush queue initialization failed\n"); > - domain->type = IOMMU_DOMAIN_DMA; > - } else { > - cookie->fq_domain = domain; > - } > - } > + iommu_dma_init_fq(domain); > > return iova_reserve_iommu_regions(dev, domain); > } > diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h > index 758ca4694257..81ab647f1618 100644 > --- a/include/linux/dma-iommu.h > +++ b/include/linux/dma-iommu.h > @@ -20,6 +20,7 @@ void iommu_put_dma_cookie(struct iommu_domain *domain); > > /* Setup call for arch DMA mapping code */ > void iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 dma_limit); > +int iommu_dma_init_fq(struct iommu_domain *domain); > > /* The DMA API isn't _quite_ the whole story, though... */ > /* > @@ -37,9 +38,6 @@ void iommu_dma_compose_msi_msg(struct msi_desc *desc, > > void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list); > > -void iommu_dma_free_cpu_cached_iovas(unsigned int cpu, > - struct iommu_domain *domain); > - > extern bool iommu_dma_forcedac; > > #else /* CONFIG_IOMMU_DMA */ > @@ -54,6 +52,11 @@ static inline void iommu_setup_dma_ops(struct device *dev, u64 dma_base, > { > } > > +static inline int iommu_dma_init_fq(struct iommu_domain *domain) > +{ > + return -EINVAL; > +} > + > static inline int iommu_get_dma_cookie(struct iommu_domain *domain) > { > return -ENODEV; >
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Best regards, baolu
| |