From: Yang Shi Date: Mon, 4 Apr 2022 23:34:05 +0000 (-0700) Subject: rasdaemon: use the new block_rq_error tracepoint X-Git-Tag: v0.7.0~22 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9c86f6255f67a8bae28cd46c54500fc16bfc7a30;p=users%2Fmchehab%2Frasdaemon.git rasdaemon: use the new block_rq_error tracepoint Since Linux 5.18-rc1 a new block tracepoint called block_rq_error is available for tracing disk error events dedicatedly. Currently rasdaemon is using block_rq_complete which also traces successful cases. It incurs excessive tracing logs and somehow overhead since the event is triggered quite often. Use the new tracepoint for disk error reporting, and the new trace point has the same format as block_rq_complete. Signed-off-by: Yang Shi Signed-off-by: Mauro Carvalho Chehab --- diff --git a/ras-events.c b/ras-events.c index 39cab20..3080a88 100644 --- a/ras-events.c +++ b/ras-events.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "libtrace/kbuffer.h" #include "libtrace/event-parse.h" #include "ras-mc-handler.h" @@ -230,8 +231,12 @@ int toggle_ras_mc_event(int enable) #endif #ifdef HAVE_DISKERROR +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,18,0) + rc |= __toggle_ras_mc_event(ras, "block", "block_rq_error", enable); +#else rc |= __toggle_ras_mc_event(ras, "block", "block_rq_complete", enable); #endif +#endif #ifdef HAVE_MEMORY_FAILURE rc |= __toggle_ras_mc_event(ras, "ras", "memory_failure_event", enable); @@ -242,6 +247,7 @@ free_ras: return rc; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) /* * Set kernel filter. libtrace doesn't provide an API for setting filters * in kernel, we have to implement it here. @@ -273,6 +279,7 @@ static int filter_ras_mc_event(struct ras_events *ras, char *group, char *event, return 0; } +#endif /* * Tracing read code @@ -902,6 +909,16 @@ int handle_ras_events(int record_events) #endif #ifdef HAVE_DISKERROR +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,18,0) + rc = add_event_handler(ras, pevent, page_size, "block", + "block_rq_error", ras_diskerror_event_handler, + NULL, DISKERROR_EVENT); + if (!rc) + num_events++; + else + log(ALL, LOG_ERR, "Can't get traces from %s:%s\n", + "block", "block_rq_error"); +#else rc = filter_ras_mc_event(ras, "block", "block_rq_complete", "error != 0"); if (!rc) { rc = add_event_handler(ras, pevent, page_size, "block", @@ -914,6 +931,7 @@ int handle_ras_events(int record_events) "block", "block_rq_complete"); } #endif +#endif #ifdef HAVE_MEMORY_FAILURE rc = add_event_handler(ras, pevent, page_size, "ras", "memory_failure_event", diff --git a/ras-record.c b/ras-record.c index d845f81..a367939 100644 --- a/ras-record.c +++ b/ras-record.c @@ -456,7 +456,7 @@ int ras_store_devlink_event(struct ras_events *ras, struct devlink_event *ev) #endif /* - * Table and functions to handle block:block_rq_complete + * Table and functions to handle block:block_rq_{complete|error} */ #ifdef HAVE_DISKERROR