]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
VT-d: Fix resource leaks on error paths
authorIgor Mammedov <imammedo@redhat.com>
Mon, 16 May 2011 12:41:25 +0000 (13:41 +0100)
committerIgor Mammedov <imammedo@redhat.com>
Mon, 16 May 2011 12:41:25 +0000 (13:41 +0100)
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

xen/drivers/passthrough/vtd/intremap.c

index b9d2424d1dc4451fb790254d28ce6ae6fd1be24c..006fdd95f92502b487b3f26cd40fbc8c7ef2ffcf 100644 (file)
@@ -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;
     }