From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Wang Subject: [PATCH 3 of 3] amd iommu: Remove unnecessary map/unmap for l1 page tables Date: Mon, 13 Aug 2012 17:46:07 +0200 Message-ID: <076df9db4c273e9786ea.1344872767@gran.amd.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: JBeulich@suse.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org # HG changeset patch # User Wei Wang # Date 1344872316 -7200 # Node ID 076df9db4c273e9786ea373bda092716015d9403 # Parent 273471c6dedd1e66caab7e4eede72130e4e0c00f amd iommu: Remove unnecessary map/unmap for l1 page tables Signed-off-by: Wei Wang diff -r 273471c6dedd -r 076df9db4c27 xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Mon Aug 13 17:38:33 2012 +0200 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Mon Aug 13 17:38:36 2012 +0200 @@ -394,25 +394,27 @@ static void deallocate_next_page_table(s u64 next_table_maddr; int index, next_level; + if ( level <= 1 ) + { + free_amd_iommu_pgtable(pg); + return; + } + table_vaddr = __map_domain_page(pg); - if ( level > 1 ) + for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ ) { - for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ ) + pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE); + next_table_maddr = amd_iommu_get_next_table_from_pte(pde); + next_level = iommu_next_level((u32*)pde); + + if ( (next_table_maddr != 0) && (next_level != 0) + && iommu_is_pte_present((u32*)pde) ) { - pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE); - next_table_maddr = amd_iommu_get_next_table_from_pte(pde); - - next_level = iommu_next_level((u32*)pde); - - if ( (next_table_maddr != 0) && (next_level != 0) - && iommu_is_pte_present((u32*)pde) ) - { - /* We do not support skip level yet */ - ASSERT( next_level == level - 1 ); - deallocate_next_page_table( - maddr_to_page(next_table_maddr), next_level); - } + /* We do not support skip levels yet */ + ASSERT( next_level == level - 1 ); + deallocate_next_page_table(maddr_to_page(next_table_maddr), + next_level); } }