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@intel.com>
This commit is contained in:
Keir Fraser committed 2009-03-31 11:41:13 +01:00
1 parent 7fdd501f11
commit ce5ab42341
2 files changed
+12 -7

No files matched your search

+11 -6
View File
@@ -911,6 +911,8 @@ static int iommu_alloc(struct acpi_drhd_unit *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);
+1 -1
View File
@@ -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;
};
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.