diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-07-29 10:41:41 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-07-29 10:41:41 +0100 |
commit | ef5cb4e6a0c2d204ae7ff3919d6515aa7889fb2a (patch) | |
tree | 3ebd7dbc7ffea260a946145f84d85bd58f7abca7 | |
parent | 06efa7c66478852d5b3d135a2b2cbf1e2c4020c9 (diff) | |
download | xen-ef5cb4e6a0c2d204ae7ff3919d6515aa7889fb2a.tar.gz xen-ef5cb4e6a0c2d204ae7ff3919d6515aa7889fb2a.tar.bz2 xen-ef5cb4e6a0c2d204ae7ff3919d6515aa7889fb2a.zip |
vtd: Fix some dmar bugs
In acpi_parse_one_drhd(), remove return directly when only one
INCLUDE_ALL check fails, so that avoid memory leak. In addition,
remove "dmaru->scope.devices_cnt == 0 && !dmaru->include_all" check,
due to PCI-PCI bridges are not counted.
This patch fixes bug #1307.
Signed-off-by: Weidong Han <weidong.han@intel.com>
-rw-r--r-- | xen/drivers/passthrough/vtd/dmar.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/vtd/dmar.c index eb73a04ce5..4b83510131 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -238,15 +238,15 @@ static int __init acpi_parse_dev_scope(void *start, void *end, bus = pci_conf_read8(bus, path->dev, path->fn, PCI_SECONDARY_BUS); path++; } - + switch ( acpi_scope->dev_type ) { case ACPI_DEV_P2PBRIDGE: { sec_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SECONDARY_BUS); + bus, path->dev, path->fn, PCI_SECONDARY_BUS); sub_bus = pci_conf_read8( - bus, path->dev, path->fn, PCI_SUBORDINATE_BUS); + bus, path->dev, path->fn, PCI_SUBORDINATE_BUS); dprintk(XENLOG_INFO VTDPREFIX, "found bridge: bdf = %x:%x.%x sec = %x sub = %x\n", bus, path->dev, path->fn, sec_bus, sub_bus); @@ -328,13 +328,13 @@ acpi_parse_one_drhd(struct acpi_dmar_entry_header *header) if ( include_all ) { dprintk(XENLOG_WARNING VTDPREFIX, - "Onlyu onw INCLUDE_ALL device scope is allowed\n"); - return -EINVAL; + "Only one INCLUDE_ALL device scope is allowed\n"); + ret = -EINVAL; } include_all = 1; } - if ( ret || (dmaru->scope.devices_cnt == 0 && !dmaru->include_all) ) + if ( ret ) xfree(dmaru); else acpi_register_drhd_unit(dmaru); @@ -396,7 +396,8 @@ acpi_parse_one_atsr(struct acpi_dmar_entry_header *header) ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end, atsru, ATSR_TYPE); } - else { + else + { dprintk(XENLOG_INFO VTDPREFIX, "found ALL_PORTS\n"); /* Only allow one ALL_PORTS */ if ( all_ports ) |