Messages in this thread | | | Date | Tue, 9 Apr 2024 16:27:58 +0800 | Subject | Re: [PATCH 1/2] iommu/vt-d: Avoid unnecessary device TLB flush in map path | From | Yi Liu <> |
| |
On 2024/4/7 22:42, Lu Baolu wrote: > iommu_flush_iotlb_psi() is called in map and unmap paths. The caching > mode check before device TLB invalidation will cause device TLB > invalidation always issued if IOMMU is not running in the caching mode. > This is inefficient and causes performance overhead. > > Make device TLB invalidation behavior consistent between batched mode > unmapping and strict mode unmapping. Device TLB invalidation should only > be requested in the unmap path if the IOMMU is not in caching mode. > > Fixes: bf92df30df90 ("intel-iommu: Only avoid flushing device IOTLB for domain ID 0 in caching mode") > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> > --- > drivers/iommu/intel/iommu.c | 6 +----- > 1 file changed, 1 insertion(+), 5 deletions(-) > > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > index 50eb9aed47cc..493b6a600394 100644 > --- a/drivers/iommu/intel/iommu.c > +++ b/drivers/iommu/intel/iommu.c > @@ -1501,11 +1501,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu, > else > __iommu_flush_iotlb_psi(iommu, did, pfn, pages, ih); > > - /* > - * In caching mode, changes of pages from non-present to present require > - * flush. However, device IOTLB doesn't need to be flushed in this case. > - */ > - if (!cap_caching_mode(iommu->cap) || !map) > + if (!cap_caching_mode(iommu->cap) && !map) > iommu_flush_dev_iotlb(domain, addr, mask); > } >
The existing code works but kind of confusing. The iommu_flush_iotlb_psi() helper will be called in both the map and unmap path. But device-TLB only needed to be flushed in the unmap path since there is no chance for device ATC to have cache for a non-present mapping. And only when caching mode is reported, then should the helper be called in the map path. So the fact is if caching mode is 0, the @map should always be false. If caching mode is 1, then @map can be either false or true. To be simpler, it should be enough to check @map before flushing device-TLB. no matter caching mode or not.
-- Regards, Yi Liu
| |