From: Wei Wang Date: Tue, 11 Sep 2012 12:03:12 +0000 (+0200) Subject: amd iommu: remove unnecessary map/unmap for l1 page tables X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~7955 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=927f83863cd7277a8c77ad40a35f018c71dc7f40;p=xen.git amd iommu: remove unnecessary map/unmap for l1 page tables Signed-off-by: Wei Wang Committed-by: Jan Beulich --- diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index 00c0dab663..4cdd491750 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -395,25 +395,27 @@ static void deallocate_next_page_table(struct page_info* pg, int level) 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); } }