aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorChris Wright <chrisw@sous-sol.org>2010-04-02 21:27:52 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-04-26 10:47:56 -0400
commit678e83d206a8cca18afc008cc290a75eeb6a67cd (patch)
treed7a33ddd6945bc5bd6978dc5de98ccb6a9d5bd74 /arch
parent78b124998ce07bb27cf23bd6d1a7337ba22cb262 (diff)
x86/amd-iommu: enable iommu before attaching devices
commit 75f66533bc883f761a7adcab3281fe3323efbc90 upstream. Hit another kdump problem as reported by Neil Horman. When initializaing the IOMMU, we attach devices to their domains before the IOMMU is fully (re)initialized. Attaching a device will issue some important invalidations. In the context of the newly kexec'd kdump kernel, the IOMMU may have stale cached data from the original kernel. Because we do the attach too early, the invalidation commands are placed in the new command buffer before the IOMMU is updated w/ that buffer. This leaves the stale entries in the kdump context and can renders device unusable. Simply enable the IOMMU before we do the attach. Cc: Neil Horman <nhorman@tuxdriver.com> Cc: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/amd_iommu_init.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
index 9dc91b431470..883d61990623 100644
--- a/arch/x86/kernel/amd_iommu_init.c
+++ b/arch/x86/kernel/amd_iommu_init.c
@@ -1288,6 +1288,8 @@ static int __init amd_iommu_init(void)
1288 if (ret) 1288 if (ret)
1289 goto free; 1289 goto free;
1290 1290
1291 enable_iommus();
1292
1291 if (iommu_pass_through) 1293 if (iommu_pass_through)
1292 ret = amd_iommu_init_passthrough(); 1294 ret = amd_iommu_init_passthrough();
1293 else 1295 else
@@ -1300,8 +1302,6 @@ static int __init amd_iommu_init(void)
1300 1302
1301 amd_iommu_init_notifier(); 1303 amd_iommu_init_notifier();
1302 1304
1303 enable_iommus();
1304
1305 if (iommu_pass_through) 1305 if (iommu_pass_through)
1306 goto out; 1306 goto out;
1307 1307
@@ -1315,6 +1315,7 @@ out:
1315 return ret; 1315 return ret;
1316 1316
1317free: 1317free:
1318 disable_iommus();
1318 1319
1319 amd_iommu_uninit_devices(); 1320 amd_iommu_uninit_devices();
1320 1321