diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-06-09 17:29:07 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-06-09 17:29:07 -0400 |
commit | 110bf2b764eb6026b868d84499263cb24b1bcc8d (patch) | |
tree | 66c869f6f96497051c4bda0797e234b3f7b39e8f /kernel/trace/trace_events.c | |
parent | 725c624a58a10ef90a2ff889e122158fabf36147 (diff) |
tracing: add protection around module events unload
When reading the trace buffer, there is a race that when a module
is unloaded it removes events that is stilled referenced in the buffers.
This patch adds the protection around the unloading of the events
from modules and the reading of the trace buffers.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 6c81f9c21426..aa08be69a1b6 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -1050,12 +1050,13 @@ static void trace_module_remove_events(struct module *mod) | |||
1050 | struct ftrace_event_call *call, *p; | 1050 | struct ftrace_event_call *call, *p; |
1051 | bool found = false; | 1051 | bool found = false; |
1052 | 1052 | ||
1053 | down_write(&trace_event_mutex); | ||
1053 | list_for_each_entry_safe(call, p, &ftrace_events, list) { | 1054 | list_for_each_entry_safe(call, p, &ftrace_events, list) { |
1054 | if (call->mod == mod) { | 1055 | if (call->mod == mod) { |
1055 | found = true; | 1056 | found = true; |
1056 | ftrace_event_enable_disable(call, 0); | 1057 | ftrace_event_enable_disable(call, 0); |
1057 | if (call->event) | 1058 | if (call->event) |
1058 | unregister_ftrace_event(call->event); | 1059 | __unregister_ftrace_event(call->event); |
1059 | debugfs_remove_recursive(call->dir); | 1060 | debugfs_remove_recursive(call->dir); |
1060 | list_del(&call->list); | 1061 | list_del(&call->list); |
1061 | trace_destroy_fields(call); | 1062 | trace_destroy_fields(call); |
@@ -1079,6 +1080,7 @@ static void trace_module_remove_events(struct module *mod) | |||
1079 | */ | 1080 | */ |
1080 | if (found) | 1081 | if (found) |
1081 | tracing_reset_current_online_cpus(); | 1082 | tracing_reset_current_online_cpus(); |
1083 | up_write(&trace_event_mutex); | ||
1082 | } | 1084 | } |
1083 | 1085 | ||
1084 | static int trace_module_notify(struct notifier_block *self, | 1086 | static int trace_module_notify(struct notifier_block *self, |