aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2009-09-01 13:31:38 +0800
committerFrederic Weisbecker <fweisbec@gmail.com>2009-09-04 23:22:33 +0200
commitc58b43218c1a04a0bcf338ea47406c759ac28e11 (patch)
treee13e33f195a13b4c959494ee7d059b87c2167be3 /kernel/trace
parenttracing/filters: Defer pred allocation (diff)
downloadlinux-dev-c58b43218c1a04a0bcf338ea47406c759ac28e11.tar.xz
linux-dev-c58b43218c1a04a0bcf338ea47406c759ac28e11.zip
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: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Li 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: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/trace_events_filter.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index c6b2edfb7fe9..93660fbbf629 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -409,6 +409,9 @@ static int init_preds(struct ftrace_event_call *call)
struct filter_pred *pred;
int i;
+ if (call->filter)
+ return 0;
+
filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
if (!call->filter)
return -ENOMEM;
@@ -447,11 +450,9 @@ static int init_subsystem_preds(struct event_subsystem *system)
if (strcmp(call->system, system->name) != 0)
continue;
- if (!call->filter) {
- err = init_preds(call);
- if (err)
- return err;
- }
+ err = init_preds(call);
+ if (err)
+ return err;
}
return 0;