Skip to contentSkip to conversation

AMD IOMMU: Destroy passthru guests when IO pagetable allcation fails

PATCH New Wei Wang2 1 participant 1 message Aug 14, 2009

lore
Share & tools
lore

Wei Wang2

author
#0 lore raw

PATCH 1/1 AMD IOMMU: Destroy passthru guests when IO pagetable allcation fails

Hi,
This patch destroys passthru guests if IO pagetable allocation cannot be satisfied to prevent potential system crash. Please apply this patch to both 3.4-testing and xen-unstable.
Thanks,
Wei

AMD GmbH, Germany
Operating System Research Center

Legal Information:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34
85609 Dornach b. München

Geschäftsführer: Jochen Polster, Thomas M. McCoy, Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis München Registergericht München, HRB Nr. 43632

xen/drivers/passthrough/amd/iommu_map.c +7 -0
diff -r 71d6d6f2ecd6 xen/drivers/passthrough/amd/iommu_map.c
@@ -426,7 +426,10 @@ static u64 iommu_l2e_from_pfn(struct pag
             {
                 table = alloc_amd_iommu_pgtable();
                 if ( table == NULL )
+                {
+                    printk("AMD-Vi: Cannot allocate I/O page table\n");
                     return 0;
+                }
                 next_table_maddr = page_to_maddr(table);
                 amd_iommu_set_page_directory_entry(
                     (u32 *)pde, next_table_maddr, level - 1);
@@ -462,6 +465,7 @@ int amd_iommu_map_page(struct domain *d,
     {
         spin_unlock(&hd->mapping_lock);
         amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn);
+        domain_crash(d);
         return -EFAULT;
     }
     set_iommu_l1e_present(iommu_l2e, gfn, (u64)mfn << PAGE_SHIFT, iw, ir);
@@ -494,6 +498,7 @@ int amd_iommu_unmap_page(struct domain *
     {
         spin_unlock(&hd->mapping_lock);
         amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn);
+        domain_crash(d);
         return -EFAULT;
     }
 
@@ -535,6 +540,7 @@ int amd_iommu_reserve_domain_unity_map(
             spin_unlock(&hd->mapping_lock);
             amd_iov_error("Invalid IO pagetable entry phys_addr = %lx\n",
                           phys_addr);
+            domain_crash(domain);
             return -EFAULT;
         }
 
@@ -583,6 +589,7 @@ int amd_iommu_sync_p2m(struct domain *d)
             spin_unlock(&d->page_alloc_lock);
             spin_unlock(&hd->mapping_lock);
             amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn);
+            domain_crash(d);
             return -EFAULT;
         }
 
xen/include/asm-x86/hvm/svm/amd-iommu-proto.h +3 -1
diff -r 71d6d6f2ecd6 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
@@ -131,8 +131,10 @@ static inline struct page_info* alloc_am
     void *vaddr;
 
     pg = alloc_domheap_page(NULL, 0);
+    if ( pg == NULL )
+        return 0;
     vaddr = map_domain_page(page_to_mfn(pg));
-    if ( !vaddr )
+    if ( vaddr == NULL )
         return 0;
     memset(vaddr, 0, PAGE_SIZE);
     unmap_domain_page(vaddr);

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel