diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-22 18:12:01 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-22 18:12:01 +0100 |
commit | c478f8786973d6d7552c652ddad3f6fd86b5af28 (patch) | |
tree | 39967f4bb9a35d626584bd46f1acd916c6b5278d /kernel/trace/ftrace.c | |
parent | 843adf2379c18ed9a1b7493ee208bfd5512732e0 (diff) | |
parent | 4377245aa93b65b6597e4b7bb460fb9abc48b56b (diff) |
Merge branch 'tip/x86/ftrace' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/ftrace
Conflicts:
include/linux/ftrace.h
kernel/trace/ftrace.c
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index cf59f4c5474..5a3a06b21ee 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -557,8 +557,11 @@ static void ftrace_replace_code(int enable) if ((system_state == SYSTEM_BOOTING) || !core_kernel_text(rec->ip)) { ftrace_free_rec(rec); - } else + } else { ftrace_bug(failed, rec->ip); + /* Stop processing */ + return; + } } } while_for_each_ftrace_rec(); } @@ -580,6 +583,24 @@ ftrace_code_disable(struct module *mod, struct dyn_ftrace *rec) return 1; } +/* + * archs can override this function if they must do something + * before the modifying code is performed. + */ +int __weak ftrace_arch_code_modify_prepare(void) +{ + return 0; +} + +/* + * archs can override this function if they must do something + * after the modifying code is performed. + */ +int __weak ftrace_arch_code_modify_post_process(void) +{ + return 0; +} + static int __ftrace_modify_code(void *data) { int *command = data; @@ -602,7 +623,17 @@ static int __ftrace_modify_code(void *data) static void ftrace_run_update_code(int command) { + int ret; + + ret = ftrace_arch_code_modify_prepare(); + FTRACE_WARN_ON(ret); + if (ret) + return; + stop_machine(__ftrace_modify_code, &command, NULL); + + ret = ftrace_arch_code_modify_post_process(); + FTRACE_WARN_ON(ret); } static ftrace_func_t saved_ftrace_func; |