Messages in this thread Patch in this message | | | From | Lu Baolu <> | Subject | [PATCH v3 07/10] iommu/vt-d: Keep swiotlb on if bounce page is necessary | Date | Sun, 21 Apr 2019 09:17:16 +0800 |
| |
The bouce page is necessary whenever there are untrusted devices in the system. The bounce page policy depends on swiotlb, hence don't turn off swiotlb if untrusted devices exist.
Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Cc: Mika Westerberg <mika.westerberg@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> --- drivers/iommu/intel-iommu.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index af040602bd44..e4a164324bdd 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -4528,22 +4528,27 @@ const struct attribute_group *intel_iommu_groups[] = { NULL, }; -static int __init platform_optin_force_iommu(void) +static inline bool platform_has_untrusted_device(void) { + bool has_untrusted_device = false; struct pci_dev *pdev = NULL; - bool has_untrusted_dev = false; - - if (!dmar_platform_optin() || no_platform_optin) - return 0; for_each_pci_dev(pdev) { if (pdev->untrusted) { - has_untrusted_dev = true; + has_untrusted_device = true; break; } } - if (!has_untrusted_dev) + return has_untrusted_device; +} + +static int __init platform_optin_force_iommu(void) +{ + if (!dmar_platform_optin() || no_platform_optin) + return 0; + + if (!platform_has_untrusted_device()) return 0; if (no_iommu || dmar_disabled) @@ -4557,9 +4562,6 @@ static int __init platform_optin_force_iommu(void) iommu_identity_mapping |= IDENTMAP_ALL; dmar_disabled = 0; -#if defined(CONFIG_X86) && defined(CONFIG_SWIOTLB) - swiotlb = 0; -#endif no_iommu = 0; return 1; @@ -4653,7 +4655,8 @@ int __init intel_iommu_init(void) up_write(&dmar_global_lock); #if defined(CONFIG_X86) && defined(CONFIG_SWIOTLB) - swiotlb = 0; + if (!platform_has_untrusted_device()) + swiotlb = 0; #endif dma_ops = &intel_dma_ops; -- 2.17.1
| |