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 <[email protected]> Cc: Jacob Pan <[email protected]> Cc: Kevin Tian <[email protected]> Cc: Mika Westerberg <[email protected]> Signed-off-by: Lu Baolu <[email protected]> --- 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 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
