326 lines
10 KiB
Diff
326 lines
10 KiB
Diff
|
|
From 9fd84965e70b6d245699d36f8ac4f260d87013cb Mon Sep 17 00:00:00 2001
|
||
|
|
From: Shiju Jose <shiju.jose@huawei.com>
|
||
|
|
Date: Thu, 1 Jun 2023 15:34:53 +0100
|
||
|
|
Subject: [PATCH 3/3] rasdaemon: Add support for creating the vendor error
|
||
|
|
tables at startup
|
||
|
|
|
||
|
|
1. Support for create/open the vendor error tables at rasdaemon startup.
|
||
|
|
2. Make changes in the HiSilicon error handling code for the same.
|
||
|
|
|
||
|
|
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
|
||
|
|
---
|
||
|
|
non-standard-hisi_hip08.c | 66 ++++++++++++++++++++++++++------------
|
||
|
|
non-standard-hisilicon.c | 28 ++++++++++------
|
||
|
|
ras-events.c | 17 +++++++++-
|
||
|
|
ras-non-standard-handler.c | 35 +++++++++++++++++++-
|
||
|
|
ras-non-standard-handler.h | 3 ++
|
||
|
|
5 files changed, 116 insertions(+), 33 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/non-standard-hisi_hip08.c b/non-standard-hisi_hip08.c
|
||
|
|
index 61f12eb..be84c22 100644
|
||
|
|
--- a/non-standard-hisi_hip08.c
|
||
|
|
+++ b/non-standard-hisi_hip08.c
|
||
|
|
@@ -654,6 +654,20 @@ static void decode_oem_type1_err_regs(struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
step_vendor_data_tab(ev_decoder, "hip08_oem_type1_event_tab");
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int add_hip08_oem_type1_table(struct ras_events *ras, struct ras_ns_ev_decoder *ev_decoder)
|
||
|
|
+{
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
+ if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
+ &hip08_oem_type1_event_tab) != SQLITE_OK) {
|
||
|
|
+ log(TERM, LOG_WARNING, "Failed to create sql hip08_oem_type1_event_tab\n");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
/* error data decoding functions */
|
||
|
|
static int decode_hip08_oem_type1_error(struct ras_events *ras,
|
||
|
|
struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
@@ -669,17 +683,6 @@ static int decode_hip08_oem_type1_error(struct ras_events *ras,
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
-#ifdef HAVE_SQLITE3
|
||
|
|
- if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
- if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
- &hip08_oem_type1_event_tab)
|
||
|
|
- != SQLITE_OK) {
|
||
|
|
- trace_seq_printf(s,
|
||
|
|
- "create sql hip08_oem_type1_event_tab fail\n");
|
||
|
|
- return -1;
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-#endif
|
||
|
|
record_vendor_data(ev_decoder, HISI_OEM_DATA_TYPE_TEXT,
|
||
|
|
HIP08_OEM_TYPE1_FIELD_TIMESTAMP,
|
||
|
|
0, event->timestamp);
|
||
|
|
@@ -827,6 +830,20 @@ static void decode_oem_type2_err_regs(struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
step_vendor_data_tab(ev_decoder, "hip08_oem_type2_event_tab");
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int add_hip08_oem_type2_table(struct ras_events *ras, struct ras_ns_ev_decoder *ev_decoder)
|
||
|
|
+{
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
+ if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
+ &hip08_oem_type2_event_tab) != SQLITE_OK) {
|
||
|
|
+ log(TERM, LOG_WARNING, "Failed to create sql hip08_oem_type2_event_tab\n");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static int decode_hip08_oem_type2_error(struct ras_events *ras,
|
||
|
|
struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
struct trace_seq *s,
|
||
|
|
@@ -977,6 +994,20 @@ static void decode_pcie_local_err_regs(struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
step_vendor_data_tab(ev_decoder, "hip08_pcie_local_event_tab");
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int add_hip08_pcie_local_table(struct ras_events *ras, struct ras_ns_ev_decoder *ev_decoder)
|
||
|
|
+{
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
+ if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
+ &hip08_pcie_local_event_tab) != SQLITE_OK) {
|
||
|
|
+ log(TERM, LOG_WARNING, "Failed to create sql hip08_pcie_local_event_tab\n");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static int decode_hip08_pcie_local_error(struct ras_events *ras,
|
||
|
|
struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
struct trace_seq *s,
|
||
|
|
@@ -991,16 +1022,6 @@ static int decode_hip08_pcie_local_error(struct ras_events *ras,
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
-#ifdef HAVE_SQLITE3
|
||
|
|
- if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
- if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
- &hip08_pcie_local_event_tab) != SQLITE_OK) {
|
||
|
|
- trace_seq_printf(s,
|
||
|
|
- "create sql hip08_pcie_local_event_tab fail\n");
|
||
|
|
- return -1;
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-#endif
|
||
|
|
record_vendor_data(ev_decoder, HISI_OEM_DATA_TYPE_TEXT,
|
||
|
|
HIP08_PCIE_LOCAL_FIELD_TIMESTAMP,
|
||
|
|
0, event->timestamp);
|
||
|
|
@@ -1015,14 +1036,17 @@ static int decode_hip08_pcie_local_error(struct ras_events *ras,
|
||
|
|
static struct ras_ns_ev_decoder hip08_ns_ev_decoder[] = {
|
||
|
|
{
|
||
|
|
.sec_type = "1f8161e1-55d6-41e6-bd10-7afd1dc5f7c5",
|
||
|
|
+ .add_table = add_hip08_oem_type1_table,
|
||
|
|
.decode = decode_hip08_oem_type1_error,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
.sec_type = "45534ea6-ce23-4115-8535-e07ab3aef91d",
|
||
|
|
+ .add_table = add_hip08_oem_type2_table,
|
||
|
|
.decode = decode_hip08_oem_type2_error,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
.sec_type = "b2889fc9-e7d7-4f9d-a867-af42e98be772",
|
||
|
|
+ .add_table = add_hip08_pcie_local_table,
|
||
|
|
.decode = decode_hip08_pcie_local_error,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
diff --git a/non-standard-hisilicon.c b/non-standard-hisilicon.c
|
||
|
|
index 0d5fe6b..0ddb5ec 100644
|
||
|
|
--- a/non-standard-hisilicon.c
|
||
|
|
+++ b/non-standard-hisilicon.c
|
||
|
|
@@ -337,6 +337,23 @@ static void decode_hisi_common_section_hdr(struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
HISI_SNPRINTF(event->error_msg, "]");
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int add_hisi_common_table(struct ras_events *ras,
|
||
|
|
+ struct ras_ns_ev_decoder *ev_decoder)
|
||
|
|
+{
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ if (ras->record_events &&
|
||
|
|
+ !ev_decoder->stmt_dec_record) {
|
||
|
|
+ if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
+ &hisi_common_section_tab) != SQLITE_OK) {
|
||
|
|
+ log(TERM, LOG_WARNING, "Failed to create sql hisi_common_section_tab\n");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static int decode_hisi_common_section(struct ras_events *ras,
|
||
|
|
struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
struct trace_seq *s,
|
||
|
|
@@ -346,16 +363,6 @@ static int decode_hisi_common_section(struct ras_events *ras,
|
||
|
|
(struct hisi_common_error_section *)event->error;
|
||
|
|
struct hisi_event hevent;
|
||
|
|
|
||
|
|
-#ifdef HAVE_SQLITE3
|
||
|
|
- if (ras->record_events && !ev_decoder->stmt_dec_record) {
|
||
|
|
- if (ras_mc_add_vendor_table(ras, &ev_decoder->stmt_dec_record,
|
||
|
|
- &hisi_common_section_tab) != SQLITE_OK) {
|
||
|
|
- trace_seq_printf(s, "create sql hisi_common_section_tab fail\n");
|
||
|
|
- return -1;
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-#endif
|
||
|
|
-
|
||
|
|
memset(&hevent, 0, sizeof(struct hisi_event));
|
||
|
|
trace_seq_printf(s, "\nHisilicon Common Error Section:\n");
|
||
|
|
decode_hisi_common_section_hdr(ev_decoder, err, &hevent);
|
||
|
|
@@ -388,6 +395,7 @@ static int decode_hisi_common_section(struct ras_events *ras,
|
||
|
|
static struct ras_ns_ev_decoder hisi_section_ns_ev_decoder[] = {
|
||
|
|
{
|
||
|
|
.sec_type = "c8b328a8-9917-4af6-9a13-2e08ab2e7586",
|
||
|
|
+ .add_table = add_hisi_common_table,
|
||
|
|
.decode = decode_hisi_common_section,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
diff --git a/ras-events.c b/ras-events.c
|
||
|
|
index d08bf37..fc54325 100644
|
||
|
|
--- a/ras-events.c
|
||
|
|
+++ b/ras-events.c
|
||
|
|
@@ -482,6 +482,10 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata,
|
||
|
|
if (pdata[0].ras->record_events) {
|
||
|
|
if (ras_mc_event_opendb(pdata[0].cpu, pdata[0].ras))
|
||
|
|
goto error;
|
||
|
|
+#ifdef HAVE_NON_STANDARD
|
||
|
|
+ if (ras_ns_add_vendor_tables(pdata[0].ras))
|
||
|
|
+ log(TERM, LOG_ERR, "Can't add vendor table\n");
|
||
|
|
+#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
do {
|
||
|
|
@@ -566,8 +570,12 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata,
|
||
|
|
"Old kernel detected. Stop listening and fall back to pthread way.\n");
|
||
|
|
|
||
|
|
cleanup:
|
||
|
|
- if (pdata[0].ras->record_events)
|
||
|
|
+ if (pdata[0].ras->record_events) {
|
||
|
|
+#ifdef HAVE_NON_STANDARD
|
||
|
|
+ ras_ns_finalize_vendor_tables();
|
||
|
|
+#endif
|
||
|
|
ras_mc_event_closedb(pdata[0].cpu, pdata[0].ras);
|
||
|
|
+ }
|
||
|
|
|
||
|
|
error:
|
||
|
|
kbuffer_free(kbuf);
|
||
|
|
@@ -664,6 +672,10 @@ static void *handle_ras_events_cpu(void *priv)
|
||
|
|
free(page);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
+#ifdef HAVE_NON_STANDARD
|
||
|
|
+ if (ras_ns_add_vendor_tables(pdata->ras))
|
||
|
|
+ log(TERM, LOG_ERR, "Can't add vendor table\n");
|
||
|
|
+#endif
|
||
|
|
pthread_mutex_unlock(&pdata->ras->db_lock);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -671,6 +683,9 @@ static void *handle_ras_events_cpu(void *priv)
|
||
|
|
|
||
|
|
if (pdata->ras->record_events) {
|
||
|
|
pthread_mutex_lock(&pdata->ras->db_lock);
|
||
|
|
+#ifdef HAVE_NON_STANDARD
|
||
|
|
+ ras_ns_finalize_vendor_tables();
|
||
|
|
+#endif
|
||
|
|
ras_mc_event_closedb(pdata->cpu, pdata->ras);
|
||
|
|
pthread_mutex_unlock(&pdata->ras->db_lock);
|
||
|
|
}
|
||
|
|
diff --git a/ras-non-standard-handler.c b/ras-non-standard-handler.c
|
||
|
|
index 6932e58..20d514b 100644
|
||
|
|
--- a/ras-non-standard-handler.c
|
||
|
|
+++ b/ras-non-standard-handler.c
|
||
|
|
@@ -75,6 +75,32 @@ int register_ns_ev_decoder(struct ras_ns_ev_decoder *ns_ev_decoder)
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
+int ras_ns_add_vendor_tables(struct ras_events *ras)
|
||
|
|
+{
|
||
|
|
+ struct ras_ns_ev_decoder *ns_ev_decoder;
|
||
|
|
+ int error = 0;
|
||
|
|
+
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ if (!ras)
|
||
|
|
+ return -1;
|
||
|
|
+
|
||
|
|
+ ns_ev_decoder = ras_ns_ev_dec_list;
|
||
|
|
+ while (ns_ev_decoder) {
|
||
|
|
+ if (ns_ev_decoder->add_table && !ns_ev_decoder->stmt_dec_record) {
|
||
|
|
+ error = ns_ev_decoder->add_table(ras, ns_ev_decoder);
|
||
|
|
+ if (error)
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+ ns_ev_decoder = ns_ev_decoder->next;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (error)
|
||
|
|
+ return -1;
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static int find_ns_ev_decoder(const char *sec_type, struct ras_ns_ev_decoder **p_ns_ev_dec)
|
||
|
|
{
|
||
|
|
struct ras_ns_ev_decoder *ns_ev_decoder;
|
||
|
|
@@ -96,7 +122,7 @@ static int find_ns_ev_decoder(const char *sec_type, struct ras_ns_ev_decoder **p
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
-static void unregister_ns_ev_decoder(void)
|
||
|
|
+void ras_ns_finalize_vendor_tables(void)
|
||
|
|
{
|
||
|
|
#ifdef HAVE_SQLITE3
|
||
|
|
struct ras_ns_ev_decoder *ns_ev_decoder = ras_ns_ev_dec_list;
|
||
|
|
@@ -108,6 +134,13 @@ static void unregister_ns_ev_decoder(void)
|
||
|
|
}
|
||
|
|
ns_ev_decoder = ns_ev_decoder->next;
|
||
|
|
}
|
||
|
|
+#endif
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+static void unregister_ns_ev_decoder(void)
|
||
|
|
+{
|
||
|
|
+#ifdef HAVE_SQLITE3
|
||
|
|
+ ras_ns_finalize_vendor_tables();
|
||
|
|
#endif
|
||
|
|
ras_ns_ev_dec_list = NULL;
|
||
|
|
}
|
||
|
|
diff --git a/ras-non-standard-handler.h b/ras-non-standard-handler.h
|
||
|
|
index 57d4cb5..341206a 100644
|
||
|
|
--- a/ras-non-standard-handler.h
|
||
|
|
+++ b/ras-non-standard-handler.h
|
||
|
|
@@ -23,6 +23,7 @@
|
||
|
|
struct ras_ns_ev_decoder {
|
||
|
|
struct ras_ns_ev_decoder *next;
|
||
|
|
const char *sec_type;
|
||
|
|
+ int (*add_table)(struct ras_events *ras, struct ras_ns_ev_decoder *ev_decoder);
|
||
|
|
int (*decode)(struct ras_events *ras, struct ras_ns_ev_decoder *ev_decoder,
|
||
|
|
struct trace_seq *s, struct ras_non_standard_event *event);
|
||
|
|
#ifdef HAVE_SQLITE3
|
||
|
|
@@ -39,6 +40,8 @@ void print_le_hex(struct trace_seq *s, const uint8_t *buf, int index);
|
||
|
|
|
||
|
|
#ifdef HAVE_NON_STANDARD
|
||
|
|
int register_ns_ev_decoder(struct ras_ns_ev_decoder *ns_ev_decoder);
|
||
|
|
+int ras_ns_add_vendor_tables(struct ras_events *ras);
|
||
|
|
+void ras_ns_finalize_vendor_tables(void);
|
||
|
|
#else
|
||
|
|
static inline int register_ns_ev_decoder(struct ras_ns_ev_decoder *ns_ev_decoder) { return 0; };
|
||
|
|
#endif
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|