aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ftrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r--kernel/trace/ftrace.c23
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
2645void ftrace_release(void *start, void *end) 2640void 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