Skip to contentSkip to conversation

amd iommu: reduce io page level for hvm guest

PATCH In review Wei Wang2 1 participant 1 message Jan 27, 2011

lore
Share & tools
lore

Wei Wang2

author
#0 lore raw

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
diff -r 67d5b8004947 xen/drivers/passthrough/amd/iommu_map.c
@@ -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)));
xen/drivers/passthrough/amd/pci_amd_iommu.c +5 -4
diff -r 67d5b8004947 xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -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",

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel