AMD IOMMU: Destroy passthru guests when IO pagetable allcation fails
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
Signed-off-by Wei Wang <[email protected]>
Acked-by Wei Huang <[email protected]>
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
@@ -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
@@ -131,8 +131,10 @@ static inline struct page_info* alloc_amvoid *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