diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index a6d098c6df3f..03cf44ac54d3 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1978,12 +1978,27 @@ int __weak ftrace_arch_code_modify_post_process(void) | |||
1978 | 1978 | ||
1979 | void ftrace_modify_all_code(int command) | 1979 | void ftrace_modify_all_code(int command) |
1980 | { | 1980 | { |
1981 | int update = command & FTRACE_UPDATE_TRACE_FUNC; | ||
1982 | |||
1983 | /* | ||
1984 | * If the ftrace_caller calls a ftrace_ops func directly, | ||
1985 | * we need to make sure that it only traces functions it | ||
1986 | * expects to trace. When doing the switch of functions, | ||
1987 | * we need to update to the ftrace_ops_list_func first | ||
1988 | * before the transition between old and new calls are set, | ||
1989 | * as the ftrace_ops_list_func will check the ops hashes | ||
1990 | * to make sure the ops are having the right functions | ||
1991 | * traced. | ||
1992 | */ | ||
1993 | if (update) | ||
1994 | ftrace_update_ftrace_func(ftrace_ops_list_func); | ||
1995 | |||
1981 | if (command & FTRACE_UPDATE_CALLS) | 1996 | if (command & FTRACE_UPDATE_CALLS) |
1982 | ftrace_replace_code(1); | 1997 | ftrace_replace_code(1); |
1983 | else if (command & FTRACE_DISABLE_CALLS) | 1998 | else if (command & FTRACE_DISABLE_CALLS) |
1984 | ftrace_replace_code(0); | 1999 | ftrace_replace_code(0); |
1985 | 2000 | ||
1986 | if (command & FTRACE_UPDATE_TRACE_FUNC) | 2001 | if (update && ftrace_trace_function != ftrace_ops_list_func) |
1987 | ftrace_update_ftrace_func(ftrace_trace_function); | 2002 | ftrace_update_ftrace_func(ftrace_trace_function); |
1988 | 2003 | ||
1989 | if (command & FTRACE_START_FUNC_RET) | 2004 | if (command & FTRACE_START_FUNC_RET) |