Messages in this thread | | | From | "Tian, Kevin" <> | Subject | RE: [PATCH 05/12] iommu/vt-d: Unncessary spinlock for root table alloc and free | Date | Wed, 1 Jun 2022 09:05:57 +0000 |
| |
> From: Lu Baolu <baolu.lu@linux.intel.com> > Sent: Friday, May 27, 2022 2:30 PM > > The IOMMU root table is allocated and freed in the IOMMU initialization > code in static boot or hot-plug paths. There's no need for a spinlock.
s/hot-plug/hot-remove/
> > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
> --- > drivers/iommu/intel/iommu.c | 18 +++++------------- > 1 file changed, 5 insertions(+), 13 deletions(-) > > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > index bbdd3417a1b1..2d5f02b85de8 100644 > --- a/drivers/iommu/intel/iommu.c > +++ b/drivers/iommu/intel/iommu.c > @@ -809,14 +809,12 @@ static int device_context_mapped(struct > intel_iommu *iommu, u8 bus, u8 devfn) > > static void free_context_table(struct intel_iommu *iommu) > { > - int i; > - unsigned long flags; > struct context_entry *context; > + int i; > + > + if (!iommu->root_entry) > + return; > > - spin_lock_irqsave(&iommu->lock, flags); > - if (!iommu->root_entry) { > - goto out; > - } > for (i = 0; i < ROOT_ENTRY_NR; i++) { > context = iommu_context_addr(iommu, i, 0, 0); > if (context) > @@ -828,12 +826,10 @@ static void free_context_table(struct intel_iommu > *iommu) > context = iommu_context_addr(iommu, i, 0x80, 0); > if (context) > free_pgtable_page(context); > - > } > + > free_pgtable_page(iommu->root_entry); > iommu->root_entry = NULL; > -out: > - spin_unlock_irqrestore(&iommu->lock, flags); > } > > #ifdef CONFIG_DMAR_DEBUG > @@ -1232,7 +1228,6 @@ static void domain_unmap(struct dmar_domain > *domain, unsigned long start_pfn, > static int iommu_alloc_root_entry(struct intel_iommu *iommu) > { > struct root_entry *root; > - unsigned long flags; > > root = (struct root_entry *)alloc_pgtable_page(iommu->node); > if (!root) { > @@ -1242,10 +1237,7 @@ static int iommu_alloc_root_entry(struct > intel_iommu *iommu) > } > > __iommu_flush_cache(iommu, root, ROOT_SIZE); > - > - spin_lock_irqsave(&iommu->lock, flags); > iommu->root_entry = root; > - spin_unlock_irqrestore(&iommu->lock, flags); > > return 0; > } > -- > 2.25.1
| |