ACPI: Fix boot problem related to APEI with acpi_disabled set
authorRafael J. Wysocki <rjw@sisk.pl>
Sun, 16 Jan 2011 19:44:22 +0000 (20:44 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 16 Jan 2011 19:56:26 +0000 (11:56 -0800)
Commit 415e12b23792 ("PCI/ACPI: Request _OSC control once for each root
bridge (v3)") put the acpi_hest_init() call in acpi_pci_root_init() into
a wrong place, presumably because the author confused acpi_pci_disabled
with acpi_disabled.  Bring the code ordering in acpi_pci_root_init()
back to sanity.

Additionally, make sure that hest_disable is set when acpi_disabled is
set, which is going to prevent acpi_hest_parse(), that still may be
executed for acpi_disabled=1 through aer_acpi_firmware_first(), from
crashing because of uninitialized hest_tab.

Reported-and-tested-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/acpi/apei/hest.c
drivers/acpi/pci_root.c

index 4ee58e72b730569fc3e16d4412be078b107baf03..abda3786a5d70c4b22738b1245303dbabe2722d6 100644 (file)
@@ -201,14 +201,14 @@ void __init acpi_hest_init(void)
        int rc = -ENODEV;
        unsigned int ghes_count = 0;
 
-       if (acpi_disabled)
-               return;
-
        if (hest_disable) {
                pr_info(HEST_PFX "Table parsing disabled.\n");
                return;
        }
 
+       if (acpi_disabled)
+               goto err;
+
        status = acpi_get_table(ACPI_SIG_HEST, 0,
                                (struct acpi_table_header **)&hest_tab);
        if (status == AE_NOT_FOUND) {
index d9766797cd982721d35182882af470a3c3094e2d..85249395623baa32b556fbddeb77e4c71e6dfeac 100644 (file)
@@ -633,11 +633,11 @@ static int acpi_pci_root_remove(struct acpi_device *device, int type)
 
 static int __init acpi_pci_root_init(void)
 {
+       acpi_hest_init();
+
        if (acpi_pci_disabled)
                return 0;
 
-       acpi_hest_init();
-
        pci_acpi_crs_quirks();
        if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0)
                return -ENODEV;