Skip to content

Commit

Permalink
iommu/vt-d: Don't switch off swiotlb if bounce page is used
Browse files Browse the repository at this point in the history
The bounce page implementation depends on swiotlb. Hence, don't
switch off swiotlb if the system has untrusted devices or could
potentially be hot-added with any untrusted devices.

Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
Cc: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
LuBaolu authored and joergroedel committed Sep 11, 2019
1 parent e5e04d0 commit c5a5dc4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 15 deletions.
1 change: 1 addition & 0 deletions drivers/iommu/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ config INTEL_IOMMU
select IOMMU_IOVA
select NEED_DMA_MAP_STATE
select DMAR_TABLE
select SWIOTLB
help
DMA remapping (DMAR) devices support enables independent address
translations for Direct Memory Access (DMA) from devices.
Expand Down
32 changes: 17 additions & 15 deletions drivers/iommu/intel-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -4547,22 +4547,20 @@ const struct attribute_group *intel_iommu_groups[] = {
NULL,
};

static int __init platform_optin_force_iommu(void)
static inline bool has_untrusted_dev(void)
{
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)
return true;

for_each_pci_dev(pdev) {
if (pdev->untrusted) {
has_untrusted_dev = true;
break;
}
}
return false;
}

if (!has_untrusted_dev)
static int __init platform_optin_force_iommu(void)
{
if (!dmar_platform_optin() || no_platform_optin || !has_untrusted_dev())
return 0;

if (no_iommu || dmar_disabled)
Expand All @@ -4576,9 +4574,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;
Expand Down Expand Up @@ -4718,7 +4713,14 @@ int __init intel_iommu_init(void)
up_write(&dmar_global_lock);

#if defined(CONFIG_X86) && defined(CONFIG_SWIOTLB)
swiotlb = 0;
/*
* If the system has no untrusted device or the user has decided
* to disable the bounce page mechanisms, we don't need swiotlb.
* Mark this and the pre-allocated bounce pages will be released
* later.
*/
if (!has_untrusted_dev() || intel_no_bounce)
swiotlb = 0;
#endif
dma_ops = &intel_dma_ops;

Expand Down

0 comments on commit c5a5dc4

Please sign in to comment.