Skip to content

Commit

Permalink
ftrace: do not profile functions when disabled
Browse files Browse the repository at this point in the history
A race was found that if one were to enable and disable the function
profiler repeatedly, then the system can panic. This was because a profiled
function may be preempted just before disabling interrupts. While
the profiler is disabled and then reenabled, the preempted function
could start again, and access the hash as it is being initialized.

This just adds a check in the irq disabled part to check if the profiler
is enabled, and if it is not then it will just exit.

When the system is disabled, the profile_enabled variable is cleared
before calling the unregistering of the function profiler. This
unregistering calls stop machine which also acts as a synchronize schedule.

[ Impact: fix panic in enabling/disabling function profiler ]

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jun 2, 2009
1 parent 112f38a commit 0f6ce3d
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions kernel/trace/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ function_profile_call(unsigned long ip, unsigned long parent_ip)
local_irq_save(flags);

stat = &__get_cpu_var(ftrace_profile_stats);
if (!stat->hash)
if (!stat->hash || !ftrace_profile_enabled)
goto out;

rec = ftrace_find_profiled_func(stat, ip);
Expand Down Expand Up @@ -630,7 +630,7 @@ static void profile_graph_return(struct ftrace_graph_ret *trace)

local_irq_save(flags);
stat = &__get_cpu_var(ftrace_profile_stats);
if (!stat->hash)
if (!stat->hash || !ftrace_profile_enabled)
goto out;

calltime = trace->rettime - trace->calltime;
Expand Down Expand Up @@ -724,6 +724,10 @@ ftrace_profile_write(struct file *filp, const char __user *ubuf,
ftrace_profile_enabled = 1;
} else {
ftrace_profile_enabled = 0;
/*
* unregister_ftrace_profiler calls stop_machine
* so this acts like an synchronize_sched.
*/
unregister_ftrace_profiler();
}
}
Expand Down

0 comments on commit 0f6ce3d

Please sign in to comment.