aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLu Baolu <baolu.lu@linux.intel.com>2019-04-12 00:26:13 -0400
committerJoerg Roedel <jroedel@suse.de>2019-04-12 07:02:42 -0400
commitf7b0c4ce8cb3c09cb3cbfc0c663268bf99e5fa9c (patch)
tree4817c10480458ebb352f30cc5158c3a235c4bfa2
parentbe068fa236c3d697c77f02f3dc9cd7afeb0538a6 (diff)
iommu/vt-d: Flush IOTLB for untrusted device in time
By default, for performance consideration, Intel IOMMU driver won't flush IOTLB immediately after a buffer is unmapped. It schedules a thread and flushes IOTLB in a batched mode. This isn't suitable for untrusted device since it still can access the memory even if it isn't supposed to do so. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Tested-by: Xu Pengfei <pengfei.xu@intel.com> Tested-by: Mika Westerberg <mika.westerberg@intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r--drivers/iommu/intel-iommu.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 599a25809440..d93c4bd7de75 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -3729,6 +3729,7 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
3729 unsigned long iova_pfn; 3729 unsigned long iova_pfn;
3730 struct intel_iommu *iommu; 3730 struct intel_iommu *iommu;
3731 struct page *freelist; 3731 struct page *freelist;
3732 struct pci_dev *pdev = NULL;
3732 3733
3733 domain = find_domain(dev); 3734 domain = find_domain(dev);
3734 BUG_ON(!domain); 3735 BUG_ON(!domain);
@@ -3741,11 +3742,14 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
3741 start_pfn = mm_to_dma_pfn(iova_pfn); 3742 start_pfn = mm_to_dma_pfn(iova_pfn);
3742 last_pfn = start_pfn + nrpages - 1; 3743 last_pfn = start_pfn + nrpages - 1;
3743 3744
3745 if (dev_is_pci(dev))
3746 pdev = to_pci_dev(dev);
3747
3744 dev_dbg(dev, "Device unmapping: pfn %lx-%lx\n", start_pfn, last_pfn); 3748 dev_dbg(dev, "Device unmapping: pfn %lx-%lx\n", start_pfn, last_pfn);
3745 3749
3746 freelist = domain_unmap(domain, start_pfn, last_pfn); 3750 freelist = domain_unmap(domain, start_pfn, last_pfn);
3747 3751
3748 if (intel_iommu_strict) { 3752 if (intel_iommu_strict || (pdev && pdev->untrusted)) {
3749 iommu_flush_iotlb_psi(iommu, domain, start_pfn, 3753 iommu_flush_iotlb_psi(iommu, domain, start_pfn,
3750 nrpages, !freelist, 0); 3754 nrpages, !freelist, 0);
3751 /* free iova */ 3755 /* free iova */