From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Wang2 Subject: [PATCH 1/3] amd iommu: reduce io page level for hvm guest Date: Thu, 27 Jan 2011 15:30:32 +0100 Message-ID: <201101271530.33656.wei.wang2@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_JGYQN4tHK0TTXeB" Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Fraser Cc: "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org --Boundary-00=_JGYQN4tHK0TTXeB Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Keir, These 3 patches optimize and cleanup amd iommu codes for 4.1. If not too=20 late please add them into the release.=20 Thanks, Wei 1.Since in most case, 2 or 3 - level IO page tables are sufficient, this pa= tch=20 updates page table level for device assignment to reduces overhead of dma=20 translation 2. Clean up amd_iommu_reserve_domain_unity_map function to reduce code=20 duplication. 3. Clean up invalidate_iommu_page function. Make it suitable for variable p= age=20 sizes and can be reused by invalidate_all_iommu_pages. Signed-off-by: Wei Wang =2D- Advanced Micro Devices GmbH Sitz: Dornach, Gemeinde Aschheim,=20 Landkreis M=FCnchen Registergericht M=FCnchen,=20 HRB Nr. 43632 WEEE-Reg-Nr: DE 12919551 Gesch=E4ftsf=FChrer: Alberto Bozzo, Andrew Bowd --Boundary-00=_JGYQN4tHK0TTXeB Content-Type: text/x-diff; charset="iso-8859-1"; name="iommu_pgmode.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="iommu_pgmode.patch" Content-Description: iommu_pgmode.patch diff -r 67d5b8004947 xen/drivers/passthrough/amd/iommu_map.c --- a/xen/drivers/passthrough/amd/iommu_map.c Wed Jan 26 11:58:45 2011 +0000 +++ b/xen/drivers/passthrough/amd/iommu_map.c Thu Jan 27 15:11:25 2011 +0100 @@ -411,10 +411,14 @@ static u64 iommu_l2e_from_pfn(struct pag void *pde = NULL; void *table_vaddr; u64 next_table_maddr = 0; - - BUG_ON( table == NULL || level == 0 ); - - while ( level > 1 ) + unsigned int lowest = 1; + + BUG_ON( table == NULL || level < lowest ); + + if ( level == lowest ) + return page_to_maddr(table); + + while ( level > lowest ) { offset = io_pfn >> ((PTE_PER_TABLE_SHIFT * (level - IOMMU_PAGING_MODE_LEVEL_1))); diff -r 67d5b8004947 xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Wed Jan 26 11:58:45 2011 +0000 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Thu Jan 27 15:11:25 2011 +0100 @@ -190,10 +190,7 @@ static int get_paging_mode(unsigned long { int level = 1; - BUG_ON(!max_page); - - if ( entries > max_page ) - entries = max_page; + BUG_ON( !entries ); while ( entries > PTE_PER_TABLE_SIZE ) { @@ -278,6 +275,7 @@ static int reassign_device( struct domai struct pci_dev *pdev; struct amd_iommu *iommu; int bdf; + struct hvm_iommu *t = domain_hvm_iommu(target); ASSERT(spin_is_locked(&pcidevs_lock)); pdev = pci_get_pdev_by_domain(source, bus, devfn); @@ -299,6 +297,9 @@ static int reassign_device( struct domai list_move(&pdev->domain_list, &target->arch.pdev_list); pdev->domain = target; + + if ( target->max_pages > 0 ) + t->paging_mode = get_paging_mode(target->max_pages); amd_iommu_setup_domain_device(target, iommu, bdf); AMD_IOMMU_DEBUG("Re-assign %02x:%02x.%x from domain %d to domain %d\n", --Boundary-00=_JGYQN4tHK0TTXeB 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=_JGYQN4tHK0TTXeB--