AMD-IOMMU: fix initialization order (after 23863:9e0259239822)
authorJan Beulich <jbeulich@suse.com>
Tue, 27 Sep 2011 15:15:09 +0000 (16:15 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 27 Sep 2011 15:15:09 +0000 (16:15 +0100)
That original patch caused alloc_ivrs_mappings() to be called too
early, so things get moved back to where they were, just converting
the single call there to a loop over all IOMMUs.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
xen/drivers/passthrough/amd/iommu_detect.c
xen/drivers/passthrough/amd/iommu_init.c
xen/include/asm-x86/amd-iommu.h

index e0e571b35ccb2963bd0a5a40272611ead1ba1a9b..7efcb0065b8d7036d3217700b9abfa1308b8ca67 100644 (file)
@@ -122,10 +122,6 @@ int __init amd_iommu_detect_one_acpi(void *ivhd)
     spin_lock_init(&iommu->lock);
 
     iommu->seg = ivhd_block->pci_segment;
-    if (alloc_ivrs_mappings(ivhd_block->pci_segment)) {
-        xfree(iommu);
-        return -ENOMEM;
-    }
     iommu->bdf = ivhd_block->header.dev_id;
     iommu->cap_offset = ivhd_block->cap_offset;
     iommu->mmio_base_phys = ivhd_block->mmio_base;
index 248a379cd4d5a795fb03a5ae7145f132e5961130..f870017d69801e54cdcdd198f7a69591f257aac5 100644 (file)
@@ -769,7 +769,7 @@ int iterate_ivrs_entries(int (*handler)(u16 seg, struct ivrs_mappings *))
     return rc;
 }
 
-int __init alloc_ivrs_mappings(u16 seg)
+static int __init alloc_ivrs_mappings(u16 seg)
 {
     struct ivrs_mappings *ivrs_mappings;
     int bdf;
@@ -882,8 +882,9 @@ int __init amd_iommu_init(void)
         goto error_out;
 
     radix_tree_init(&ivrs_maps);
-    if ( alloc_ivrs_mappings(0) != 0 )
-        goto error_out;
+    for_each_amd_iommu ( iommu )
+        if ( alloc_ivrs_mappings(iommu->seg) != 0 )
+            goto error_out;
 
     if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
         goto error_out;
index ea40310c7810b38e2c0d10d813223017d7f16bd4..5dc97c67667f164bae94dcb6b88b11b6b27b3c1e 100644 (file)
@@ -103,7 +103,6 @@ struct ivrs_mappings {
 
 extern unsigned short ivrs_bdf_entries;
 
-int alloc_ivrs_mappings(u16 seg);
 struct ivrs_mappings *get_ivrs_mappings(u16 seg);
 int iterate_ivrs_mappings(int (*)(u16 seg, struct ivrs_mappings *));
 int iterate_ivrs_entries(int (*)(u16 seg, struct ivrs_mappings *));