diff options
| -rw-r--r-- | arch/x86/kernel/ftrace.c | 15 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 1 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 4 |
3 files changed, 5 insertions, 15 deletions
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 4243e8bbdcb1..32ff36596ab1 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -435,7 +435,7 @@ static void run_sync(void) | |||
| 435 | local_irq_disable(); | 435 | local_irq_disable(); |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | static void ftrace_replace_code(int enable) | 438 | void ftrace_replace_code(int enable) |
| 439 | { | 439 | { |
| 440 | struct ftrace_rec_iter *iter; | 440 | struct ftrace_rec_iter *iter; |
| 441 | struct dyn_ftrace *rec; | 441 | struct dyn_ftrace *rec; |
| @@ -493,18 +493,7 @@ void arch_ftrace_update_code(int command) | |||
| 493 | { | 493 | { |
| 494 | modifying_ftrace_code++; | 494 | modifying_ftrace_code++; |
| 495 | 495 | ||
| 496 | if (command & FTRACE_UPDATE_CALLS) | 496 | ftrace_modify_all_code(command); |
| 497 | ftrace_replace_code(1); | ||
| 498 | else if (command & FTRACE_DISABLE_CALLS) | ||
| 499 | ftrace_replace_code(0); | ||
| 500 | |||
| 501 | if (command & FTRACE_UPDATE_TRACE_FUNC) | ||
| 502 | ftrace_update_ftrace_func(ftrace_trace_function); | ||
| 503 | |||
| 504 | if (command & FTRACE_START_FUNC_RET) | ||
| 505 | ftrace_enable_ftrace_graph_caller(); | ||
| 506 | else if (command & FTRACE_STOP_FUNC_RET) | ||
| 507 | ftrace_disable_ftrace_graph_caller(); | ||
| 508 | 497 | ||
| 509 | modifying_ftrace_code--; | 498 | modifying_ftrace_code--; |
| 510 | } | 499 | } |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index cd72ace7ade3..55e6d63d46d0 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -314,6 +314,7 @@ ftrace_set_early_filter(struct ftrace_ops *ops, char *buf, int enable); | |||
| 314 | /* defined in arch */ | 314 | /* defined in arch */ |
| 315 | extern int ftrace_ip_converted(unsigned long ip); | 315 | extern int ftrace_ip_converted(unsigned long ip); |
| 316 | extern int ftrace_dyn_arch_init(void *data); | 316 | extern int ftrace_dyn_arch_init(void *data); |
| 317 | extern void ftrace_replace_code(int enable); | ||
| 317 | extern int ftrace_update_ftrace_func(ftrace_func_t func); | 318 | extern int ftrace_update_ftrace_func(ftrace_func_t func); |
| 318 | extern void ftrace_caller(void); | 319 | extern void ftrace_caller(void); |
| 319 | extern void ftrace_call(void); | 320 | extern void ftrace_call(void); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 3c345825cc23..a008663d86c8 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -1683,7 +1683,7 @@ __ftrace_replace_code(struct dyn_ftrace *rec, int enable) | |||
| 1683 | return -1; /* unknow ftrace bug */ | 1683 | return -1; /* unknow ftrace bug */ |
| 1684 | } | 1684 | } |
| 1685 | 1685 | ||
| 1686 | static void ftrace_replace_code(int update) | 1686 | void __weak ftrace_replace_code(int enable) |
| 1687 | { | 1687 | { |
| 1688 | struct dyn_ftrace *rec; | 1688 | struct dyn_ftrace *rec; |
| 1689 | struct ftrace_page *pg; | 1689 | struct ftrace_page *pg; |
| @@ -1693,7 +1693,7 @@ static void ftrace_replace_code(int update) | |||
| 1693 | return; | 1693 | return; |
| 1694 | 1694 | ||
| 1695 | do_for_each_ftrace_rec(pg, rec) { | 1695 | do_for_each_ftrace_rec(pg, rec) { |
| 1696 | failed = __ftrace_replace_code(rec, update); | 1696 | failed = __ftrace_replace_code(rec, enable); |
| 1697 | if (failed) { | 1697 | if (failed) { |
| 1698 | ftrace_bug(failed, rec->ip); | 1698 | ftrace_bug(failed, rec->ip); |
| 1699 | /* Stop processing */ | 1699 | /* Stop processing */ |
