Skip to content

Commit e7e6946

Browse files
Jacob Panjoergroedel
authored andcommitted
iommu/vt-d: Fix PASID devTLB invalidation
DevTLB flush can be used for both DMA request with and without PASIDs. The former uses PASID#0 (RID2PASID), latter uses non-zero PASID for SVA usage. This patch adds a check for PASID value such that devTLB flush with PASID is used for SVA case. This is more efficient in that multiple PASIDs can be used by a single device, when tearing down a PASID entry we shall flush only the devTLB specific to a PASID. Fixes: 6f7db75 ("iommu/vt-d: Add second level page table") Signed-off-by: Jacob Pan <[email protected]> Signed-off-by: Lu Baolu <[email protected]> Reviewed-by: Eric Auger <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent 78df6c8 commit e7e6946

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

drivers/iommu/intel/pasid.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,16 @@ devtlb_invalidation_with_pasid(struct intel_iommu *iommu,
486486
qdep = info->ats_qdep;
487487
pfsid = info->pfsid;
488488

489-
qi_flush_dev_iotlb(iommu, sid, pfsid, qdep, 0, 64 - VTD_PAGE_SHIFT);
489+
/*
490+
* When PASID 0 is used, it indicates RID2PASID(DMA request w/o PASID),
491+
* devTLB flush w/o PASID should be used. For non-zero PASID under
492+
* SVA usage, device could do DMA with multiple PASIDs. It is more
493+
* efficient to flush devTLB specific to the PASID.
494+
*/
495+
if (pasid == PASID_RID2PASID)
496+
qi_flush_dev_iotlb(iommu, sid, pfsid, qdep, 0, 64 - VTD_PAGE_SHIFT);
497+
else
498+
qi_flush_dev_iotlb_pasid(iommu, sid, pfsid, pasid, qdep, 0, 64 - VTD_PAGE_SHIFT);
490499
}
491500

492501
void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev,

0 commit comments

Comments
 (0)