Skip to content

Commit

Permalink
tracing: Check total refcount before releasing bufs in profile_enable…
Browse files Browse the repository at this point in the history
… failure

When we call the profile_enable() callback of an event, we release the
shared perf event tracing buffers unconditionnaly in the failure path.
This is wrong because there may be other users of these. Then check the
total refcount before doing this.

Reported-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Li Zefan <lizf@cn.fujitsu.com>
  • Loading branch information
Frederic Weisbecker committed Oct 5, 2009
1 parent 8a0382f commit fe8e5b5
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions kernel/trace/trace_event_profile.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event)
if (atomic_inc_return(&event->profile_count))
return 0;

if (!total_profile_count++) {
if (!total_profile_count) {
buf = (char *)alloc_percpu(profile_buf_t);
if (!buf)
goto fail_buf;
Expand All @@ -46,14 +46,19 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event)
}

ret = event->profile_enable();
if (!ret)
if (!ret) {
total_profile_count++;
return 0;
}

kfree(trace_profile_buf_nmi);
fail_buf_nmi:
kfree(trace_profile_buf);
if (!total_profile_count) {
kfree(trace_profile_buf_nmi);
kfree(trace_profile_buf);
trace_profile_buf_nmi = NULL;
trace_profile_buf = NULL;
}
fail_buf:
total_profile_count--;
atomic_dec(&event->profile_count);

return ret;
Expand Down

0 comments on commit fe8e5b5

Please sign in to comment.