tracing: ->filter cleanups
Steven Rostedt
maintainercover tracing: ->filter cleanups
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
for-next
Head SHA1: 6355d54438bfc3b636cb6453cd091f782fb9b4d7
Oleg Nesterov (7):
tracing: Kill destroy_preds() and destroy_file_preds()
tracing: Kill destroy_call_preds()
tracing: Kill call_filter_disable()
tracing/uprobes: Kill the dead TRACE_EVENT_FL_USE_CALL_FILTER logic
tracing: Kill ftrace_event_call->files
tracing: Change apply_subsystem_event_filter() paths to check file->system == dir
tracing: Kill "filter_string" arg of replace_preds()
----
include/linux/ftrace_event.h | 3 -- kernel/trace/trace_events.c | 4 +-- kernel/trace/trace_events_filter.c | 73 +++++++++----------------------------- kernel/trace/trace_uprobe.c | 3 +- 4 files changed, 19 insertions(+), 64 deletions(-)
Steven Rostedt
maintainerPATCH 1/7 tracing: Kill destroy_preds() and destroy_file_preds()
From: Oleg Nesterov <[email protected]>
destroy_preds() makes no sense.
The only caller, event_remove(), actually wants destroy_file_preds(). __trace_remove_event_call() does destroy_call_preds() which takes care of call->filter.
And after the previous change we can simply remove destroy_preds() from event_remove(), we are going to call remove_event_from_tracers() which in turn calls remove_event_file_dir()->free_event_filter().
--- include/linux/ftrace_event.h | 1 - kernel/trace/trace_events.c | 1 - kernel/trace/trace_events_filter.c | 20 -------------------- 3 files changed, 22 deletions(-)
include/linux/ftrace_event.h +0 -1
@@ -404,7 +404,6 @@ enum event_trigger_type { ETT_EVENT_ENABLE = (1 << 3), }; -extern void destroy_preds (struct ftrace_event_file *file);extern void destroy_call_preds (struct ftrace_event_call *call);extern int filter_match_preds (struct event_filter *filter,void *rec);
kernel/trace/trace_events.c +0 -1
@@ -1621,7 +1621,6 @@ static void event_remove(struct ftrace_event_call *call)if (file->event_call != call)continue ;ftrace_event_enable_disable (file,0 ); -destroy_preds (file);/* * The do_for_each_event_file() is * a double loop. After finding the call for this
kernel/trace/trace_events_filter.c +0 -20
@@ -810,26 +810,6 @@ void destroy_call_preds(struct ftrace_event_call *call) call->filter =NULL ; } -static void destroy_file_preds (struct ftrace_event_file *file) -{ -__free_filter (file->filter); - file->filter =NULL ; -} - -/* -* Called when destroying the ftrace_event_file. -* The file is being freed, so we do not need to worry about -* the file being currently used. This is for module code removing -* the tracepoints from within it. -*/ -void destroy_preds (struct ftrace_event_file *file) -{ -if (file->event_call->flags &TRACE_EVENT_FL_USE_CALL_FILTER ) -destroy_call_preds (file->event_call); -else -destroy_file_preds (file); -} -static struct event_filter *__alloc_filter (void ) {struct event_filter *filter;
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 2/7 tracing: Kill destroy_call_preds()
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
Remove destroy_call_preds(). Its only caller, __trace_remove_event_call(), can use free_event_filter() and nullify ->filter by hand.
Perhaps we could keep this trivial helper although imo it is pointless, but then it should be static in trace_events.c.
--- include/linux/ftrace_event.h | 1 - kernel/trace/trace_events.c | 3 ++- kernel/trace/trace_events_filter.c | 6 ------ 3 files changed, 2 insertions(+), 8 deletions(-)
include/linux/ftrace_event.h +0 -1
@@ -404,7 +404,6 @@ enum event_trigger_type { ETT_EVENT_ENABLE = (1 << 3), }; -extern void destroy_call_preds (struct ftrace_event_call *call);extern int filter_match_preds (struct event_filter *filter,void *rec); extern int filter_check_discard(struct ftrace_event_file *file, void *rec,
kernel/trace/trace_events.c +2 -1
@@ -1748,7 +1748,8 @@ static void __trace_remove_event_call(struct ftrace_event_call *call) {event_remove (call);trace_destroy_fields (call); -destroy_call_preds (call); +free_event_filter (call->filter); + call->filter =NULL ; }static int probe_remove_event_call (struct ftrace_event_call *call)
kernel/trace/trace_events_filter.c +0 -6
@@ -804,12 +804,6 @@ void free_event_filter(struct event_filter *filter)__free_filter (filter); } -void destroy_call_preds (struct ftrace_event_call *call) -{ -__free_filter (call->filter); - call->filter =NULL ; -} -static struct event_filter *__alloc_filter (void ) {struct event_filter *filter;
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 3/7 tracing: Kill call_filter_disable()
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
It seems that the only purpose of call_filter_disable() is to make filter_disable() less clear and symmetrical, remove it.
--- kernel/trace/trace_events_filter.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
kernel/trace/trace_events_filter.c +1 -6
@@ -774,17 +774,12 @@ static void __free_preds(struct event_filter *filter) filter->n_preds =0 ; } -static void call_filter_disable (struct ftrace_event_call *call) -{ - call->flags &= ~TRACE_EVENT_FL_FILTERED ; -} -static void filter_disable (struct ftrace_event_file *file) {struct ftrace_event_call *call = file->event_call;if (call->flags &TRACE_EVENT_FL_USE_CALL_FILTER ) -call_filter_disable (call); + call->flags &= ~TRACE_EVENT_FL_FILTERED ;else file->flags &= ~FTRACE_EVENT_FL_FILTERED ; }
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 4/7 tracing/uprobes: Kill the dead TRACE_EVENT_FL_USE_CALL_FILTER logic
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
alloc_trace_uprobe() sets TRACE_EVENT_FL_USE_CALL_FILTER for unknown reason and this is simply wrong. Fortunately this has no effect because register_uprobe_event() clears call->flags after that.
Kill both. This trace_uprobe was kzalloc'ed and we rely on this fact anyway.
--- kernel/trace/trace_uprobe.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/trace/trace_uprobe.c +1 -2
@@ -265,7 +265,6 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret)if (is_ret) tu->consumer.ret_handler = uretprobe_dispatcher;init_trace_uprobe_filter (&tu->filter); - tu->tp.call.flags |=TRACE_EVENT_FL_USE_CALL_FILTER ;return tu; error:
@@ -1292,7 +1291,7 @@ static int register_uprobe_event(struct trace_uprobe *tu)kfree (call->print_fmt);return -ENODEV ; } - call->flags =0 ; + call->class->reg = trace_uprobe_register; call->data = tu; ret =trace_add_event_call (call);
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 5/7 tracing: Kill ftrace_event_call->files
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
Remove ftrace_event_call->files. It has no users, and in fact even the commit ae63b31e4d0e "tracing: Separate out trace events from global variables" which added this member did not use it.
--- include/linux/ftrace_event.h | 1 - 1 file changed, 1 deletion(-)
include/linux/ftrace_event.h +0 -1
@@ -272,7 +272,6 @@ struct ftrace_event_call {struct trace_event event;const char *print_fmt;struct event_filter *filter; -struct list_head *files;void *mod;void *data;/*
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 6/7 tracing: Change apply_subsystem_event_filter() paths to check file->system == dir
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
filter_free_subsystem_preds(), filter_free_subsystem_filters() and replace_system_preds() can simply check file->system->subsystem and avoid strcmp(call->class->system).
Better yet, we can pass "struct ftrace_subsystem_dir *dir" instead of event_subsystem and just check file->system == dir.
Thanks to Namhyung Kim who pointed out that replace_system_preds() can be changed too.
--- kernel/trace/trace_events_filter.c | 39 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 23 deletions(-)
kernel/trace/trace_events_filter.c +16 -23
@@ -842,17 +842,14 @@ static inline void __remove_filter(struct ftrace_event_file *file)remove_filter_string (file->filter); } -static void filter_free_subsystem_preds (struct event_subsystem *system, +static void filter_free_subsystem_preds (struct ftrace_subsystem_dir *dir,struct trace_array *tr) {struct ftrace_event_file *file; -struct ftrace_event_call *call;list_for_each_entry (file, &tr->events, list) { - call = file->event_call; -if (strcmp (call->class->system, system->name) !=0 ) +if (file->system != dir)continue ; -__remove_filter (file); } }
@@ -870,15 +867,13 @@ static inline void __free_subsystem_filter(struct ftrace_event_file *file) } } -static void filter_free_subsystem_filters (struct event_subsystem *system, +static void filter_free_subsystem_filters (struct ftrace_subsystem_dir *dir,struct trace_array *tr) {struct ftrace_event_file *file; -struct ftrace_event_call *call;list_for_each_entry (file, &tr->events, list) { - call = file->event_call; -if (strcmp (call->class->system, system->name) !=0 ) +if (file->system != dir)continue ;__free_subsystem_filter (file); }
@@ -1724,13 +1719,12 @@ struct filter_list {struct event_filter *filter; }; -static int replace_system_preds (struct event_subsystem *system, +static int replace_system_preds (struct ftrace_subsystem_dir *dir,struct trace_array *tr,struct filter_parse_state *ps,char *filter_string) {struct ftrace_event_file *file; -struct ftrace_event_call *call;struct filter_list *filter_item;struct filter_list *tmp;LIST_HEAD (filter_list);
@@ -1738,15 +1732,15 @@ static int replace_system_preds(struct event_subsystem *system,int err;list_for_each_entry (file, &tr->events, list) { - call = file->event_call; -if (strcmp (call->class->system, system->name) !=0 ) +if (file->system != dir)continue ;/* * Try to see if the filter can be applied * (filter arg is ignored on dry_run) */ - err =replace_preds (call,NULL , ps, filter_string, true); + err =replace_preds (file->event_call,NULL , ps, + filter_string, true);if (err)event_set_no_set_filter_flag (file);else
@@ -1756,9 +1750,7 @@ static int replace_system_preds(struct event_subsystem *system,list_for_each_entry (file, &tr->events, list) {struct event_filter *filter; - call = file->event_call; - -if (strcmp (call->class->system, system->name) !=0 ) +if (file->system != dir)continue ;if (event_no_set_filter_flag (file))
@@ -1780,7 +1772,8 @@ static int replace_system_preds(struct event_subsystem *system,if (err) goto fail_mem; - err =replace_preds (call, filter, ps, filter_string, false); + err =replace_preds (file->event_call, filter, ps, + filter_string, false);if (err) {filter_disable (file);parse_error (ps,FILT_ERR_BAD_SUBSYS_FILTER ,0 );
@@ -1928,7 +1921,7 @@ int create_event_filter(struct ftrace_event_call *call,* Identical to create_filter() except that it creates a subsystem filter * and always remembers @filter_str. */ -static int create_system_filter (struct event_subsystem *system, +static int create_system_filter (struct ftrace_subsystem_dir *dir,struct trace_array *tr,char *filter_str,struct event_filter **filterp) {
@@ -1938,7 +1931,7 @@ static int create_system_filter(struct event_subsystem *system, err =create_filter_start (filter_str, true, &ps, &filter);if (!err) { - err =replace_system_preds (system, tr, ps, filter_str); + err =replace_system_preds (dir, tr, ps, filter_str);if (!err) {/* System filters just show a default message */ kfree (filter->filter_string);
@@ -2022,18 +2015,18 @@ int apply_subsystem_event_filter(struct ftrace_subsystem_dir *dir, }if (!strcmp (strstrip (filter_string),"0" )) { -filter_free_subsystem_preds (system, tr); +filter_free_subsystem_preds (dir, tr);remove_filter_string (system->filter); filter = system->filter; system->filter =NULL ;/* Ensure all filters are no longer used */ synchronize_sched (); -filter_free_subsystem_filters (system, tr); +filter_free_subsystem_filters (dir, tr);__free_filter (filter); goto out_unlock; } - err =create_system_filter (system, tr, filter_string, &filter); + err =create_system_filter (dir, tr, filter_string, &filter);if (filter) {/* * No event actually uses the system filter
Signature · 1 line
2.0.1
Steven Rostedt
maintainerPATCH 7/7 tracing: Kill "filter_string" arg of replace_preds()
In reply to Steven RostedtFrom: Oleg Nesterov <[email protected]>
Cosmetic, but replace_preds() doesn't need/use "char *filter_string". Remove it to microsimplify the code.
--- kernel/trace/trace_events_filter.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
kernel/trace/trace_events_filter.c +3 -6
@@ -1546,7 +1546,6 @@ static int fold_pred_tree(struct event_filter *filter,static int replace_preds (struct ftrace_event_call *call,struct event_filter *filter,struct filter_parse_state *ps, -char *filter_string,bool dry_run) {char *operand1 =NULL , *operand2 =NULL ;
@@ -1739,8 +1738,7 @@ static int replace_system_preds(struct ftrace_subsystem_dir *dir,* Try to see if the filter can be applied * (filter arg is ignored on dry_run) */ - err =replace_preds (file->event_call,NULL , ps, - filter_string, true); + err =replace_preds (file->event_call,NULL , ps, true);if (err)event_set_no_set_filter_flag (file);else
@@ -1772,8 +1770,7 @@ static int replace_system_preds(struct ftrace_subsystem_dir *dir,if (err) goto fail_mem; - err =replace_preds (file->event_call, filter, ps, - filter_string, false); + err =replace_preds (file->event_call, filter, ps, false);if (err) {filter_disable (file);parse_error (ps,FILT_ERR_BAD_SUBSYS_FILTER ,0 );
@@ -1895,7 +1892,7 @@ static int create_filter(struct ftrace_event_call *call, err =create_filter_start (filter_str, set_str, &ps, &filter);if (!err) { - err =replace_preds (call, filter, ps, filter_str, false); + err =replace_preds (call, filter, ps, false);if (err && set_str)append_filter_err (ps, filter); }
Signature · 1 line
2.0.1