diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 23683b06b18c..eca592f977b2 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -5037,29 +5037,36 @@ void ftrace_module_init(struct module *mod) | |||
5037 | 5037 | ||
5038 | ftrace_process_locs(mod, mod->ftrace_callsites, | 5038 | ftrace_process_locs(mod, mod->ftrace_callsites, |
5039 | mod->ftrace_callsites + mod->num_ftrace_callsites); | 5039 | mod->ftrace_callsites + mod->num_ftrace_callsites); |
5040 | ftrace_module_enable(mod); | ||
5041 | } | 5040 | } |
5042 | 5041 | ||
5043 | static int ftrace_module_notify_exit(struct notifier_block *self, | 5042 | static int ftrace_module_notify(struct notifier_block *self, |
5044 | unsigned long val, void *data) | 5043 | unsigned long val, void *data) |
5045 | { | 5044 | { |
5046 | struct module *mod = data; | 5045 | struct module *mod = data; |
5047 | 5046 | ||
5048 | if (val == MODULE_STATE_GOING) | 5047 | switch (val) { |
5048 | case MODULE_STATE_COMING: | ||
5049 | ftrace_module_enable(mod); | ||
5050 | break; | ||
5051 | case MODULE_STATE_GOING: | ||
5049 | ftrace_release_mod(mod); | 5052 | ftrace_release_mod(mod); |
5053 | break; | ||
5054 | default: | ||
5055 | break; | ||
5056 | } | ||
5050 | 5057 | ||
5051 | return 0; | 5058 | return 0; |
5052 | } | 5059 | } |
5053 | #else | 5060 | #else |
5054 | static int ftrace_module_notify_exit(struct notifier_block *self, | 5061 | static int ftrace_module_notify(struct notifier_block *self, |
5055 | unsigned long val, void *data) | 5062 | unsigned long val, void *data) |
5056 | { | 5063 | { |
5057 | return 0; | 5064 | return 0; |
5058 | } | 5065 | } |
5059 | #endif /* CONFIG_MODULES */ | 5066 | #endif /* CONFIG_MODULES */ |
5060 | 5067 | ||
5061 | struct notifier_block ftrace_module_exit_nb = { | 5068 | struct notifier_block ftrace_module_nb = { |
5062 | .notifier_call = ftrace_module_notify_exit, | 5069 | .notifier_call = ftrace_module_notify, |
5063 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ | 5070 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ |
5064 | }; | 5071 | }; |
5065 | 5072 | ||
@@ -5091,7 +5098,7 @@ void __init ftrace_init(void) | |||
5091 | __start_mcount_loc, | 5098 | __start_mcount_loc, |
5092 | __stop_mcount_loc); | 5099 | __stop_mcount_loc); |
5093 | 5100 | ||
5094 | ret = register_module_notifier(&ftrace_module_exit_nb); | 5101 | ret = register_module_notifier(&ftrace_module_nb); |
5095 | if (ret) | 5102 | if (ret) |
5096 | pr_warning("Failed to register trace ftrace module exit notifier\n"); | 5103 | pr_warning("Failed to register trace ftrace module exit notifier\n"); |
5097 | 5104 | ||