aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-07-08 12:35:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-07-08 12:35:23 -0400
commitb89c44bb233b51c3f03eaff22802a70036edf7cd (patch)
tree7fd2d7e4fd1943366e3060d282a02b0dbb30747d
parentcfae7e3eb1334ff8035bb66f307f3d4010e65646 (diff)
parent522e5cb76d0663c88f96b6a8301451c8efa37207 (diff)
Merge tag 'iommu-fixes-v4.7-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu
Pull IOMMU fixes from Joerg Roedel: "Two Fixes: - Intel VT-d fix for a suspend/resume issue, introduced with the scalability improvements in this cycle. - AMD IOMMU fix for systems that have unity mappings defined. There was a race where translation got enabled before the unity mappings were in place. This issue was seen on some HP servers" * tag 'iommu-fixes-v4.7-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: iommu/amd: Fix unity mapping initialization race iommu/vt-d: Fix infinite loop in free_all_cpu_cached_iovas
-rw-r--r--drivers/iommu/amd_iommu_init.c14
-rw-r--r--drivers/iommu/intel-iommu.c4
2 files changed, 14 insertions, 4 deletions
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index d091defc3426..59741ead7e15 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -1568,13 +1568,23 @@ static int __init amd_iommu_init_pci(void)
1568 break; 1568 break;
1569 } 1569 }
1570 1570
1571 /*
1572 * Order is important here to make sure any unity map requirements are
1573 * fulfilled. The unity mappings are created and written to the device
1574 * table during the amd_iommu_init_api() call.
1575 *
1576 * After that we call init_device_table_dma() to make sure any
1577 * uninitialized DTE will block DMA, and in the end we flush the caches
1578 * of all IOMMUs to make sure the changes to the device table are
1579 * active.
1580 */
1581 ret = amd_iommu_init_api();
1582
1571 init_device_table_dma(); 1583 init_device_table_dma();
1572 1584
1573 for_each_iommu(iommu) 1585 for_each_iommu(iommu)
1574 iommu_flush_all_caches(iommu); 1586 iommu_flush_all_caches(iommu);
1575 1587
1576 ret = amd_iommu_init_api();
1577
1578 if (!ret) 1588 if (!ret)
1579 print_iommu_info(); 1589 print_iommu_info();
1580 1590
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index cfe410eedaf0..323dac9900ba 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -4602,13 +4602,13 @@ static void free_all_cpu_cached_iovas(unsigned int cpu)
4602 for (i = 0; i < g_num_of_iommus; i++) { 4602 for (i = 0; i < g_num_of_iommus; i++) {
4603 struct intel_iommu *iommu = g_iommus[i]; 4603 struct intel_iommu *iommu = g_iommus[i];
4604 struct dmar_domain *domain; 4604 struct dmar_domain *domain;
4605 u16 did; 4605 int did;
4606 4606
4607 if (!iommu) 4607 if (!iommu)
4608 continue; 4608 continue;
4609 4609
4610 for (did = 0; did < cap_ndoms(iommu->cap); did++) { 4610 for (did = 0; did < cap_ndoms(iommu->cap); did++) {
4611 domain = get_iommu_domain(iommu, did); 4611 domain = get_iommu_domain(iommu, (u16)did);
4612 4612
4613 if (!domain) 4613 if (!domain)
4614 continue; 4614 continue;