diff options
author | Lu Baolu <baolu.lu@linux.intel.com> | 2019-04-12 00:26:13 -0400 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2019-04-12 07:02:42 -0400 |
commit | f7b0c4ce8cb3c09cb3cbfc0c663268bf99e5fa9c (patch) | |
tree | 4817c10480458ebb352f30cc5158c3a235c4bfa2 | |
parent | be068fa236c3d697c77f02f3dc9cd7afeb0538a6 (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.c | 6 |
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 */ |