x86/amd-iommu: Fix initialization failure panic
authorJoerg Roedel <joerg.roedel@amd.com>
Mon, 21 Dec 2009 14:51:23 +0000 (15:51 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 6 Jan 2010 23:03:57 +0000 (15:03 -0800)
commit 0f764806438d5576ac58898332e5dcf30bb8a679 upstream.

The assumption that acpi_table_parse passes the return value
of the hanlder function to the caller proved wrong
recently. The return value of the handler function is
totally ignored. This makes the initialization code for AMD
IOMMU buggy in a way that could cause a kernel panic on
initialization. This patch fixes the issue in the AMD IOMMU
driver.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/amd_iommu_init.c

index e0b3130a1286eea1c64e79c2ac113dbb17cfd5ff..c8243f04e62d6116fc662d30498017c0982b3d41 100644 (file)
@@ -135,6 +135,11 @@ bool amd_iommu_unmap_flush;                /* if true, flush on every unmap */
 LIST_HEAD(amd_iommu_list);             /* list of all AMD IOMMUs in the
                                           system */
 
+/*
+ * Set to true if ACPI table parsing and hardware intialization went properly
+ */
+static bool amd_iommu_initialized;
+
 /*
  * Pointer to the device table which is shared by all AMD IOMMUs
  * it is indexed by the PCI device id or the HT unit id and contains
@@ -913,6 +918,8 @@ static int __init init_iommu_all(struct acpi_table_header *table)
        }
        WARN_ON(p != end);
 
+       amd_iommu_initialized = true;
+
        return 0;
 }
 
@@ -1263,6 +1270,9 @@ int __init amd_iommu_init(void)
        if (acpi_table_parse("IVRS", init_iommu_all) != 0)
                goto free;
 
+       if (!amd_iommu_initialized)
+               goto free;
+
        if (acpi_table_parse("IVRS", init_memory_definitions) != 0)
                goto free;