amd iommu: reduce io page level for hvm guest
PATCH 1/3 amd iommu: reduce io page level for hvm guest
Keir,
These 3 patches optimize and cleanup amd iommu codes for 4.1. If not too late please add them into the release.
Thanks,
Wei
1.Since in most case, 2 or 3 - level IO page tables are sufficient, this patch updates page table level for device assignment to reduces overhead of dma translation
2. Clean up amd_iommu_reserve_domain_unity_map function to reduce code duplication.
3. Clean up invalidate_iommu_page function. Make it suitable for variable page sizes and can be reused by invalidate_all_iommu_pages.
--
Advanced Micro Devices GmbH
Sitz: Dornach, Gemeinde Aschheim,
Landkreis München Registergericht München,
HRB Nr. 43632
WEEE-Reg-Nr: DE 12919551
Geschäftsführer:
Alberto Bozzo, Andrew Bowd
xen/drivers/passthrough/amd/iommu_map.c +8 -4
@@ -411,10 +411,14 @@ static u64 iommu_l2e_from_pfn(struct pagvoid *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 )));
xen/drivers/passthrough/amd/pci_amd_iommu.c +5 -4
@@ -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 domaistruct 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 domailist_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",
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel