* [PATCH v7 0/8] Make ghes_edac a proper module
@ 2022-09-29 2:37 Jia He
2022-09-29 2:37 ` [PATCH v7 1/8] efi/cper: export several helpers for ghes_edac to use Jia He
` (7 more replies)
0 siblings, 8 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Commit dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in
apci_init()") introduced a bug that ghes_edac_register() would be invoked
before edac_init(). Because at that time, the bus "edac" hasn't been even
registered, this created sysfs /devices/mc0 instead of
/sys/devices/system/edac/mc/mc0 on an Ampere eMag server.
The proper solution is to make ghes_edac a proper module.
Changelog:
v7:
- remove the ghes_edac_preferred and ghes_present (suggested by Borislav)
- adjust the patch splitting, no major functional changes
- remove the r-b tag in those changed patches
v6:https://www.spinics.net/lists/kernel/msg4511453.html
- no code changes from v5 patches
- add the reviewed and acked by from Toshi
- describe the removal of ghes_edac_force_enable checking in Patch 05
v5: https://www.spinics.net/lists/kernel/msg4502787.html
- add the review-by from Toshi for patch 04 and 06
- refine the commit msg
- remove the unconditional set of ghes_edac_force_enable on Arm
v4: https://lore.kernel.org/lkml/20220831074027.13849-6-justin.he@arm.com/
- move the kernel boot option to ghes module parameter
- collapse th ghes_present and ghes_edac_preferred into one patch
v3: https://lore.kernel.org/lkml/20220822154048.188253-1-justin.he@arm.com/
- refine the commit logs
- introduce ghes preferred and present flag (by Toshi)
- move force_load to setup parameter
- add the ghes_edac_preferred() check for x86/Arm edac drivers
v2: https://lore.kernel.org/lkml/20220817143458.335938-1-justin.he@arm.com/
- add acked-by tag of Patch 1 from Ard
- split the notifier patch
- add 2 patch to get regular drivers selected when ghes edac is not loaded
- fix an errno in igen6 driver
- add a patch to fix the sparse warning of ghes
- refine the commit logs
v1: https://lore.kernel.org/lkml/20220811091713.10427-1-justin.he@arm.com/
Jia He (8):
efi/cper: export several helpers for ghes_edac to use
EDAC/ghes: Add a notifier for reporting memory errors
EDAC:ghes: Move ghes_edac.force_load to ghes module parameter
ghes: Introduce a helper ghes_get_devices()
EDAC/ghes: Make ghes_edac a proper module to remove the dependency on
ghes
EDAC: Add the ghes_get_devices() check for chipset-specific edac
drivers
apei/ghes: Use unrcu_pointer for cmpxchg
EDAC/igen6: Return consistent errno when another edac driver is
enabled
drivers/acpi/apei/ghes.c | 70 +++++++++++++++++++++++++---
drivers/edac/Kconfig | 4 +-
drivers/edac/amd64_edac.c | 3 ++
drivers/edac/armada_xp_edac.c | 3 ++
drivers/edac/edac_module.h | 1 +
drivers/edac/ghes_edac.c | 83 ++++++++++++++++++++++------------
drivers/edac/i10nm_base.c | 3 ++
drivers/edac/igen6_edac.c | 5 +-
drivers/edac/layerscape_edac.c | 3 ++
drivers/edac/pnd2_edac.c | 3 ++
drivers/edac/sb_edac.c | 3 ++
drivers/edac/skx_base.c | 3 ++
drivers/edac/thunderx_edac.c | 3 ++
drivers/edac/xgene_edac.c | 3 ++
drivers/firmware/efi/cper.c | 3 ++
include/acpi/apei.h | 2 +
include/acpi/ghes.h | 34 ++++----------
17 files changed, 166 insertions(+), 63 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v7 1/8] efi/cper: export several helpers for ghes_edac to use
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 2/8] EDAC/ghes: Add a notifier for reporting memory errors Jia He
` (6 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Before ghes_edac can be turned back into a proper module again, export
several helpers which are going to be used by it.
Signed-off-by: Jia He <justin.he@arm.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
---
drivers/firmware/efi/cper.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
index e4e5ea7ce910..053eae13f409 100644
--- a/drivers/firmware/efi/cper.c
+++ b/drivers/firmware/efi/cper.c
@@ -290,6 +290,7 @@ int cper_mem_err_location(struct cper_mem_err_compact *mem, char *msg)
return n;
}
+EXPORT_SYMBOL_GPL(cper_mem_err_location);
int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg)
{
@@ -310,6 +311,7 @@ int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg)
return n;
}
+EXPORT_SYMBOL_GPL(cper_dimm_err_location);
void cper_mem_err_pack(const struct cper_sec_mem_err *mem,
struct cper_mem_err_compact *cmem)
@@ -331,6 +333,7 @@ void cper_mem_err_pack(const struct cper_sec_mem_err *mem,
cmem->mem_array_handle = mem->mem_array_handle;
cmem->mem_dev_handle = mem->mem_dev_handle;
}
+EXPORT_SYMBOL_GPL(cper_mem_err_pack);
const char *cper_mem_err_unpack(struct trace_seq *p,
struct cper_mem_err_compact *cmem)
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 2/8] EDAC/ghes: Add a notifier for reporting memory errors
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
2022-09-29 2:37 ` [PATCH v7 1/8] efi/cper: export several helpers for ghes_edac to use Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter Jia He
` (5 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
To make a proper module, add a notifier for reporting memory errors. Use
an atomic notifier because calls sites like ghes_proc_in_irq() run in
interrupt context.
Suggested-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Jia He <justin.he@arm.com>
---
drivers/acpi/apei/ghes.c | 16 +++++++++++++++-
drivers/edac/ghes_edac.c | 19 +++++++++++++++++--
include/acpi/ghes.h | 10 +++-------
3 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index d91ad378c00d..8cb65f757d06 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -94,6 +94,8 @@
#define FIX_APEI_GHES_SDEI_CRITICAL __end_of_fixed_addresses
#endif
+static ATOMIC_NOTIFIER_HEAD(ghes_report_chain);
+
static inline bool is_hest_type_generic_v2(struct ghes *ghes)
{
return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2;
@@ -645,7 +647,7 @@ static bool ghes_do_proc(struct ghes *ghes,
if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) {
struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
- ghes_edac_report_mem_error(sev, mem_err);
+ atomic_notifier_call_chain(&ghes_report_chain, sev, mem_err);
arch_apei_report_mem_error(sev, mem_err);
queued = ghes_handle_memory_failure(gdata, sev);
@@ -1497,3 +1499,15 @@ void __init acpi_ghes_init(void)
else
pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n");
}
+
+void ghes_register_report_chain(struct notifier_block *nb)
+{
+ atomic_notifier_chain_register(&ghes_report_chain, nb);
+}
+EXPORT_SYMBOL_GPL(ghes_register_report_chain);
+
+void ghes_unregister_report_chain(struct notifier_block *nb)
+{
+ atomic_notifier_chain_unregister(&ghes_report_chain, nb);
+}
+EXPORT_SYMBOL_GPL(ghes_unregister_report_chain);
diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c
index c8fa7dcfdbd0..7b8d56a769f6 100644
--- a/drivers/edac/ghes_edac.c
+++ b/drivers/edac/ghes_edac.c
@@ -14,6 +14,7 @@
#include <linux/dmi.h>
#include "edac_module.h"
#include <ras/ras_event.h>
+#include <linux/notifier.h>
#define OTHER_DETAIL_LEN 400
@@ -267,11 +268,14 @@ static int print_mem_error_other_detail(const struct cper_sec_mem_err *mem, char
return n;
}
-void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
+static int ghes_edac_report_mem_error(struct notifier_block *nb,
+ unsigned long val, void *data)
{
+ struct cper_sec_mem_err *mem_err = (struct cper_sec_mem_err *)data;
struct cper_mem_err_compact cmem;
struct edac_raw_error_desc *e;
struct mem_ctl_info *mci;
+ unsigned long sev = val;
struct ghes_pvt *pvt;
unsigned long flags;
char *p;
@@ -282,7 +286,7 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
* know.
*/
if (WARN_ON_ONCE(in_nmi()))
- return;
+ return NOTIFY_OK;
spin_lock_irqsave(&ghes_lock, flags);
@@ -374,8 +378,15 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
unlock:
spin_unlock_irqrestore(&ghes_lock, flags);
+
+ return NOTIFY_OK;
}
+static struct notifier_block ghes_edac_mem_err_nb = {
+ .notifier_call = ghes_edac_report_mem_error,
+ .priority = 0,
+};
+
/*
* Known systems that are safe to enable this module.
*/
@@ -503,6 +514,8 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
ghes_pvt = pvt;
spin_unlock_irqrestore(&ghes_lock, flags);
+ ghes_register_report_chain(&ghes_edac_mem_err_nb);
+
/* only set on success */
refcount_set(&ghes_refcount, 1);
@@ -548,6 +561,8 @@ void ghes_edac_unregister(struct ghes *ghes)
if (mci)
edac_mc_free(mci);
+ ghes_unregister_report_chain(&ghes_edac_mem_err_nb);
+
unlock:
mutex_unlock(&ghes_reg_mutex);
}
diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h
index 34fb3431a8f3..5cbd38b6e4e1 100644
--- a/include/acpi/ghes.h
+++ b/include/acpi/ghes.h
@@ -76,18 +76,11 @@ int ghes_estatus_pool_init(int num_ghes);
/* From drivers/edac/ghes_edac.c */
#ifdef CONFIG_EDAC_GHES
-void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err);
-
int ghes_edac_register(struct ghes *ghes, struct device *dev);
void ghes_edac_unregister(struct ghes *ghes);
#else
-static inline void ghes_edac_report_mem_error(int sev,
- struct cper_sec_mem_err *mem_err)
-{
-}
-
static inline int ghes_edac_register(struct ghes *ghes, struct device *dev)
{
return -ENODEV;
@@ -145,4 +138,7 @@ int ghes_notify_sea(void);
static inline int ghes_notify_sea(void) { return -ENOENT; }
#endif
+struct notifier_block;
+extern void ghes_register_report_chain(struct notifier_block *nb);
+extern void ghes_unregister_report_chain(struct notifier_block *nb);
#endif /* GHES_H */
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
2022-09-29 2:37 ` [PATCH v7 1/8] efi/cper: export several helpers for ghes_edac to use Jia He
2022-09-29 2:37 ` [PATCH v7 2/8] EDAC/ghes: Add a notifier for reporting memory errors Jia He
@ 2022-09-29 2:37 ` Jia He
2022-10-05 15:13 ` Borislav Petkov
2022-09-29 2:37 ` [PATCH v7 4/8] ghes: Introduce a helper ghes_get_devices() Jia He
` (4 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
ghes_edac_register() is too late to set this module flag ghes_edac.force_load.
Also, other edac drivers should not be able to control this flag.
Move this flag to the module parameter in ghes instead.
Suggested-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Jia He <justin.he@arm.com>
Reviewed-by: Toshi Kani <toshi.kani@hpe.com>
---
drivers/acpi/apei/ghes.c | 8 ++++++++
drivers/edac/ghes_edac.c | 10 +++-------
include/acpi/apei.h | 2 ++
3 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 8cb65f757d06..b0a6445c6da2 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -109,6 +109,14 @@ static inline bool is_hest_type_generic_v2(struct ghes *ghes)
bool ghes_disable;
module_param_named(disable, ghes_disable, bool, 0);
+/*
+ * "ghes.edac_force_enable" forcibly enables ghes_edac and skips the platform
+ * check.
+ */
+bool ghes_edac_force_enable;
+EXPORT_SYMBOL(ghes_edac_force_enable);
+module_param_named(edac_force_enable, ghes_edac_force_enable, bool, 0);
+
/*
* All error sources notified with HED (Hardware Error Device) share a
* single notifier callback, so they need to be linked and checked one
diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c
index 7b8d56a769f6..11a1b5e7e484 100644
--- a/drivers/edac/ghes_edac.c
+++ b/drivers/edac/ghes_edac.c
@@ -54,10 +54,6 @@ static DEFINE_MUTEX(ghes_reg_mutex);
*/
static DEFINE_SPINLOCK(ghes_lock);
-/* "ghes_edac.force_load=1" skips the platform check */
-static bool __read_mostly force_load;
-module_param(force_load, bool, 0);
-
static bool system_scanned;
/* Memory Device - Type 17 of SMBIOS spec */
@@ -408,10 +404,10 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
if (IS_ENABLED(CONFIG_X86)) {
/* Check if safe to enable on this system */
idx = acpi_match_platform_list(plat_list);
- if (!force_load && idx < 0)
+ if (!ghes_edac_force_enable && idx < 0)
return -ENODEV;
} else {
- force_load = true;
+ ghes_edac_force_enable = true;
idx = 0;
}
@@ -535,7 +531,7 @@ void ghes_edac_unregister(struct ghes *ghes)
struct mem_ctl_info *mci;
unsigned long flags;
- if (!force_load)
+ if (!ghes_edac_force_enable)
return;
mutex_lock(&ghes_reg_mutex);
diff --git a/include/acpi/apei.h b/include/acpi/apei.h
index dc60f7db5524..ab310393766e 100644
--- a/include/acpi/apei.h
+++ b/include/acpi/apei.h
@@ -27,9 +27,11 @@ extern int hest_disable;
extern int erst_disable;
#ifdef CONFIG_ACPI_APEI_GHES
extern bool ghes_disable;
+extern bool ghes_edac_force_enable;
void __init acpi_ghes_init(void);
#else
#define ghes_disable 1
+#define ghes_edac_force_enable 0
static inline void acpi_ghes_init(void) { }
#endif
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 4/8] ghes: Introduce a helper ghes_get_devices()
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
` (2 preceding siblings ...)
2022-09-29 2:37 ` [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 5/8] EDAC/ghes: Make ghes_edac a proper module to remove the dependency on ghes Jia He
` (3 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Introduce a helper ghes_get_devices(), which returns the dev list GHES
probed when the platform-check passes on the system.
Suggested-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Jia He <justin.he@arm.com>
---
drivers/acpi/apei/ghes.c | 37 +++++++++++++++++++++++++++++++++++++
include/acpi/ghes.h | 6 ++++++
2 files changed, 43 insertions(+)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index b0a6445c6da2..cc0588fe20f5 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -128,6 +128,9 @@ module_param_named(edac_force_enable, ghes_edac_force_enable, bool, 0);
static LIST_HEAD(ghes_hed);
static DEFINE_MUTEX(ghes_list_mutex);
+static LIST_HEAD(ghes_devs);
+static DEFINE_MUTEX(ghes_devs_mutex);
+
/*
* Because the memory area used to transfer hardware error information
* from BIOS to Linux can be determined only in NMI, IRQ or timer
@@ -1388,6 +1391,10 @@ static int ghes_probe(struct platform_device *ghes_dev)
ghes_edac_register(ghes, &ghes_dev->dev);
+ mutex_lock(&ghes_devs_mutex);
+ list_add_tail(&ghes->elist, &ghes_devs);
+ mutex_unlock(&ghes_devs_mutex);
+
/* Handle any pending errors right away */
spin_lock_irqsave(&ghes_notify_lock_irq, flags);
ghes_proc(ghes);
@@ -1452,6 +1459,10 @@ static int ghes_remove(struct platform_device *ghes_dev)
ghes_edac_unregister(ghes);
+ mutex_lock(&ghes_devs_mutex);
+ list_del(&ghes->elist);
+ mutex_unlock(&ghes_devs_mutex);
+
kfree(ghes);
platform_set_drvdata(ghes_dev, NULL);
@@ -1508,6 +1519,32 @@ void __init acpi_ghes_init(void)
pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n");
}
+/*
+ * Known x86 systems that prefer GHES error reporting:
+ */
+static struct acpi_platform_list plat_list[] = {
+ {"HPE ", "Server ", 0, ACPI_SIG_FADT, all_versions},
+ { } /* End */
+};
+
+struct list_head *ghes_get_devices(void)
+{
+ int idx = -1;
+
+ if (IS_ENABLED(CONFIG_X86)) {
+ idx = acpi_match_platform_list(plat_list);
+ if (idx < 0) {
+ if (!ghes_edac_force_enable)
+ return NULL;
+
+ pr_warn_once("Force-loading ghes_edac on an unsupported platform. You're on your own!\n");
+ }
+ }
+
+ return &ghes_devs;
+}
+EXPORT_SYMBOL_GPL(ghes_get_devices);
+
void ghes_register_report_chain(struct notifier_block *nb)
{
atomic_notifier_chain_register(&ghes_report_chain, nb);
diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h
index 5cbd38b6e4e1..46d9c86199e9 100644
--- a/include/acpi/ghes.h
+++ b/include/acpi/ghes.h
@@ -27,6 +27,8 @@ struct ghes {
struct timer_list timer;
unsigned int irq;
};
+ struct device *dev;
+ struct list_head elist;
};
struct ghes_estatus_node {
@@ -69,6 +71,10 @@ int ghes_register_vendor_record_notifier(struct notifier_block *nb);
* @nb: pointer to the notifier_block structure of the vendor record handler.
*/
void ghes_unregister_vendor_record_notifier(struct notifier_block *nb);
+
+struct list_head *ghes_get_devices(void);
+#else
+static inline struct list_head *ghes_get_devices(void) { return NULL; }
#endif
int ghes_estatus_pool_init(int num_ghes);
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 5/8] EDAC/ghes: Make ghes_edac a proper module to remove the dependency on ghes
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
` (3 preceding siblings ...)
2022-09-29 2:37 ` [PATCH v7 4/8] ghes: Introduce a helper ghes_get_devices() Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 6/8] EDAC: Add the ghes_get_devices() check for chipset-specific edac drivers Jia He
` (2 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Commit dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in
apci_init()") introduced a bug that ghes_edac_register() would be invoked
before edac_init(). Because at that time, the bus "edac" hadn't been even
registered, this created sysfs /devices/mc0 instead of
/sys/devices/system/edac/mc/mc0 on an Ampere eMag server.
To remove the dependency of ghes_edac on ghes, make it a proper module. Use
a list to save the probing devices in ghes_probe(), and defer the
ghes_edac_register() to module_init() of the new ghes_edac module by
iterating over the devices list.
The ghes_edac_force_enable check is not needed in ghes_edac_unregister()
since it has been checked in ghes_edac_init().
Co-developed-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Jia He <justin.he@arm.com>
Fixes: dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in apci_init()")
Cc: Shuai Xue <xueshuai@linux.alibaba.com>
Acked-by: Toshi Kani <toshi.kani@hpe.com>
---
drivers/acpi/apei/ghes.c | 4 +--
drivers/edac/Kconfig | 4 +--
drivers/edac/ghes_edac.c | 64 ++++++++++++++++++++++++----------------
include/acpi/ghes.h | 18 -----------
4 files changed, 42 insertions(+), 48 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index cc0588fe20f5..11a503f2260d 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -1389,7 +1389,7 @@ static int ghes_probe(struct platform_device *ghes_dev)
platform_set_drvdata(ghes_dev, ghes);
- ghes_edac_register(ghes, &ghes_dev->dev);
+ ghes->dev = &ghes_dev->dev;
mutex_lock(&ghes_devs_mutex);
list_add_tail(&ghes->elist, &ghes_devs);
@@ -1457,8 +1457,6 @@ static int ghes_remove(struct platform_device *ghes_dev)
ghes_fini(ghes);
- ghes_edac_unregister(ghes);
-
mutex_lock(&ghes_devs_mutex);
list_del(&ghes->elist);
mutex_unlock(&ghes_devs_mutex);
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 17562cf1fe97..df45db81858b 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -53,8 +53,8 @@ config EDAC_DECODE_MCE
has been initialized.
config EDAC_GHES
- bool "Output ACPI APEI/GHES BIOS detected errors via EDAC"
- depends on ACPI_APEI_GHES && (EDAC=y)
+ tristate "Output ACPI APEI/GHES BIOS detected errors via EDAC"
+ depends on ACPI_APEI_GHES
select UEFI_CPER
help
Not all machines support hardware-driven error report. Some of those
diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c
index 11a1b5e7e484..3d50e624ca07 100644
--- a/drivers/edac/ghes_edac.c
+++ b/drivers/edac/ghes_edac.c
@@ -56,6 +56,8 @@ static DEFINE_SPINLOCK(ghes_lock);
static bool system_scanned;
+static struct list_head *ghes_devs;
+
/* Memory Device - Type 17 of SMBIOS spec */
struct memdev_dmi_entry {
u8 type;
@@ -383,34 +385,15 @@ static struct notifier_block ghes_edac_mem_err_nb = {
.priority = 0,
};
-/*
- * Known systems that are safe to enable this module.
- */
-static struct acpi_platform_list plat_list[] = {
- {"HPE ", "Server ", 0, ACPI_SIG_FADT, all_versions},
- { } /* End */
-};
-
-int ghes_edac_register(struct ghes *ghes, struct device *dev)
+static int ghes_edac_register(struct device *dev)
{
bool fake = false;
struct mem_ctl_info *mci;
struct ghes_pvt *pvt;
struct edac_mc_layer layers[1];
unsigned long flags;
- int idx = -1;
int rc = 0;
- if (IS_ENABLED(CONFIG_X86)) {
- /* Check if safe to enable on this system */
- idx = acpi_match_platform_list(plat_list);
- if (!ghes_edac_force_enable && idx < 0)
- return -ENODEV;
- } else {
- ghes_edac_force_enable = true;
- idx = 0;
- }
-
/* finish another registration/unregistration instance first */
mutex_lock(&ghes_reg_mutex);
@@ -454,7 +437,7 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
pr_info("This system has a very crappy BIOS: It doesn't even list the DIMMS.\n");
pr_info("Its SMBIOS info is wrong. It is doubtful that the error report would\n");
pr_info("work on such system. Use this driver with caution\n");
- } else if (idx < 0) {
+ } else if (ghes_edac_force_enable) {
pr_info("This EDAC driver relies on BIOS to enumerate memory and get error reports.\n");
pr_info("Unfortunately, not all BIOSes reflect the memory layout correctly.\n");
pr_info("So, the end result of using this driver varies from vendor to vendor.\n");
@@ -526,14 +509,11 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
return rc;
}
-void ghes_edac_unregister(struct ghes *ghes)
+static void ghes_edac_unregister(struct ghes *ghes)
{
struct mem_ctl_info *mci;
unsigned long flags;
- if (!ghes_edac_force_enable)
- return;
-
mutex_lock(&ghes_reg_mutex);
system_scanned = false;
@@ -562,3 +542,37 @@ void ghes_edac_unregister(struct ghes *ghes)
unlock:
mutex_unlock(&ghes_reg_mutex);
}
+
+static int __init ghes_edac_init(void)
+{
+ struct ghes *g, *g_tmp;
+
+ ghes_devs = ghes_get_devices();
+ if (!ghes_devs)
+ return -ENODEV;
+
+ if (list_empty(ghes_devs)) {
+ pr_info("GHES probing device list is empty");
+ return -ENODEV;
+ }
+
+ list_for_each_entry_safe(g, g_tmp, ghes_devs, elist) {
+ ghes_edac_register(g->dev);
+ }
+
+ return 0;
+}
+module_init(ghes_edac_init);
+
+static void __exit ghes_edac_exit(void)
+{
+ struct ghes *g, *g_tmp;
+
+ list_for_each_entry_safe(g, g_tmp, ghes_devs, elist) {
+ ghes_edac_unregister(g);
+ }
+}
+module_exit(ghes_edac_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Output ACPI APEI/GHES BIOS detected errors module via EDAC");
diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h
index 46d9c86199e9..2e785d3554d8 100644
--- a/include/acpi/ghes.h
+++ b/include/acpi/ghes.h
@@ -79,24 +79,6 @@ static inline struct list_head *ghes_get_devices(void) { return NULL; }
int ghes_estatus_pool_init(int num_ghes);
-/* From drivers/edac/ghes_edac.c */
-
-#ifdef CONFIG_EDAC_GHES
-int ghes_edac_register(struct ghes *ghes, struct device *dev);
-
-void ghes_edac_unregister(struct ghes *ghes);
-
-#else
-static inline int ghes_edac_register(struct ghes *ghes, struct device *dev)
-{
- return -ENODEV;
-}
-
-static inline void ghes_edac_unregister(struct ghes *ghes)
-{
-}
-#endif
-
static inline int acpi_hest_get_version(struct acpi_hest_generic_data *gdata)
{
return gdata->revision >> 8;
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 6/8] EDAC: Add the ghes_get_devices() check for chipset-specific edac drivers
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
` (4 preceding siblings ...)
2022-09-29 2:37 ` [PATCH v7 5/8] EDAC/ghes: Make ghes_edac a proper module to remove the dependency on ghes Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 7/8] apei/ghes: Use unrcu_pointer for cmpxchg Jia He
2022-09-29 2:37 ` [PATCH v7 8/8] EDAC/igen6: Return consistent errno when another edac driver is enabled Jia He
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Add ghes_get_devices() check for chipset-specific edac drivers to ensure
that ghes_edac is used on the platform where ghes_edac is preferred over
chipset-specific edac driver.
Unlike the existing edac_get_owner() check, the ghes_get_devices()
check works independent to the module_init ordering.
Suggested-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Jia He <justin.he@arm.com>
---
drivers/edac/amd64_edac.c | 3 +++
drivers/edac/armada_xp_edac.c | 3 +++
drivers/edac/edac_module.h | 1 +
drivers/edac/i10nm_base.c | 3 +++
drivers/edac/igen6_edac.c | 3 +++
drivers/edac/layerscape_edac.c | 3 +++
drivers/edac/pnd2_edac.c | 3 +++
drivers/edac/sb_edac.c | 3 +++
drivers/edac/skx_base.c | 3 +++
drivers/edac/thunderx_edac.c | 3 +++
drivers/edac/xgene_edac.c | 3 +++
11 files changed, 31 insertions(+)
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 2f854feeeb23..e3318e5575a3 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -4329,6 +4329,9 @@ static int __init amd64_edac_init(void)
int err = -ENODEV;
int i;
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
diff --git a/drivers/edac/armada_xp_edac.c b/drivers/edac/armada_xp_edac.c
index 038abbb83f4b..c4bd2fb9c46b 100644
--- a/drivers/edac/armada_xp_edac.c
+++ b/drivers/edac/armada_xp_edac.c
@@ -599,6 +599,9 @@ static int __init armada_xp_edac_init(void)
{
int res;
+ if (ghes_get_devices())
+ return -EBUSY;
+
/* only polling is supported */
edac_op_state = EDAC_OPSTATE_POLL;
diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h
index 96f6de0c8ff6..3826f82de487 100644
--- a/drivers/edac/edac_module.h
+++ b/drivers/edac/edac_module.h
@@ -11,6 +11,7 @@
#ifndef __EDAC_MODULE_H__
#define __EDAC_MODULE_H__
+#include <acpi/ghes.h>
#include "edac_mc.h"
#include "edac_pci.h"
#include "edac_device.h"
diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
index 6cf50ee0b77c..75211ee4cd12 100644
--- a/drivers/edac/i10nm_base.c
+++ b/drivers/edac/i10nm_base.c
@@ -548,6 +548,9 @@ static int __init i10nm_init(void)
edac_dbg(2, "\n");
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
index a07bbfd075d0..d33c666221f9 100644
--- a/drivers/edac/igen6_edac.c
+++ b/drivers/edac/igen6_edac.c
@@ -1271,6 +1271,9 @@ static int __init igen6_init(void)
edac_dbg(2, "\n");
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -ENODEV;
diff --git a/drivers/edac/layerscape_edac.c b/drivers/edac/layerscape_edac.c
index 94cac7686a56..35ceaca578e1 100644
--- a/drivers/edac/layerscape_edac.c
+++ b/drivers/edac/layerscape_edac.c
@@ -38,6 +38,9 @@ static int __init fsl_ddr_mc_init(void)
{
int res;
+ if (ghes_get_devices())
+ return -EBUSY;
+
/* make sure error reporting method is sane */
switch (edac_op_state) {
case EDAC_OPSTATE_POLL:
diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c
index a20b299f1202..2b306f2cc605 100644
--- a/drivers/edac/pnd2_edac.c
+++ b/drivers/edac/pnd2_edac.c
@@ -1528,6 +1528,9 @@ static int __init pnd2_init(void)
edac_dbg(2, "\n");
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index 9678ab97c7ac..2c860adf54a7 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -3506,6 +3506,9 @@ static int __init sbridge_init(void)
edac_dbg(2, "\n");
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
index 1abc020d49ab..80a7334111b1 100644
--- a/drivers/edac/skx_base.c
+++ b/drivers/edac/skx_base.c
@@ -653,6 +653,9 @@ static int __init skx_init(void)
edac_dbg(2, "\n");
+ if (ghes_get_devices())
+ return -EBUSY;
+
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
return -EBUSY;
diff --git a/drivers/edac/thunderx_edac.c b/drivers/edac/thunderx_edac.c
index f13674081cb6..0bcd9f02c84a 100644
--- a/drivers/edac/thunderx_edac.c
+++ b/drivers/edac/thunderx_edac.c
@@ -2114,6 +2114,9 @@ static int __init thunderx_edac_init(void)
{
int rc = 0;
+ if (ghes_get_devices())
+ return -EBUSY;
+
rc = pci_register_driver(&thunderx_lmc_driver);
if (rc)
return rc;
diff --git a/drivers/edac/xgene_edac.c b/drivers/edac/xgene_edac.c
index 54081403db4f..c52b9dd9154c 100644
--- a/drivers/edac/xgene_edac.c
+++ b/drivers/edac/xgene_edac.c
@@ -2004,6 +2004,9 @@ static int __init xgene_edac_init(void)
{
int rc;
+ if (ghes_get_devices())
+ return -EBUSY;
+
/* Make sure error reporting method is sane */
switch (edac_op_state) {
case EDAC_OPSTATE_POLL:
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 7/8] apei/ghes: Use unrcu_pointer for cmpxchg
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
` (5 preceding siblings ...)
2022-09-29 2:37 ` [PATCH v7 6/8] EDAC: Add the ghes_get_devices() check for chipset-specific edac drivers Jia He
@ 2022-09-29 2:37 ` Jia He
2022-09-29 2:37 ` [PATCH v7 8/8] EDAC/igen6: Return consistent errno when another edac driver is enabled Jia He
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He, kernel test robot
ghes_estatus_caches should be add rcu annotation to avoid sparse warnings.
drivers/acpi/apei/ghes.c:733:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
drivers/acpi/apei/ghes.c:733:25: sparse: struct ghes_estatus_cache [noderef] __rcu *
drivers/acpi/apei/ghes.c:733:25: sparse: struct ghes_estatus_cache *
drivers/acpi/apei/ghes.c:813:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
drivers/acpi/apei/ghes.c:813:25: sparse: struct ghes_estatus_cache [noderef] __rcu *
drivers/acpi/apei/ghes.c:813:25: sparse: struct ghes_estatus_cache *
unrcu_pointer is to strip the __rcu in cmpxchg.
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Jia He <justin.he@arm.com>
---
drivers/acpi/apei/ghes.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 11a503f2260d..803e9d9867ca 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -151,7 +151,7 @@ struct ghes_vendor_record_entry {
static struct gen_pool *ghes_estatus_pool;
static unsigned long ghes_estatus_pool_size_request;
-static struct ghes_estatus_cache *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE];
+static struct ghes_estatus_cache __rcu *ghes_estatus_caches[GHES_ESTATUS_CACHES_SIZE];
static atomic_t ghes_estatus_cache_alloced;
static int ghes_panic_timeout __read_mostly = 30;
@@ -841,8 +841,9 @@ static void ghes_estatus_cache_add(
}
/* new_cache must be put into array after its contents are written */
smp_wmb();
- if (slot != -1 && cmpxchg(ghes_estatus_caches + slot,
- slot_cache, new_cache) == slot_cache) {
+ if (slot != -1 && unrcu_pointer(cmpxchg(ghes_estatus_caches + slot,
+ RCU_INITIALIZER(slot_cache),
+ RCU_INITIALIZER(new_cache))) == slot_cache) {
if (slot_cache)
call_rcu(&slot_cache->rcu, ghes_estatus_cache_rcu_free);
} else
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 8/8] EDAC/igen6: Return consistent errno when another edac driver is enabled
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
` (6 preceding siblings ...)
2022-09-29 2:37 ` [PATCH v7 7/8] apei/ghes: Use unrcu_pointer for cmpxchg Jia He
@ 2022-09-29 2:37 ` Jia He
7 siblings, 0 replies; 11+ messages in thread
From: Jia He @ 2022-09-29 2:37 UTC (permalink / raw)
To: Len Brown, James Morse, Tony Luck, Borislav Petkov,
Mauro Carvalho Chehab, Robert Richter, Robert Moore, Qiuxu Zhuo,
Yazen Ghannam, Jan Luebbe, Khuong Dinh, Kani Toshi
Cc: Ard Biesheuvel, linux-acpi, linux-kernel, linux-edac, devel,
Rafael J . Wysocki, Shuai Xue, Jarkko Sakkinen, linux-efi, nd,
Jia He
Only a single edac driver can be enabled for EDAC MC. The igen6_init()
should be returned with EBUSY instead of ENODEV, which is consistent with
other edac drivers.
Signed-off-by: Jia He <justin.he@arm.com>
---
drivers/edac/igen6_edac.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
index d33c666221f9..544dd19072ea 100644
--- a/drivers/edac/igen6_edac.c
+++ b/drivers/edac/igen6_edac.c
@@ -1276,7 +1276,7 @@ static int __init igen6_init(void)
owner = edac_get_owner();
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
- return -ENODEV;
+ return -EBUSY;
edac_op_state = EDAC_OPSTATE_NMI;
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter
2022-09-29 2:37 ` [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter Jia He
@ 2022-10-05 15:13 ` Borislav Petkov
2022-10-08 8:14 ` Justin He
0 siblings, 1 reply; 11+ messages in thread
From: Borislav Petkov @ 2022-10-05 15:13 UTC (permalink / raw)
To: Jia He
Cc: Len Brown, James Morse, Tony Luck, Mauro Carvalho Chehab,
Robert Richter, Robert Moore, Qiuxu Zhuo, Yazen Ghannam,
Jan Luebbe, Khuong Dinh, Kani Toshi, Ard Biesheuvel, linux-acpi,
linux-kernel, linux-edac, devel, Rafael J . Wysocki, Shuai Xue,
Jarkko Sakkinen, linux-efi, nd
On Thu, Sep 29, 2022 at 02:37:21AM +0000, Jia He wrote:
> ghes_edac_register() is too late to set this module flag ghes_edac.force_load.
> Also, other edac drivers should not be able to control this flag.
>
> Move this flag to the module parameter in ghes instead.
>
> Suggested-by: Toshi Kani <toshi.kani@hpe.com>
> Signed-off-by: Jia He <justin.he@arm.com>
> Reviewed-by: Toshi Kani <toshi.kani@hpe.com>
> ---
> drivers/acpi/apei/ghes.c | 8 ++++++++
> drivers/edac/ghes_edac.c | 10 +++-------
> include/acpi/apei.h | 2 ++
> 3 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
> index 8cb65f757d06..b0a6445c6da2 100644
> --- a/drivers/acpi/apei/ghes.c
> +++ b/drivers/acpi/apei/ghes.c
> @@ -109,6 +109,14 @@ static inline bool is_hest_type_generic_v2(struct ghes *ghes)
> bool ghes_disable;
> module_param_named(disable, ghes_disable, bool, 0);
>
> +/*
> + * "ghes.edac_force_enable" forcibly enables ghes_edac and skips the platform
> + * check.
> + */
> +bool ghes_edac_force_enable;
> +EXPORT_SYMBOL(ghes_edac_force_enable);
> +module_param_named(edac_force_enable, ghes_edac_force_enable, bool, 0);
Why is this exported?
In the exemplary patch I sent you, that thing is static.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter
2022-10-05 15:13 ` Borislav Petkov
@ 2022-10-08 8:14 ` Justin He
0 siblings, 0 replies; 11+ messages in thread
From: Justin He @ 2022-10-08 8:14 UTC (permalink / raw)
To: Borislav Petkov
Cc: Len Brown, James Morse, Tony Luck, Mauro Carvalho Chehab,
Robert Richter, Robert Moore, Qiuxu Zhuo, Yazen Ghannam,
Jan Luebbe, Khuong Dinh, Kani Toshi, Ard Biesheuvel, linux-acpi,
linux-kernel, linux-edac, devel, Rafael J . Wysocki, Shuai Xue,
Jarkko Sakkinen, linux-efi, nd
> -----Original Message-----
> From: Borislav Petkov <bp@alien8.de>
> Sent: Wednesday, October 5, 2022 11:14 PM
> To: Justin He <Justin.He@arm.com>
> Cc: Len Brown <lenb@kernel.org>; James Morse <James.Morse@arm.com>;
> Tony Luck <tony.luck@intel.com>; Mauro Carvalho Chehab
> <mchehab@kernel.org>; Robert Richter <rric@kernel.org>; Robert Moore
> <robert.moore@intel.com>; Qiuxu Zhuo <qiuxu.zhuo@intel.com>; Yazen
> Ghannam <yazen.ghannam@amd.com>; Jan Luebbe <jlu@pengutronix.de>;
> Khuong Dinh <khuong@os.amperecomputing.com>; Kani Toshi
> <toshi.kani@hpe.com>; Ard Biesheuvel <ardb@kernel.org>;
> linux-acpi@vger.kernel.org; linux-kernel@vger.kernel.org;
> linux-edac@vger.kernel.org; devel@acpica.org; Rafael J . Wysocki
> <rafael@kernel.org>; Shuai Xue <xueshuai@linux.alibaba.com>; Jarkko
> Sakkinen <jarkko@kernel.org>; linux-efi@vger.kernel.org; nd <nd@arm.com>
> Subject: Re: [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes
> module parameter
>
> On Thu, Sep 29, 2022 at 02:37:21AM +0000, Jia He wrote:
> > ghes_edac_register() is too late to set this module flag ghes_edac.force_load.
> > Also, other edac drivers should not be able to control this flag.
> >
> > Move this flag to the module parameter in ghes instead.
> >
> > Suggested-by: Toshi Kani <toshi.kani@hpe.com>
> > Signed-off-by: Jia He <justin.he@arm.com>
> > Reviewed-by: Toshi Kani <toshi.kani@hpe.com>
> > ---
> > drivers/acpi/apei/ghes.c | 8 ++++++++ drivers/edac/ghes_edac.c | 10
> > +++-------
> > include/acpi/apei.h | 2 ++
> > 3 files changed, 13 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index
> > 8cb65f757d06..b0a6445c6da2 100644
> > --- a/drivers/acpi/apei/ghes.c
> > +++ b/drivers/acpi/apei/ghes.c
> > @@ -109,6 +109,14 @@ static inline bool is_hest_type_generic_v2(struct
> > ghes *ghes) bool ghes_disable; module_param_named(disable,
> > ghes_disable, bool, 0);
> >
> > +/*
> > + * "ghes.edac_force_enable" forcibly enables ghes_edac and skips the
> > +platform
> > + * check.
> > + */
> > +bool ghes_edac_force_enable;
> > +EXPORT_SYMBOL(ghes_edac_force_enable);
> > +module_param_named(edac_force_enable, ghes_edac_force_enable, bool,
> > +0);
>
> Why is this exported?
>
> In the exemplary patch I sent you, that thing is static.
Sorry for the carelessness
--
Cheers,
Justin (Jia He)
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-10-08 8:14 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-29 2:37 [PATCH v7 0/8] Make ghes_edac a proper module Jia He
2022-09-29 2:37 ` [PATCH v7 1/8] efi/cper: export several helpers for ghes_edac to use Jia He
2022-09-29 2:37 ` [PATCH v7 2/8] EDAC/ghes: Add a notifier for reporting memory errors Jia He
2022-09-29 2:37 ` [PATCH v7 3/8] EDAC:ghes: Move ghes_edac.force_load to ghes module parameter Jia He
2022-10-05 15:13 ` Borislav Petkov
2022-10-08 8:14 ` Justin He
2022-09-29 2:37 ` [PATCH v7 4/8] ghes: Introduce a helper ghes_get_devices() Jia He
2022-09-29 2:37 ` [PATCH v7 5/8] EDAC/ghes: Make ghes_edac a proper module to remove the dependency on ghes Jia He
2022-09-29 2:37 ` [PATCH v7 6/8] EDAC: Add the ghes_get_devices() check for chipset-specific edac drivers Jia He
2022-09-29 2:37 ` [PATCH v7 7/8] apei/ghes: Use unrcu_pointer for cmpxchg Jia He
2022-09-29 2:37 ` [PATCH v7 8/8] EDAC/igen6: Return consistent errno when another edac driver is enabled Jia He
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).