# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1238496073 -3600
# Node ID 80ecfc3d6a8efb824729657fa9a55e7f0a9b447b
# Parent 9202d800b06f3e10802fa357f195ac2067bf1e5d
vtd: fix iommu vector leak
When we do Dom0 S3 for many times, iommu_set_interrupt() would fail
during S3 resume because it can't obtain vector. We should not request
new vector for every Dom0 S3 resume. We should re-use the same vector.
Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>
---
xen/drivers/passthrough/vtd/iommu.c | 17 +++++++++++------
xen/include/xen/iommu.h | 2 +-
2 files changed, 12 insertions(+), 7 deletions(-)
diff -r 9202d800b06f -r 80ecfc3d6a8e xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c Tue Mar 31 11:40:28 2009 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c Tue Mar 31 11:41:13 2009 +0100
@@ -911,6 +911,8 @@ static int iommu_alloc(struct acpi_drhd_
return -ENOMEM;
memset(iommu, 0, sizeof(struct iommu));
+ iommu->vector = -1; /* No vector assigned yet. */
+
iommu->intel = alloc_intel_iommu();
if ( iommu->intel == NULL )
{
@@ -1666,15 +1668,18 @@ static int init_vtd_hw(void)
return -EIO;
}
- vector = iommu_set_interrupt(iommu);
- if ( vector < 0 )
+ if ( iommu->vector < 0 )
{
- gdprintk(XENLOG_ERR VTDPREFIX, "IOMMU: interrupt setup failed\n");
- return vector;
+ vector = iommu_set_interrupt(iommu);
+ if ( vector < 0 )
+ {
+ gdprintk(XENLOG_ERR VTDPREFIX, "IOMMU: interrupt setup
failed\n");
+ return vector;
+ }
+ iommu->vector = vector;
}
- dma_msi_data_init(iommu, vector);
+ dma_msi_data_init(iommu, iommu->vector);
dma_msi_addr_init(iommu, cpu_physical_id(first_cpu(cpu_online_map)));
- iommu->vector = vector;
clear_fault_bits(iommu);
dmar_writel(iommu->reg, DMAR_FECTL_REG, 0);
diff -r 9202d800b06f -r 80ecfc3d6a8e xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h Tue Mar 31 11:40:28 2009 +0100
+++ b/xen/include/xen/iommu.h Tue Mar 31 11:41:13 2009 +0100
@@ -55,7 +55,7 @@ struct iommu {
spinlock_t lock; /* protect context, domain ids */
spinlock_t register_lock; /* protect iommu register handling */
u64 root_maddr; /* root entry machine address */
- unsigned int vector;
+ int vector;
struct intel_iommu *intel;
};
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|