Skip to content

Commit 522e5cb

Browse files
committed
iommu/amd: Fix unity mapping initialization race
There is a race condition in the AMD IOMMU init code that causes requested unity mappings to be blocked by the IOMMU for a short period of time. This results on boot failures and IO_PAGE_FAULTs on some machines. Fix this by making sure the unity mappings are installed before all other DMA is blocked. Fixes: aafd8ba ('iommu/amd: Implement add_device and remove_device') Cc: [email protected] # v4.2+ Signed-off-by: Joerg Roedel <[email protected]>
1 parent 0caa761 commit 522e5cb

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/iommu/amd_iommu_init.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,13 +1568,23 @@ static int __init amd_iommu_init_pci(void)
15681568
break;
15691569
}
15701570

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+
15711583
init_device_table_dma();
15721584

15731585
for_each_iommu(iommu)
15741586
iommu_flush_all_caches(iommu);
15751587

1576-
ret = amd_iommu_init_api();
1577-
15781588
if (!ret)
15791589
print_iommu_info();
15801590

0 commit comments

Comments
 (0)