Currently, ghes_edac_register() is called via ghes_init() from acpi_init() at the subsys_initcall() level. However, edac_init() is also called from the subsys_initcall(), leaving the ordering ambiguous.
If ghes_edac_register() is called first, then 'mc0' ends up at: /sys/devices/mc0/, instead of the expected: /sys/devices/system/edac/mc/mc0.
So while everything seems ok, other than the unexpected sysfs location, it seems like 'edac_init()' should be called before any drivers start registering. So have 'edac_init()' called earlier via arch_initcall().
However, this moves edac_pci_clear_parity_errors() up as well. Seems like this wants to be called after pci bus scan, so keep edac_pci_clear_parity_errors() at subsys_init(). That said, it seems like pci bus scan happens at subsys_init() level, so really the parity clearing should be moved later. But that can be left as a separate patch.
Fixes: dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in apci_init()") Signed-off-by: Jason Baron jbaron@akamai.com Cc: Borislav Petkov bp@alien8.de Cc: Mauro Carvalho Chehab mchehab@kernel.org Cc: Tony Luck tony.luck@intel.com Cc: James Morse james.morse@arm.com Cc: Robert Richter rric@kernel.org Cc: "Rafael J. Wysocki" rafael.j.wysocki@intel.com Cc: Shuai Xue xueshuai@linux.alibaba.com Cc: stable@vger.kernel.org --- drivers/edac/edac_module.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/drivers/edac/edac_module.c b/drivers/edac/edac_module.c index 32a931d0cb71..407d4a5fce7a 100644 --- a/drivers/edac/edac_module.c +++ b/drivers/edac/edac_module.c @@ -109,15 +109,6 @@ static int __init edac_init(void) if (err) return err;
- /* - * Harvest and clear any boot/initialization PCI parity errors - * - * FIXME: This only clears errors logged by devices present at time of - * module initialization. We should also do an initial clear - * of each newly hotplugged device. - */ - edac_pci_clear_parity_errors(); - err = edac_mc_sysfs_init(); if (err) goto err_sysfs; @@ -157,12 +148,34 @@ static void __exit edac_exit(void) edac_subsys_exit(); }
+static void __init edac_init_clear_parity_errors(void) +{ + /* + * Harvest and clear any boot/initialization PCI parity errors + * + * FIXME: This only clears errors logged by devices present at time of + * module initialization. We should also do an initial clear + * of each newly hotplugged device. + */ + edac_pci_clear_parity_errors(); + + return 0; +} + /* * Inform the kernel of our entry and exit points + * + * ghes_edac_register() is call via acpi_init() -> ghes_init() + * at the subsys_initcall level so edac_init() must come first */ -subsys_initcall(edac_init); +arch_initcall(edac_init); module_exit(edac_exit);
+/* + * Clear parity errors after PCI subsys is initialized + */ +subsys_initcall(edac_init_clear_parity_errors); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("Doug Thompson www.softwarebitmaker.com, et al"); MODULE_DESCRIPTION("Core library routines for EDAC reporting");