Skip to content
Permalink
Browse files
ACPI: Move sdei_init and ghes_init ahead
On an ACPI system, ACPI is initialised very early from a
subsys_initcall(), while SDEI is not ready until a subsys_initcall().
More seriously, the kernel is able to handle and report errors until the
GHES is initialised by device_initcall().

Consequently, when an error occurs during the kernel booting, the
phyiscal sdei dispatcher in firmware fails to dispatch error events. All
errors that occurred before GHES initialization are missed and there is
no chance to report and find them again.

In this patch, move sdei_init and ghes_init as far ahead as possible,
right after acpi_hest_init().

Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
  • Loading branch information
axiqia authored and intel-lab-lkp committed Nov 12, 2021
1 parent 8810075 commit 4e2f35c365f1f1e296556da6409ff6ee1f6e8ec5
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 10 deletions.
@@ -1457,7 +1457,7 @@ static struct platform_driver ghes_platform_driver = {
.remove = ghes_remove,
};

static int __init ghes_init(void)
int __init ghes_init(void)
{
int rc;

@@ -1499,4 +1499,3 @@ static int __init ghes_init(void)
err:
return rc;
}
device_initcall(ghes_init);
@@ -946,6 +946,8 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
void __init acpi_pci_root_init(void)
{
acpi_hest_init();
sdei_init();
ghes_init();
if (acpi_pci_disabled)
return;

@@ -1059,7 +1059,7 @@ static bool __init sdei_present_acpi(void)
return true;
}

static int __init sdei_init(void)
int __init sdei_init(void)
{
struct platform_device *pdev;
int ret;
@@ -1080,13 +1080,6 @@ static int __init sdei_init(void)
return ret;
}

/*
* On an ACPI system SDEI needs to be ready before HEST:GHES tries to register
* its events. ACPI is initialised from a subsys_initcall(), GHES is initialised
* by device_initcall(). We want to be called in the middle.
*/
subsys_initcall_sync(sdei_init);

int sdei_event_handler(struct pt_regs *regs,
struct sdei_registered_event *arg)
{
@@ -33,6 +33,8 @@ extern bool ghes_disable;

#ifdef CONFIG_ACPI_APEI
void __init acpi_hest_init(void);
int __init sdei_init(void);
int __init ghes_init(void);
#else
static inline void acpi_hest_init(void) { return; }
#endif

0 comments on commit 4e2f35c

Please sign in to comment.