mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
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: aafd8ba0ca
('iommu/amd: Implement add_device and remove_device')
Cc: stable@vger.kernel.org # v4.2+
Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
0caa7616a6
commit
522e5cb76d
@ -1568,13 +1568,23 @@ static int __init amd_iommu_init_pci(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Order is important here to make sure any unity map requirements are
|
||||||
|
* fulfilled. The unity mappings are created and written to the device
|
||||||
|
* table during the amd_iommu_init_api() call.
|
||||||
|
*
|
||||||
|
* After that we call init_device_table_dma() to make sure any
|
||||||
|
* uninitialized DTE will block DMA, and in the end we flush the caches
|
||||||
|
* of all IOMMUs to make sure the changes to the device table are
|
||||||
|
* active.
|
||||||
|
*/
|
||||||
|
ret = amd_iommu_init_api();
|
||||||
|
|
||||||
init_device_table_dma();
|
init_device_table_dma();
|
||||||
|
|
||||||
for_each_iommu(iommu)
|
for_each_iommu(iommu)
|
||||||
iommu_flush_all_caches(iommu);
|
iommu_flush_all_caches(iommu);
|
||||||
|
|
||||||
ret = amd_iommu_init_api();
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
print_iommu_info();
|
print_iommu_info();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user