Hi Baolu, > -----Original Message----- > From: Lu Baolu [mailto:baolu.lu@xxxxxxxxxxxxxxx] > Sent: Friday, April 2, 2021 12:44 PM > To: Longpeng (Mike, Cloud Infrastructure Service Product Dept.) > <longpeng2@xxxxxxxxxx>; iommu@xxxxxxxxxxxxxxxxxxxxxxxxxx; > linux-kernel@xxxxxxxxxxxxxxx > Cc: baolu.lu@xxxxxxxxxxxxxxx; David Woodhouse <dwmw2@xxxxxxxxxxxxx>; Nadav > Amit <nadav.amit@xxxxxxxxx>; Alex Williamson <alex.williamson@xxxxxxxxxx>; > Kevin Tian <kevin.tian@xxxxxxxxx>; Gonglei (Arei) <arei.gonglei@xxxxxxxxxx>; > stable@xxxxxxxxxxxxxxx > 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