Commit cf46e6e7 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Zefan Li

ftrace: Fix ftrace enable ordering of sysctl ftrace_enabled

commit 524a3868 upstream.

Some archs (specifically PowerPC), are sensitive with the ordering of
the enabling of the calls to function tracing and setting of the
function to use to be traced.

That is, update_ftrace_function() sets what function the ftrace_caller
trampoline should call. Some archs require this to be set before
calling ftrace_run_update_code().

Another bug was discovered, that ftrace_startup_sysctl() called
ftrace_run_update_code() directly. If the function the ftrace_caller
trampoline changes, then it will not be updated. Instead a call
to ftrace_startup_enable() should be called because it tests to see
if the callback changed since the code was disabled, and will
tell the arch to update appropriately. Most archs do not need this
notification, but PowerPC does.

The problem could be seen by the following commands:

 # echo 0 > /proc/sys/kernel/ftrace_enabled
 # echo function > /sys/kernel/debug/tracing/current_tracer
 # echo 1 > /proc/sys/kernel/ftrace_enabled
 # cat /sys/kernel/debug/tracing/trace

The trace will show that function tracing was not active.
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarZefan Li <lizefan@huawei.com>
parent 2d4293a8
...@@ -2074,7 +2074,7 @@ static void ftrace_startup_sysctl(void) ...@@ -2074,7 +2074,7 @@ static void ftrace_startup_sysctl(void)
command = FTRACE_UPDATE_CALLS; command = FTRACE_UPDATE_CALLS;
if (ftrace_graph_active) if (ftrace_graph_active)
command |= FTRACE_START_FUNC_RET; command |= FTRACE_START_FUNC_RET;
ftrace_run_update_code(command); ftrace_startup_enable(command);
} }
} }
...@@ -4463,12 +4463,12 @@ ftrace_enable_sysctl(struct ctl_table *table, int write, ...@@ -4463,12 +4463,12 @@ ftrace_enable_sysctl(struct ctl_table *table, int write,
if (ftrace_enabled) { if (ftrace_enabled) {
ftrace_startup_sysctl();
/* we are starting ftrace again */ /* we are starting ftrace again */
if (ftrace_ops_list != &ftrace_list_end) if (ftrace_ops_list != &ftrace_list_end)
update_ftrace_function(); update_ftrace_function();
ftrace_startup_sysctl();
} else { } else {
/* stopping ftrace calls (just send to ftrace_stub) */ /* stopping ftrace calls (just send to ftrace_stub) */
ftrace_trace_function = ftrace_stub; ftrace_trace_function = ftrace_stub;
......
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