mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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:
1 parent
7fdd501f11
commit
ce5ab42341
2 files changed
+12
-7
No files matched your search
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||