Hi Baolu, > -----Original Message----- > From: Lu Baolu [mailto:baolu...@linux.intel.com] > Sent: Friday, April 2, 2021 12:44 PM > To: Longpeng (Mike, Cloud Infrastructure Service Product Dept.) > <longpe...@huawei.com>; io...@lists.linux-foundation.org; > linux-kernel@vger.kernel.org > Cc: baolu...@linux.intel.com; David Woodhouse <dw...@infradead.org>; Nadav > Amit <nadav.a...@gmail.com>; Alex Williamson <alex.william...@redhat.com>; > Kevin Tian <kevin.t...@intel.com>; Gonglei (Arei) <arei.gong...@huawei.com>; > sta...@vger.kernel.org > Subject: Re: [PATCH] iommu/vt-d: Force to flush iotlb before creating > superpage > > Hi Longpeng, > > On 4/1/21 3:18 PM, Longpeng(Mike) wrote: > > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > > index ee09323..cbcb434 100644 > > --- a/drivers/iommu/intel/iommu.c > > +++ b/drivers/iommu/intel/iommu.c > > @@ -2342,9 +2342,20 @@ static inline int hardware_largepage_caps(struct > dmar_domain *domain, > > * removed to make room for superpage(s). > > * We're adding new large pages, so make sure > > * we don't remove their parent tables. > > + * > > + * We also need to flush the iotlb before > > creating > > + * superpage to ensure it does not perserves any > > + * obsolete info. > > */ > > - dma_pte_free_pagetable(domain, iov_pfn, end_pfn, > > - largepage_lvl + 1); > > + if (dma_pte_present(pte)) { > > The dma_pte_free_pagetable() clears a batch of PTEs. So checking current PTE > is > insufficient. How about removing this check and always performing cache > invalidation? >
Um...the PTE here may be present( e.g. 4K mapping --> superpage mapping ) or NOT-present ( e.g. create a totally new superpage mapping ), but we only need to call free_pagetable and flush_iotlb in the former case, right ? > > + int i; > > + > > + dma_pte_free_pagetable(domain, iov_pfn, > > end_pfn, > > + largepage_lvl + > > 1); > > + for_each_domain_iommu(i, domain) > > + > > iommu_flush_iotlb_psi(g_iommus[i], domain, > > + iov_pfn, > > nr_pages, 0, 0); > > + > > Best regards, > baolu