aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-02-17 13:35:06 -0500
committerSteven Rostedt <srostedt@redhat.com>2009-02-20 13:16:18 -0500
commit000ab691172db3921efa3cb7f17fc79235a1de7f (patch)
tree5670e20fe203488b408977d5d5634fc9ddf418e1
parent07a66d7c53a538e1a9759954a82bb6c07365eff9 (diff)
ftrace: allow archs to preform pre and post process for code modification
This patch creates the weak functions: ftrace_arch_code_modify_prepare and ftrace_arch_code_modify_post_process that are called before and after the stop machine is called to modify the kernel text. If the arch needs to do pre or post processing, it only needs to define these functions. [ Update: Ingo Molnar suggested using the name ftrace_arch_code_modify_* over using ftrace_arch_modify_* ] Signed-off-by: Steven Rostedt <srostedt@redhat.com>
-rw-r--r--include/linux/ftrace.h3
-rw-r--r--kernel/trace/ftrace.c28
2 files changed, 31 insertions, 0 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 677432b9cb7e..fdb2a89ae543 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -99,6 +99,9 @@ stack_trace_sysctl(struct ctl_table *table, int write,
99/* asm/ftrace.h must be defined for archs supporting dynamic ftrace */ 99/* asm/ftrace.h must be defined for archs supporting dynamic ftrace */
100#include <asm/ftrace.h> 100#include <asm/ftrace.h>
101 101
102int ftrace_arch_code_modify_prepare(void);
103int ftrace_arch_code_modify_post_process(void);
104
102enum { 105enum {
103 FTRACE_FL_FREE = (1 << 0), 106 FTRACE_FL_FREE = (1 << 0),
104 FTRACE_FL_FAILED = (1 << 1), 107 FTRACE_FL_FAILED = (1 << 1),
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index fdf913dfc7e8..72316d9647bd 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -585,6 +585,24 @@ ftrace_code_disable(struct module *mod, struct dyn_ftrace *rec)
585 return 1; 585 return 1;
586} 586}
587 587
588/*
589 * archs can override this function if they must do something
590 * before the modifying code is performed.
591 */
592int __weak ftrace_arch_code_modify_prepare(void)
593{
594 return 0;
595}
596
597/*
598 * archs can override this function if they must do something
599 * after the modifying code is performed.
600 */
601int __weak ftrace_arch_code_modify_post_process(void)
602{
603 return 0;
604}
605
588static int __ftrace_modify_code(void *data) 606static int __ftrace_modify_code(void *data)
589{ 607{
590 int *command = data; 608 int *command = data;
@@ -607,7 +625,17 @@ static int __ftrace_modify_code(void *data)
607 625
608static void ftrace_run_update_code(int command) 626static void ftrace_run_update_code(int command)
609{ 627{
628 int ret;
629
630 ret = ftrace_arch_code_modify_prepare();
631 FTRACE_WARN_ON(ret);
632 if (ret)
633 return;
634
610 stop_machine(__ftrace_modify_code, &command, NULL); 635 stop_machine(__ftrace_modify_code, &command, NULL);
636
637 ret = ftrace_arch_code_modify_post_process();
638 FTRACE_WARN_ON(ret);
611} 639}
612 640
613static ftrace_func_t saved_ftrace_func; 641static ftrace_func_t saved_ftrace_func;