# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1256024996 -3600
# Node ID 66fac72877aa5cd3448c9d3fe5b565a94309a12a
# Parent e744bd84ff3d65856868a081023db4dbe9df0f99
vtd: A few cleanups to avoid dereferencing NULL drhd pointers.
In most cases I simply remove the reference since it is never actually
used.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset: 20341:ea34183c5c11
xen-unstable date: Mon Oct 19 13:31:21 2009 +0100
vtd: Disable VT-d if no DRHD units are probed.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset: 20342:1c928c3566e0
xen-unstable date: Mon Oct 19 16:50:14 2009 +0100
---
xen/drivers/passthrough/iommu.c | 8 +++++---
xen/drivers/passthrough/vtd/iommu.c | 31 ++++++-------------------------
2 files changed, 11 insertions(+), 28 deletions(-)
diff -r e744bd84ff3d -r 66fac72877aa xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c Mon Oct 19 13:04:11 2009 +0100
+++ b/xen/drivers/passthrough/iommu.c Tue Oct 20 08:49:56 2009 +0100
@@ -266,9 +266,11 @@ static int iommu_setup(void)
if ( !iommu_enabled )
goto out;
- rc = iommu_hardware_setup();
-
- iommu_enabled = (rc == 0);
+ if ( iommu_enabled )
+ {
+ rc = iommu_hardware_setup();
+ iommu_enabled = (rc == 0);
+ }
out:
if ( force_iommu && !iommu_enabled )
diff -r e744bd84ff3d -r 66fac72877aa xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c Mon Oct 19 13:04:11 2009 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c Tue Oct 20 08:49:56 2009 +0100
@@ -982,11 +982,8 @@ static int intel_iommu_domain_init(struc
static int intel_iommu_domain_init(struct domain *d)
{
struct hvm_iommu *hd = domain_hvm_iommu(d);
- struct iommu *iommu = NULL;
+ struct iommu *iommu;
struct acpi_drhd_unit *drhd;
-
- drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
- iommu = drhd->iommu;
hd->agaw = width_to_agaw(DEFAULT_DOMAIN_ADDRESS_WIDTH);
@@ -1082,10 +1079,6 @@ static int domain_context_mapping_one(
spin_unlock(&hd->mapping_lock);
}
- /*
- * domain_id 0 is not valid on Intel's IOMMU, force domain_id to
- * be 1 based as required by intel's iommu hw.
- */
context_set_domain_id(context, domain);
context_set_address_width(*context, agaw);
context_set_fault_enable(*context);
@@ -1464,9 +1457,6 @@ int intel_iommu_map_page(
u64 pg_maddr;
int pte_present;
- drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
- iommu = drhd->iommu;
-
/* do nothing if dom0 and iommu supports pass thru */
if ( iommu_passthrough && (d->domain_id == 0) )
return 0;
@@ -1515,13 +1505,7 @@ int intel_iommu_map_page(
int intel_iommu_unmap_page(struct domain *d, unsigned long gfn)
{
- struct acpi_drhd_unit *drhd;
- struct iommu *iommu;
-
- drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
- iommu = drhd->iommu;
-
- /* do nothing if dom0 and iommu supports pass thru */
+ /* Do nothing if dom0 and iommu supports pass thru. */
if ( iommu_passthrough && (d->domain_id == 0) )
return 0;
@@ -1768,7 +1752,7 @@ int intel_vtd_setup(void)
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- if ( !vtd_enabled )
+ if ( !vtd_enabled || list_empty(&acpi_drhd_units) )
return -ENODEV;
platform_quirks();
@@ -1814,18 +1798,15 @@ int intel_vtd_setup(void)
P(iommu_intremap, "Interrupt Remapping");
#undef P
- /* Allocate IO page directory page for the domain. */
+ /* Allocate domain id bitmap, and set bit 0 as reserved. */
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
- iommu = drhd->iommu;
-
- /* Allocate domain id bitmap, and set bit 0 as reserved */
- domid_bitmap_size = cap_ndoms(iommu->cap);
+ domid_bitmap_size = cap_ndoms(drhd->iommu->cap);
domid_bitmap = xmalloc_array(unsigned long,
BITS_TO_LONGS(domid_bitmap_size));
if ( domid_bitmap == NULL )
goto error;
memset(domid_bitmap, 0, domid_bitmap_size / 8);
- set_bit(0, domid_bitmap);
+ __set_bit(0, domid_bitmap);
if ( init_vtd_hw() )
goto error;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|