# HG changeset patch # User Keir Fraser # Date 1234436057 0 # Node ID 32b15413749255e0cd518f25d9202759586dcb27 # Parent 94e12fa57816c26f8b76061f17c33928be202c85 vtd: move the snoop control detection out of acpi_dmar_init() where the capability value is not initialized thus we may get random value. Signed-off-by: Xin, Xiaohui Index: xen-3.3.1-testing/xen/drivers/passthrough/vtd/dmar.c =================================================================== --- xen-3.3.1-testing.orig/xen/drivers/passthrough/vtd/dmar.c +++ xen-3.3.1-testing/xen/drivers/passthrough/vtd/dmar.c @@ -509,8 +509,6 @@ static int __init acpi_parse_dmar(struct int acpi_dmar_init(void) { int rc; - struct acpi_drhd_unit *drhd; - struct iommu *iommu; rc = -ENODEV; if ( force_iommu ) @@ -527,22 +525,7 @@ int acpi_dmar_init(void) if ( list_empty(&acpi_drhd_units) ) goto fail; - /* Giving that all devices within guest use same io page table, - * enable snoop control only if all VT-d engines support it. - */ - if ( iommu_snoop ) - { - for_each_drhd_unit ( drhd ) - { - iommu = drhd->iommu; - if ( !ecap_snp_ctl(iommu->ecap) ) { - iommu_snoop = 0; - break; - } - } - } - - printk("Intel VT-d has been enabled, snoop_control=%d.\n", iommu_snoop); + printk("Intel VT-d has been enabled\n"); return 0; Index: xen-3.3.1-testing/xen/drivers/passthrough/vtd/iommu.c =================================================================== --- xen-3.3.1-testing.orig/xen/drivers/passthrough/vtd/iommu.c +++ xen-3.3.1-testing/xen/drivers/passthrough/vtd/iommu.c @@ -1813,6 +1813,24 @@ int intel_vtd_setup(void) if ( init_vtd_hw() ) goto error; + /* Giving that all devices within guest use same io page table, + * enable snoop control only if all VT-d engines support it. + */ + + if ( iommu_snoop ) + { + for_each_drhd_unit ( drhd ) + { + iommu = drhd->iommu; + if ( !ecap_snp_ctl(iommu->ecap) ) { + iommu_snoop = 0; + break; + } + } + } + + printk("Intel VT-d snoop control %sabled\n", iommu_snoop ? "en" : "dis"); + register_keyhandler('V', dump_iommu_info, "dump iommu info"); return 0; @@ -1821,6 +1839,7 @@ int intel_vtd_setup(void) for_each_drhd_unit ( drhd ) iommu_free(drhd); vtd_enabled = 0; + iommu_snoop = 0; return -ENOMEM; }