Projects
Eulaceura:Mainline:GA
rasdaemon
_service:obs_scm:0003-rasdaemon-Add-support-for...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0003-rasdaemon-Add-support-for-creating-the-vendor-error-.patch of Package rasdaemon
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
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2