aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_output.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-06-09 17:29:07 -0400
committerSteven Rostedt <rostedt@goodmis.org>2009-06-09 17:29:07 -0400
commit110bf2b764eb6026b868d84499263cb24b1bcc8d (patch)
tree66c869f6f96497051c4bda0797e234b3f7b39e8f /kernel/trace/trace_output.c
parent725c624a58a10ef90a2ff889e122158fabf36147 (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_output.c')
-rw-r--r--kernel/trace/trace_output.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index c05aff465dc9..7938f3ae93e3 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -14,7 +14,7 @@
14/* must be a power of 2 */ 14/* must be a power of 2 */
15#define EVENT_HASHSIZE 128 15#define EVENT_HASHSIZE 128
16 16
17static DECLARE_RWSEM(trace_event_mutex); 17DECLARE_RWSEM(trace_event_mutex);
18 18
19DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq); 19DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq);
20EXPORT_PER_CPU_SYMBOL(ftrace_event_seq); 20EXPORT_PER_CPU_SYMBOL(ftrace_event_seq);
@@ -702,6 +702,16 @@ int register_ftrace_event(struct trace_event *event)
702} 702}
703EXPORT_SYMBOL_GPL(register_ftrace_event); 703EXPORT_SYMBOL_GPL(register_ftrace_event);
704 704
705/*
706 * Used by module code with the trace_event_mutex held for write.
707 */
708int __unregister_ftrace_event(struct trace_event *event)
709{
710 hlist_del(&event->node);
711 list_del(&event->list);
712 return 0;
713}
714
705/** 715/**
706 * unregister_ftrace_event - remove a no longer used event 716 * unregister_ftrace_event - remove a no longer used event
707 * @event: the event to remove 717 * @event: the event to remove
@@ -709,8 +719,7 @@ EXPORT_SYMBOL_GPL(register_ftrace_event);
709int unregister_ftrace_event(struct trace_event *event) 719int unregister_ftrace_event(struct trace_event *event)
710{ 720{
711 down_write(&trace_event_mutex); 721 down_write(&trace_event_mutex);
712 hlist_del(&event->node); 722 __unregister_ftrace_event(event);
713 list_del(&event->list);
714 up_write(&trace_event_mutex); 723 up_write(&trace_event_mutex);
715 724
716 return 0; 725 return 0;