[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] vtd: fix iommu vector leak
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |