[PATCH v2 6/7] tracing: Add a filter argument to __ftrace_set_clr_event()
From: Thomas Weißschuh <hidden>
Date: 2026-09-08 06:22:21
Also in:
linux-doc, lkml
Subsystem:
the rest, tracing · Maintainers:
Linus Torvalds, Steven Rostedt, Masami Hiramatsu
Make it possible to directly enable a filter when enabling an event. For now this is unused, an upcoming patch will wire it up. Signed-off-by: Thomas Weißschuh <redacted> --- kernel/trace/trace_events.c | 47 +++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 7a491dbe6e81..f8881a9d3c7a 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c@@ -943,6 +943,7 @@ struct event_mod_load { char *match; char *system; char *event; + char *filter; }; static void free_event_mod(struct event_mod_load *event_mod)
@@ -952,6 +953,7 @@ static void free_event_mod(struct event_mod_load *event_mod) kfree(event_mod->match); kfree(event_mod->system); kfree(event_mod->event); + kfree(event_mod->filter); kfree(event_mod); }
@@ -993,7 +995,7 @@ static int remove_cache_mod(struct trace_array *tr, const char *mod, } static int cache_mod(struct trace_array *tr, const char *mod, int set, - const char *match, const char *system, const char *event) + const char *match, const char *system, const char *event, const char *filter) { struct event_mod_load *event_mod;
@@ -1032,6 +1034,12 @@ static int cache_mod(struct trace_array *tr, const char *mod, int set, goto out_free; } + if (filter) { + event_mod->filter = kstrdup(filter, GFP_KERNEL); + if (!event_mod->filter) + goto out_free; + } + list_add(&event_mod->list, &tr->mod_events); return 0;
@@ -1044,7 +1052,7 @@ static int cache_mod(struct trace_array *tr, const char *mod, int set, #else /* CONFIG_MODULES */ static inline void clear_mod_events(struct trace_array *tr) { } static int cache_mod(struct trace_array *tr, const char *mod, int set, - const char *match, const char *system, const char *event) + const char *match, const char *system, const char *event, const char *filter) { return -EINVAL; }
@@ -1353,7 +1361,7 @@ static void remove_event_file_dir(struct trace_event_file *file) static int __ftrace_set_clr_event_nolock(struct trace_array *tr, const char *match, const char *sub, const char *event, int set, - const char *mod) + const char *mod, char *filter) { struct trace_event_file *file; struct trace_event_call *call;
@@ -1403,7 +1411,11 @@ __ftrace_set_clr_event_nolock(struct trace_array *tr, const char *match, if (event && strcmp(event, name) != 0) continue; - ret = ftrace_event_enable_disable(file, set); + if (filter) + ret = apply_event_filter(file, filter); + + if (!filter || !ret) + ret = ftrace_event_enable_disable(file, set); /* * Save the first error and return that. Some events
@@ -1421,14 +1433,14 @@ __ftrace_set_clr_event_nolock(struct trace_array *tr, const char *match, * check if the module was loaded. If it wasn't cache it. */ if (module && ret == -EINVAL && !eret) - ret = cache_mod(tr, module, set, match, sub, event); + ret = cache_mod(tr, module, set, match, sub, event, filter); return ret; } static int __ftrace_set_clr_event(struct trace_array *tr, const char *match, const char *sub, const char *event, int set, - const char *mod) + const char *mod, char *filter) { int ret;
@@ -1436,7 +1448,7 @@ static int __ftrace_set_clr_event(struct trace_array *tr, const char *match, return -EACCES; mutex_lock(&event_mutex); - ret = __ftrace_set_clr_event_nolock(tr, match, sub, event, set, mod); + ret = __ftrace_set_clr_event_nolock(tr, match, sub, event, set, mod, filter); mutex_unlock(&event_mutex); return ret;
@@ -1499,7 +1511,7 @@ int ftrace_set_clr_event(struct trace_array *tr, const char *arg_buf, int set) ftrace_parse_event_string(dupped_buf, &match, &sub, &event, &mod); - return __ftrace_set_clr_event(tr, match, sub, event, set, mod); + return __ftrace_set_clr_event(tr, match, sub, event, set, mod, NULL); } /**
@@ -1521,7 +1533,7 @@ int trace_set_clr_event(const char *system, const char *event, int set) if (!tr) return -ENODEV; - return __ftrace_set_clr_event(tr, NULL, system, event, set, NULL); + return __ftrace_set_clr_event(tr, NULL, system, event, set, NULL, NULL); } EXPORT_SYMBOL_GPL(trace_set_clr_event);
@@ -1547,7 +1559,7 @@ int trace_array_set_clr_event(struct trace_array *tr, const char *system, return -ENOENT; set = (enable == true) ? 1 : 0; - return __ftrace_set_clr_event(tr, NULL, system, event, set, NULL); + return __ftrace_set_clr_event(tr, NULL, system, event, set, NULL, NULL); } EXPORT_SYMBOL_GPL(trace_array_set_clr_event);
@@ -2067,7 +2079,7 @@ system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, if (system) name = system->name; - ret = __ftrace_set_clr_event(dir->tr, NULL, name, NULL, val, NULL); + ret = __ftrace_set_clr_event(dir->tr, NULL, name, NULL, val, NULL, NULL); if (ret) goto out;
@@ -4022,7 +4034,8 @@ static void update_mod_cache(struct trace_array *tr, struct module *mod) __ftrace_set_clr_event_nolock(tr, event_mod->match, event_mod->system, - event_mod->event, 1, mod->name); + event_mod->event, 1, mod->name, + event_mod->filter); free_event_mod(event_mod); } }
@@ -4796,7 +4809,7 @@ int event_trace_del_tracer(struct trace_array *tr) __ftrace_clear_event_pids(tr, TRACE_PIDS | TRACE_NO_PIDS); /* Disable any running events */ - __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0, NULL); + __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0, NULL, NULL); /* Make sure no more events are being executed */ tracepoint_synchronize_unregister();
@@ -5106,7 +5119,7 @@ static __init void event_trace_self_tests(void) pr_info("Testing event system %s: ", system->name); - ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 1, NULL); + ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 1, NULL, NULL); if (WARN_ON_ONCE(ret)) { pr_warn("error enabling system %s\n", system->name);
@@ -5115,7 +5128,7 @@ static __init void event_trace_self_tests(void) event_test_stuff(); - ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 0, NULL); + ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 0, NULL, NULL); if (WARN_ON_ONCE(ret)) { pr_warn("error disabling system %s\n", system->name);
@@ -5130,7 +5143,7 @@ static __init void event_trace_self_tests(void) pr_info("Running tests on all trace events:\n"); pr_info("Testing all events: "); - ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 1, NULL); + ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 1, NULL, NULL); if (WARN_ON_ONCE(ret)) { pr_warn("error enabling all events\n"); return;
@@ -5139,7 +5152,7 @@ static __init void event_trace_self_tests(void) event_test_stuff(); /* reset sysname */ - ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 0, NULL); + ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 0, NULL, NULL); if (WARN_ON_ONCE(ret)) { pr_warn("error disabling all events\n"); return;
--
2.55.0