[PATCH RFC 4/4] ACPI: APEI: Add log_arm_hw_error to the new notification method

From: Shiju Jose
Date: Mon Aug 12 2019 - 06:12:42 EST


This patch adds log_arm_hw_error to the new error notification
method.

Signed-off-by: Shiju Jose <shiju.jose@xxxxxxxxxx>
---
drivers/acpi/apei/ghes.c | 47 ++++++++++++++++++++++-------------------------
drivers/ras/ras.c | 5 ++++-
include/linux/ras.h | 7 +++++--
3 files changed, 31 insertions(+), 28 deletions(-)

diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index ffc309c..013fea0 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -574,34 +574,27 @@ static void ghes_do_proc(struct ghes *ghes,
if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
fru_text = gdata->fru_text;

- if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
- struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
-
- log_arm_hw_error(err);
- } else {
- rcu_read_lock();
- list_for_each_entry_rcu(err_notify,
- &ghes_error_notify_list, list) {
- if (guid_equal(&err_notify->sec_type,
- sec_type)) {
- /* The notification is called in the
- * interrupt context, thus the handler
- * functions should be take care of it.
- */
- err_notify->handle(gdata, sev,
- err_notify->data);
- is_notify = 1;
- }
+ rcu_read_lock();
+ list_for_each_entry_rcu(err_notify, &ghes_error_notify_list,
+ list) {
+ if (guid_equal(&err_notify->sec_type, sec_type)) {
+ /* The notification is called in the
+ * interrupt context, thus the handler
+ * functions should be take care of it.
+ */
+ err_notify->handle(gdata, sev,
+ err_notify->data);
+ is_notify = 1;
}
- rcu_read_unlock();
+ }
+ rcu_read_unlock();

- if (!is_notify) {
- void *err = acpi_hest_get_payload(gdata);
+ if (!is_notify) {
+ void *err = acpi_hest_get_payload(gdata);

- log_non_standard_event(sec_type, fru_id,
- fru_text, sec_sev, err,
- gdata->error_data_length);
- }
+ log_non_standard_event(sec_type, fru_id,
+ fru_text, sec_sev, err,
+ gdata->error_data_length);
}
}
}
@@ -1198,6 +1191,10 @@ struct ghes_err_handler_tab {
.sec_type = CPER_SEC_PCIE,
.handle = ghes_handle_aer,
},
+ {
+ .sec_type = CPER_SEC_PROC_ARM,
+ .handle = log_arm_hw_error,
+ },
{ /* sentinel */ }
};

diff --git a/drivers/ras/ras.c b/drivers/ras/ras.c
index 95540ea..7ec3eeb 100644
--- a/drivers/ras/ras.c
+++ b/drivers/ras/ras.c
@@ -21,8 +21,11 @@ void log_non_standard_event(const guid_t *sec_type, const guid_t *fru_id,
trace_non_standard_event(sec_type, fru_id, fru_text, sev, err, len);
}

-void log_arm_hw_error(struct cper_sec_proc_arm *err)
+void log_arm_hw_error(struct acpi_hest_generic_data *gdata,
+ int sev, void *data)
{
+ struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
+
trace_arm_event(err);
}

diff --git a/include/linux/ras.h b/include/linux/ras.h
index 7c3debb..05b662d 100644
--- a/include/linux/ras.h
+++ b/include/linux/ras.h
@@ -5,6 +5,7 @@
#include <asm/errno.h>
#include <linux/uuid.h>
#include <linux/cper.h>
+#include <acpi/ghes.h>

#ifdef CONFIG_DEBUG_FS
int ras_userspace_consumers(void);
@@ -29,7 +30,8 @@ static inline void __init cec_init(void) { }
void log_non_standard_event(const guid_t *sec_type,
const guid_t *fru_id, const char *fru_text,
const u8 sev, const u8 *err, const u32 len);
-void log_arm_hw_error(struct cper_sec_proc_arm *err);
+void log_arm_hw_error(struct acpi_hest_generic_data *gdata,
+ int sev, void *data);
#else
static inline void
log_non_standard_event(const guid_t *sec_type,
@@ -37,7 +39,8 @@ void log_non_standard_event(const guid_t *sec_type,
const u8 sev, const u8 *err, const u32 len)
{ return; }
static inline void
-log_arm_hw_error(struct cper_sec_proc_arm *err) { return; }
+log_arm_hw_error(struct acpi_hest_generic_data *gdata,
+ int sev, void *data) { return; }
#endif

#endif /* __RAS_H__ */
--
1.9.1