tracing: Various memory leak fixes
Subsystems (3)
Steven Rostedt
maintainerLinus,
While running various ftrace tests on new development code, the kmemleak detector found some allocations that were not freed correctly.
This fixes a couple of leaks in the event trigger code as well as in adding function trace filters in trace instances.
Please pull the latest trace-v4.20-rc6 tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
trace-v4.20-rc6
Tag SHA1: 4e790ad722f2a0e23f8e36f307c23b07924235ed Head SHA1: 2840f84f74035e5a535959d5f17269c69fa6edc5
Steven Rostedt (VMware) (3):
tracing: Fix memory leak in create_filter()
tracing: Fix memory leak in set_trigger_filter()
tracing: Fix memory leak of instance function hash filters
----
kernel/trace/ftrace.c | 1 + kernel/trace/trace_events_filter.c | 5 ++++- kernel/trace/trace_events_trigger.c | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-)
Steven Rostedt
maintainerPATCH 1/3 tracing: Fix memory leak in create_filter()
From: "Steven Rostedt (VMware)" <[email protected]>
The create_filter() calls create_filter_start() which allocates a "parse_error" descriptor, but fails to call create_filter_finish() that frees it.
The op_stack and inverts in predicate_parse() were also not freed.
Found by kmemleak detector.
--- kernel/trace/trace_events_filter.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
kernel/trace/trace_events_filter.c +4 -1
@@ -570,11 +570,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds, } } +kfree (op_stack); +kfree (inverts);return prog; out_free:kfree (op_stack); -kfree (prog_stack);kfree (inverts); +kfree (prog_stack);return ERR_PTR (ret); }
@@ -1718,6 +1720,7 @@ static int create_filter(struct trace_event_call *call, err =process_preds (call, filter_string, *filterp, pe);if (err && set_str)append_filter_err (pe, *filterp); +create_filter_finish (pe);return err; }
Signature · 1 line
2.19.1
Steven Rostedt
maintainerPATCH 2/3 tracing: Fix memory leak in set_trigger_filter()
In reply to Steven RostedtFrom: "Steven Rostedt (VMware)" <[email protected]>
When create_event_filter() fails in set_trigger_filter(), the filter may still be allocated and needs to be freed. The caller expects the data->filter to be updated with the new filter, even if the new filter failed (we could add an error message by setting set_str parameter of create_event_filter(), but that's another update).
But because the error would just exit, filter was left hanging and nothing could free it.
Found by kmemleak detector.
--- kernel/trace/trace_events_trigger.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/trace/trace_events_trigger.c +4 -2
@@ -732,8 +732,10 @@ int set_trigger_filter(char *filter_str,/* The filter is for the 'trigger' event, not the triggered event */ ret =create_event_filter (file->event_call, filter_str, false, &filter); -if (ret) - goto out; +/* +* If create_event_filter() fails, filter still needs to be freed. +* Which the calling code will do with data->filter. +*/ assign: tmp =rcu_access_pointer (data->filter);
Signature · 1 line
2.19.1
Steven Rostedt
maintainerPATCH 3/3 tracing: Fix memory leak of instance function hash filters
In reply to Steven RostedtFrom: "Steven Rostedt (VMware)" <[email protected]>
The following commands will cause a memory leak:
# cd /sys/kernel/tracing # mkdir instances/foo # echo schedule > instance/foo/set_ftrace_filter # rmdir instances/foo
The reason is that the hashes that hold the filters to set_ftrace_filter and set_ftrace_notrace are not freed if they contain any data on the instance and the instance is removed.
Found by kmemleak detector.
--- kernel/trace/ftrace.c | 1 + 1 file changed, 1 insertion(+)
kernel/trace/ftrace.c +1 -0
@@ -5460,6 +5460,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops)if (ops->flags &FTRACE_OPS_FL_ENABLED )ftrace_shutdown (ops,0 ); ops->flags |=FTRACE_OPS_FL_DELETED ; +ftrace_free_filter (ops);mutex_unlock (&ftrace_lock); }
Signature · 1 line
2.19.1