rasdaemon/0003-rasdaemon-Add-support-for-creating-the-vendor-error-.patch
Shiju Jose e0f5dee5f1 rasdaemon: Add fix patches for rasdaemon and Add support for creating the vendor error tables at startup
Add the following fix patches and changes,
1. Fix return value type issue of read/write function from unistd.h.
2. Fix issue of signed and unsigned integer comparison.
3. Remove redundant header file and do some clean-up.
4. Add support for create/open the vendor error tables at rasdaemon startup.
5. Make changes in the HiSilicon error handling code for the same.
6. Add four modules supported by HiSilicon common section.

Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
2023-06-02 12:58:41 +01:00

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