mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-22 01:10:28 +00:00
ftrace: do not profile functions when disabled
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>
This commit is contained in:
parent
112f38a7e3
commit
0f6ce3de4e
@ -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);
|
||||
@ -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;
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user