Commit c58b4321 authored by Li Zefan's avatar Li Zefan Committed by Frederic Weisbecker

tracing/filters: Defer pred allocation, fix memory leak

The predicates of an event and their filter structure are allocated
when we create an event filter for the first time.

These objects must be created once but each time we come with a new
filter, we overwrite such pre-existing allocation, if any.

Thus, this patch checks if the filter has already been allocated
before going ahead.
Spotted-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
LKML-Reference: <4A9CB1BA.3060402@cn.fujitsu.com>
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
parent 8e254c1d
...@@ -409,6 +409,9 @@ static int init_preds(struct ftrace_event_call *call) ...@@ -409,6 +409,9 @@ static int init_preds(struct ftrace_event_call *call)
struct filter_pred *pred; struct filter_pred *pred;
int i; int i;
if (call->filter)
return 0;
filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL); filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
if (!call->filter) if (!call->filter)
return -ENOMEM; return -ENOMEM;
...@@ -447,11 +450,9 @@ static int init_subsystem_preds(struct event_subsystem *system) ...@@ -447,11 +450,9 @@ static int init_subsystem_preds(struct event_subsystem *system)
if (strcmp(call->system, system->name) != 0) if (strcmp(call->system, system->name) != 0)
continue; continue;
if (!call->filter) { err = init_preds(call);
err = init_preds(call); if (err)
if (err) return err;
return err;
}
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment