Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+14 -4
+12 -2
drivers/iommu/amd_iommu_init.c
··· 1568 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 1583 init_device_table_dma(); 1572 1584 1573 1585 for_each_iommu(iommu) 1574 1586 iommu_flush_all_caches(iommu); 1575 - 1576 - ret = amd_iommu_init_api(); 1577 1587 1578 1588 if (!ret) 1579 1589 print_iommu_info();
+2 -2
drivers/iommu/intel-iommu.c
··· 4602 4602 for (i = 0; i < g_num_of_iommus; i++) { 4603 4603 struct intel_iommu *iommu = g_iommus[i]; 4604 4604 struct dmar_domain *domain; 4605 - u16 did; 4605 + int did; 4606 4606 4607 4607 if (!iommu) 4608 4608 continue; 4609 4609 4610 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 4613 if (!domain) 4614 4614 continue;