From: Cong Wang Date: Wed, 12 Jun 2019 22:06:37 +0000 (-0700) Subject: Make event filter type specific X-Git-Tag: v0.6.3~5 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c30634163da47b6e88db995c0aa66b546773798c;p=users%2Fmchehab%2Frasdaemon.git Make event filter type specific struct ras_events passed via context pointer is not per event, therefore the per event filter must be specific to each event. Signed-off-by: Cong Wang --- diff --git a/ras-devlink-handler.c b/ras-devlink-handler.c index 2699291..e52d66e 100644 --- a/ras-devlink-handler.c +++ b/ras-devlink-handler.c @@ -91,7 +91,8 @@ int ras_devlink_event_handler(struct trace_seq *s, struct tm *tm; struct devlink_event ev; - if (ras->filter && pevent_filter_match(ras->filter, record) == FILTER_MATCH) + if (ras->filters[DEVLINK_EVENT] && + pevent_filter_match(ras->filters[DEVLINK_EVENT], record) == FILTER_MATCH) return 0; /* * Newer kernels (3.10-rc1 or upper) provide an uptime clock. diff --git a/ras-events.c b/ras-events.c index 6ba7a6a..d7286ed 100644 --- a/ras-events.c +++ b/ras-events.c @@ -570,7 +570,7 @@ static int select_tracing_timestamp(struct ras_events *ras) static int add_event_handler(struct ras_events *ras, struct pevent *pevent, unsigned page_size, char *group, char *event, - pevent_event_handler_func func, char *filter_str) + pevent_event_handler_func func, char *filter_str, int id) { int fd, size, rc; char *page, fname[MAX_PATH + 1]; @@ -639,7 +639,7 @@ static int add_event_handler(struct ras_events *ras, struct pevent *pevent, } } - ras->filter = filter; + ras->filters[id] = filter; /* Enable RAS events */ rc = __toggle_ras_mc_event(ras, group, event, 1); @@ -700,7 +700,7 @@ int handle_ras_events(int record_events) ras->record_events = record_events; rc = add_event_handler(ras, pevent, page_size, "ras", "mc_event", - ras_mc_event_handler, NULL); + ras_mc_event_handler, NULL, MC_EVENT); if (!rc) num_events++; else @@ -709,7 +709,7 @@ int handle_ras_events(int record_events) #ifdef HAVE_AER rc = add_event_handler(ras, pevent, page_size, "ras", "aer_event", - ras_aer_event_handler, NULL); + ras_aer_event_handler, NULL, AER_EVENT); if (!rc) num_events++; else @@ -719,7 +719,7 @@ int handle_ras_events(int record_events) #ifdef HAVE_NON_STANDARD rc = add_event_handler(ras, pevent, page_size, "ras", "non_standard_event", - ras_non_standard_event_handler, NULL); + ras_non_standard_event_handler, NULL, NON_STANDARD_EVENT); if (!rc) num_events++; else @@ -729,7 +729,7 @@ int handle_ras_events(int record_events) #ifdef HAVE_ARM rc = add_event_handler(ras, pevent, page_size, "ras", "arm_event", - ras_arm_event_handler, NULL); + ras_arm_event_handler, NULL, ARM_EVENT); if (!rc) num_events++; else @@ -746,7 +746,7 @@ int handle_ras_events(int record_events) if (ras->mce_priv) { rc = add_event_handler(ras, pevent, page_size, "mce", "mce_record", - ras_mce_event_handler, NULL); + ras_mce_event_handler, NULL, MCE_EVENT); if (!rc) num_events++; else @@ -757,7 +757,7 @@ int handle_ras_events(int record_events) #ifdef HAVE_EXTLOG rc = add_event_handler(ras, pevent, page_size, "ras", "extlog_mem_event", - ras_extlog_mem_event_handler, NULL); + ras_extlog_mem_event_handler, NULL, EXTLOG_EVENT); if (!rc) { /* tell kernel we are listening, so don't printk to console */ (void)open("/sys/kernel/debug/ras/daemon_active", 0); @@ -770,13 +770,13 @@ int handle_ras_events(int record_events) #ifdef HAVE_DEVLINK rc = add_event_handler(ras, pevent, page_size, "net", "net_dev_xmit_timeout", - ras_net_xmit_timeout_handler, NULL); + ras_net_xmit_timeout_handler, NULL, DEVLINK_EVENT); if (!rc) filter_str = "devlink/devlink_health_report:msg=~\'TX timeout*\'"; rc = add_event_handler(ras, pevent, page_size, "devlink", "devlink_health_report", - ras_devlink_event_handler, filter_str); + ras_devlink_event_handler, filter_str, DEVLINK_EVENT); if (!rc) num_events++; else @@ -834,8 +834,10 @@ err: pevent_free(pevent); if (ras) { - if (ras->filter) - pevent_filter_free(ras->filter); + for (i = 0; i < NR_EVENTS; i++) { + if (ras->filters[i]) + pevent_filter_free(ras->filters[i]); + } free(ras); } diff --git a/ras-events.h b/ras-events.h index 2fae2f1..0234f32 100644 --- a/ras-events.h +++ b/ras-events.h @@ -29,6 +29,17 @@ struct mce_priv; +enum { + MC_EVENT, + MCE_EVENT, + AER_EVENT, + NON_STANDARD_EVENT, + ARM_EVENT, + EXTLOG_EVENT, + DEVLINK_EVENT, + NR_EVENTS +}; + struct ras_events { char debugfs[MAX_PATH + 1]; char tracing[MAX_PATH + 1]; @@ -51,7 +62,7 @@ struct ras_events { /* For ABRT socket*/ int socketfd; - struct event_filter *filter; + struct event_filter *filters[NR_EVENTS]; }; struct pthread_data { diff --git a/ras-report.h b/ras-report.h index cb133a1..2addccb 100644 --- a/ras-report.h +++ b/ras-report.h @@ -29,15 +29,6 @@ /* ABRT socket file */ #define ABRT_SOCKET "/var/run/abrt/abrt.socket" -enum { - MC_EVENT, - MCE_EVENT, - AER_EVENT, - NON_STANDARD_EVENT, - ARM_EVENT, - DEVLINK_EVENT -}; - #ifdef HAVE_ABRT_REPORT int ras_report_mc_event(struct ras_events *ras, struct ras_mc_event *ev);