Messages in this thread Patch in this message | | | From | Nicholas Lowell <> | Subject | [PATCH v2] trace: tracing_event_filter: fast path when no subsystem filters | Date | Mon, 2 Oct 2023 10:41:48 -0400 |
| |
From: Nicholas Lowell <nlowell@lexmark.com>
If there are no filters in the event subsystem, then there's no reason to continue and hit the potentially time consuming tracepoint_synchronize_unregister function. This should give a speed up for initial disabling/configuring
Signed-off-by: Nicholas Lowell <nlowell@lexmark.com> ---
Notes: v2: switch from needless counting to boolean WARN_ON_ONCE if no preds but filter exists
kernel/trace/trace_events_filter.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 33264e510d16..baa108f88032 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -1317,22 +1317,29 @@ void free_event_filter(struct event_filter *filter) __free_filter(filter); } -static inline void __remove_filter(struct trace_event_file *file) +static inline bool __remove_filter(struct trace_event_file *file) { filter_disable(file); + if (!file->filter) + return false; + remove_filter_string(file->filter); + return true; } -static void filter_free_subsystem_preds(struct trace_subsystem_dir *dir, +static bool filter_free_subsystem_preds(struct trace_subsystem_dir *dir, struct trace_array *tr) { struct trace_event_file *file; + bool do_sync = false; list_for_each_entry(file, &tr->events, list) { if (file->system != dir) continue; - __remove_filter(file); + if (__remove_filter(file)) + do_sync = true; } + return do_sync; } static inline void __free_subsystem_filter(struct trace_event_file *file) @@ -2411,7 +2418,12 @@ int apply_subsystem_event_filter(struct trace_subsystem_dir *dir, } if (!strcmp(strstrip(filter_string), "0")) { - filter_free_subsystem_preds(dir, tr); + /* If nothing was freed, we do not need to sync */ + if (!filter_free_subsystem_preds(dir, tr)) { + if(!(WARN_ON_ONCE(system->filter))) + goto out_unlock; + } + remove_filter_string(system->filter); filter = system->filter; system->filter = NULL; -- 2.25.1
| |