|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] IOMMU: keep disabled until iommu_setup() is called
# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1351872930 -3600
# Node ID bd78e5630a5be55d439eb235627d52ebe8214524
# Parent cacdc787d11fb06a977002b8eac5cc77c303f285
IOMMU: keep disabled until iommu_setup() is called
The iommu is enabled by default when xen is booting and later disabled
in iommu_setup() when no iommu is present.
But under some circumstances iommu code can be called before
iommu_setup() is processed. If there is no iommu available xen crashes.
This can happen for example when panic(...) is called as introduced
with the patch "x86-64: detect processors subject to AMD erratum #121
and refuse to boot" since xen 4.1.3, resulting in
find_iommu_for_device() to be called in the context of
disable_IO_APIC() / __stop_this_cpu().
This patch fixes this by keeping the iommu disabled until iommu_setup()
is entered.
Originally-by: Ronny Hegewald <ronny.hegewald@xxxxxxxxx>
In order for iommu_enable to be off initially, iommu_supports_eim()
must not depend on it anymore, nor must acpi_parse_dmar(). The former
in turn requires that iommu_intremap gets uncoupled from iommu_enabled
(in particular, failure during IOMMU setup should no longer result in
iommu_intremap getting cleared by generic code; IOMMU specific code
can still do so provided in can live with the consequences).
This could have the nice side effect of allowing to use "iommu=off"
even when x2APIC was pre-enabled by the BIOS (in which case interrupt
remapping is a requirement, but DMA translation [obviously] isn't), but
that doesn't currently work (and hence x2apic_bsp_setup() forces the
IOMMU on rather than just interrupt remapping).
For consistency with VT-d, make the AMD IOMMU code also skip all ACPI
table parsing when neither iommu_enable nor iommu_intremap are set.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Xiantao Zhang <xiantao.zhang@xxxxxxxxx>
Acked-by: "Huang2, Wei" <Wei.Huang2@xxxxxxx>
---
diff -r cacdc787d11f -r bd78e5630a5b xen/arch/x86/apic.c
--- a/xen/arch/x86/apic.c Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/arch/x86/apic.c Fri Nov 02 17:15:30 2012 +0100
@@ -975,6 +975,8 @@ void __init x2apic_bsp_setup(void)
goto restore_out;
}
+ force_iommu = 1;
+
genapic = apic_x2apic_probe();
printk("Switched to APIC driver %s.\n", genapic->name);
diff -r cacdc787d11f -r bd78e5630a5b xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Nov 02 16:15:53
2012 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Nov 02 17:15:30
2012 +0100
@@ -164,9 +164,13 @@ int __init amd_iov_detect(void)
{
INIT_LIST_HEAD(&amd_iommu_head);
+ if ( !iommu_enable && !iommu_intremap )
+ return 0;
+
if ( (amd_iommu_detect_acpi() !=0) || (iommu_found() == 0) )
{
printk("AMD-Vi: IOMMU not found!\n");
+ iommu_intremap = 0;
return -ENODEV;
}
diff -r cacdc787d11f -r bd78e5630a5b xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/drivers/passthrough/iommu.c Fri Nov 02 17:15:30 2012 +0100
@@ -41,7 +41,8 @@ static void iommu_dump_p2m_table(unsigne
* no-intremap Disable VT-d Interrupt Remapping
*/
custom_param("iommu", parse_iommu_param);
-bool_t __read_mostly iommu_enabled = 1;
+bool_t __initdata iommu_enable = 1;
+bool_t __read_mostly iommu_enabled;
bool_t __read_mostly force_iommu;
bool_t __initdata iommu_dom0_strict;
bool_t __read_mostly iommu_verbose;
@@ -77,7 +78,7 @@ static void __init parse_iommu_param(cha
*ss = '\0';
if ( !parse_bool(s) )
- iommu_enabled = 0;
+ iommu_enable = 0;
else if ( !strcmp(s, "force") || !strcmp(s, "required") )
force_iommu = val;
else if ( !strcmp(s, "workaround_bios_bug") )
@@ -395,7 +396,7 @@ int __init iommu_setup(void)
if ( iommu_dom0_strict )
iommu_passthrough = 0;
- if ( iommu_enabled )
+ if ( iommu_enable )
{
rc = iommu_hardware_setup();
iommu_enabled = (rc == 0);
@@ -409,8 +410,6 @@ int __init iommu_setup(void)
if ( !iommu_enabled )
{
iommu_snoop = 0;
- iommu_qinval = 0;
- iommu_intremap = 0;
iommu_passthrough = 0;
iommu_dom0_strict = 0;
}
diff -r cacdc787d11f -r bd78e5630a5b xen/drivers/passthrough/vtd/dmar.c
--- a/xen/drivers/passthrough/vtd/dmar.c Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/drivers/passthrough/vtd/dmar.c Fri Nov 02 17:15:30 2012 +0100
@@ -744,7 +744,7 @@ static int __init acpi_parse_dmar(struct
dmar = (struct acpi_table_dmar *)table;
dmar_flags = dmar->flags;
- if ( !iommu_enabled )
+ if ( !iommu_enable && !iommu_intremap )
{
ret = -EINVAL;
goto out;
diff -r cacdc787d11f -r bd78e5630a5b xen/drivers/passthrough/vtd/intremap.c
--- a/xen/drivers/passthrough/vtd/intremap.c Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/drivers/passthrough/vtd/intremap.c Fri Nov 02 17:15:30 2012 +0100
@@ -149,8 +149,7 @@ int iommu_supports_eim(void)
struct acpi_drhd_unit *drhd;
int apic;
- if ( !iommu_enabled || !iommu_qinval || !iommu_intremap ||
- list_empty(&acpi_drhd_units) )
+ if ( !iommu_qinval || !iommu_intremap || list_empty(&acpi_drhd_units) )
return 0;
/* We MUST have a DRHD unit for each IOAPIC. */
diff -r cacdc787d11f -r bd78e5630a5b xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c Fri Nov 02 17:15:30 2012 +0100
@@ -2086,7 +2086,10 @@ int __init intel_vtd_setup(void)
int ret;
if ( list_empty(&acpi_drhd_units) )
- return -ENODEV;
+ {
+ ret = -ENODEV;
+ goto error;
+ }
platform_quirks_init();
diff -r cacdc787d11f -r bd78e5630a5b xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h Fri Nov 02 16:15:53 2012 +0100
+++ b/xen/include/xen/iommu.h Fri Nov 02 17:15:30 2012 +0100
@@ -26,7 +26,7 @@
#include <public/hvm/ioreq.h>
#include <public/domctl.h>
-extern bool_t iommu_enabled;
+extern bool_t iommu_enable, iommu_enabled;
extern bool_t force_iommu, iommu_verbose;
extern bool_t iommu_workaround_bios_bug, iommu_passthrough;
extern bool_t iommu_snoop, iommu_qinval, iommu_intremap;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |