diff options
author | Igor Mammedov <imammedo@redhat.com> | 2011-05-16 13:41:25 +0100 |
---|---|---|
committer | Igor Mammedov <imammedo@redhat.com> | 2011-05-16 13:41:25 +0100 |
commit | 441ebabdbd17426eae356b82437a8c0c87bdc4dd (patch) | |
tree | 7a54a1564f9a9c31e8d54db8482a45d73643ff1c | |
parent | 6aa8e87387f01788698d9a2806bf06c5d238b5f8 (diff) | |
download | xen-441ebabdbd17426eae356b82437a8c0c87bdc4dd.tar.gz xen-441ebabdbd17426eae356b82437a8c0c87bdc4dd.tar.bz2 xen-441ebabdbd17426eae356b82437a8c0c87bdc4dd.zip |
VT-d: Fix resource leaks on error paths
On error exit from functions, maped pages should be unmapped
and acquired locks released.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Allen Kay <allen.m.kay@intel.com>
xen-unstable changeset: 23343:edcf8fc77b64
xen-unstable date: Mon May 16 13:29:24 2011 +0100
-rw-r--r-- | xen/drivers/passthrough/vtd/intremap.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c index b9d2424d1d..006fdd95f9 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -213,7 +213,8 @@ static int alloc_remap_entry(struct iommu *iommu) if ( iremap_entries ) unmap_vtd_domain_page(iremap_entries); - ir_ctrl->iremap_num++; + if ( i < IREMAP_ENTRY_NR ) + ir_ctrl->iremap_num++; return i; } @@ -249,6 +250,8 @@ static int remap_entry_to_ioapic_rte( dprintk(XENLOG_ERR VTDPREFIX, "%s: index (%d) get an empty entry!\n", __func__, index); + unmap_vtd_domain_page(iremap_entries); + spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); return -EFAULT; } @@ -284,7 +287,8 @@ static int ioapic_rte_to_remap_entry(struct iommu *iommu, if ( index < 0 ) { index = alloc_remap_entry(iommu); - apic_pin_2_ir_idx[apic][ioapic_pin] = index; + if ( index < IREMAP_ENTRY_NR ) + apic_pin_2_ir_idx[apic][ioapic_pin] = index; } if ( index > IREMAP_ENTRY_NR - 1 ) @@ -549,6 +553,8 @@ static int remap_entry_to_msi_msg( dprintk(XENLOG_ERR VTDPREFIX, "%s: index (%d) get an empty entry!\n", __func__, index); + unmap_vtd_domain_page(iremap_entries); + spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); return -EFAULT; } |