diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
| -rw-r--r-- | kernel/trace/ftrace.c | 23 | 
1 files changed, 7 insertions, 16 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 91283d40821e..45c965919cff 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c  | |||
| @@ -1082,14 +1082,9 @@ static void ftrace_replace_code(int enable) | |||
| 1082 | failed = __ftrace_replace_code(rec, enable); | 1082 | failed = __ftrace_replace_code(rec, enable); | 
| 1083 | if (failed) { | 1083 | if (failed) { | 
| 1084 | rec->flags |= FTRACE_FL_FAILED; | 1084 | rec->flags |= FTRACE_FL_FAILED; | 
| 1085 | if ((system_state == SYSTEM_BOOTING) || | 1085 | ftrace_bug(failed, rec->ip); | 
| 1086 | !core_kernel_text(rec->ip)) { | 1086 | /* Stop processing */ | 
| 1087 | ftrace_free_rec(rec); | 1087 | return; | 
| 1088 | } else { | ||
| 1089 | ftrace_bug(failed, rec->ip); | ||
| 1090 | /* Stop processing */ | ||
| 1091 | return; | ||
| 1092 | } | ||
| 1093 | } | 1088 | } | 
| 1094 | } while_for_each_ftrace_rec(); | 1089 | } while_for_each_ftrace_rec(); | 
| 1095 | } | 1090 | } | 
| @@ -2642,19 +2637,17 @@ static int ftrace_convert_nops(struct module *mod, | |||
| 2642 | } | 2637 | } | 
| 2643 | 2638 | ||
| 2644 | #ifdef CONFIG_MODULES | 2639 | #ifdef CONFIG_MODULES | 
| 2645 | void ftrace_release(void *start, void *end) | 2640 | void ftrace_release_mod(struct module *mod) | 
| 2646 | { | 2641 | { | 
| 2647 | struct dyn_ftrace *rec; | 2642 | struct dyn_ftrace *rec; | 
| 2648 | struct ftrace_page *pg; | 2643 | struct ftrace_page *pg; | 
| 2649 | unsigned long s = (unsigned long)start; | ||
| 2650 | unsigned long e = (unsigned long)end; | ||
| 2651 | 2644 | ||
| 2652 | if (ftrace_disabled || !start || start == end) | 2645 | if (ftrace_disabled) | 
| 2653 | return; | 2646 | return; | 
| 2654 | 2647 | ||
| 2655 | mutex_lock(&ftrace_lock); | 2648 | mutex_lock(&ftrace_lock); | 
| 2656 | do_for_each_ftrace_rec(pg, rec) { | 2649 | do_for_each_ftrace_rec(pg, rec) { | 
| 2657 | if ((rec->ip >= s) && (rec->ip < e)) { | 2650 | if (within_module_core(rec->ip, mod)) { | 
| 2658 | /* | 2651 | /* | 
| 2659 | * rec->ip is changed in ftrace_free_rec() | 2652 | * rec->ip is changed in ftrace_free_rec() | 
| 2660 | * It should not between s and e if record was freed. | 2653 | * It should not between s and e if record was freed. | 
| @@ -2686,9 +2679,7 @@ static int ftrace_module_notify(struct notifier_block *self, | |||
| 2686 | mod->num_ftrace_callsites); | 2679 | mod->num_ftrace_callsites); | 
| 2687 | break; | 2680 | break; | 
| 2688 | case MODULE_STATE_GOING: | 2681 | case MODULE_STATE_GOING: | 
| 2689 | ftrace_release(mod->ftrace_callsites, | 2682 | ftrace_release_mod(mod); | 
| 2690 | mod->ftrace_callsites + | ||
| 2691 | mod->num_ftrace_callsites); | ||
| 2692 | break; | 2683 | break; | 
| 2693 | } | 2684 | } | 
| 2694 | 2685 | ||
