From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Wang2 Subject: [PATCH] AMD IOMMU: Destroy passthru guests when IO pagetable allcation fails Date: Fri, 14 Aug 2009 14:49:37 +0200 Message-ID: <200908141449.37539.wei.wang2@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_h1VhKj+MzCMhsrv" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --Boundary-00=_h1VhKj+MzCMhsrv Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi, This patch destroys passthru guests if IO pagetable allocation cannot be=20 satisfied to prevent potential system crash. Please apply this patch to bot= h=20 3.4-testing and xen-unstable. Thanks, Wei Signed-off-by: Wei Wang Acked-by: Wei Huang AMD GmbH, Germany Operating System Research Center Legal Information: Advanced Micro Devices GmbH Karl-Hammerschmidt-Str. 34 85609 Dornach b. M=FCnchen Gesch=E4ftsf=FChrer: Jochen Polster, Thomas M. McCoy, Giuliano Meroni Sitz: Dornach, Gemeinde Aschheim, Landkreis M=FCnchen Registergericht M=FCnchen, HRB Nr. 43632 --Boundary-00=_h1VhKj+MzCMhsrv Content-Type: text/x-diff; charset="us-ascii"; name="iopt.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="iopt.patch" diff -r 71d6d6f2ecd6 xen/drivers/passthrough/amd/iommu_map.c --- a/xen/drivers/passthrough/amd/iommu_map.c Fri Aug 07 09:54:43 2009 +0100 +++ b/xen/drivers/passthrough/amd/iommu_map.c Wed Aug 12 13:20:21 2009 +0200 @@ -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; } diff -r 71d6d6f2ecd6 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Fri Aug 07 09:54:43 2009 +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Wed Aug 12 13:20:21 2009 +0200 @@ -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); --Boundary-00=_h1VhKj+MzCMhsrv Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_h1VhKj+MzCMhsrv--