diff options
-rw-r--r-- | include/linux/ftrace.h | 3 | ||||
-rw-r--r-- | kernel/trace/ftrace.c | 28 |
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 | ||
102 | int ftrace_arch_code_modify_prepare(void); | ||
103 | int ftrace_arch_code_modify_post_process(void); | ||
104 | |||
102 | enum { | 105 | enum { |
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 | */ | ||
592 | int __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 | */ | ||
601 | int __weak ftrace_arch_code_modify_post_process(void) | ||
602 | { | ||
603 | return 0; | ||
604 | } | ||
605 | |||
588 | static int __ftrace_modify_code(void *data) | 606 | static 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 | ||
608 | static void ftrace_run_update_code(int command) | 626 | static 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 | ||
613 | static ftrace_func_t saved_ftrace_func; | 641 | static ftrace_func_t saved_ftrace_func; |