From 4de21a4bdd32a4833180703cb4ad33a3e7a411f1 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Tue, 9 Jun 2009 17:29:07 -0400 Subject: [PATCH] --- yaml --- r: 146223 b: refs/heads/master c: 110bf2b764eb6026b868d84499263cb24b1bcc8d h: refs/heads/master i: 146221: 054ce9e3fcb1a8a86bf3c2ba4f488fc7804e84d2 146219: f76f489d1311735c9db53fb1ff867dc14f9ffc5b 146215: 7e0da963f680bc82306067fb674a9d6f50aa2336 146207: 8d60fc41af79dae8afc91c4a40224a935116f875 v: v3 --- [refs] | 2 +- trunk/kernel/trace/trace_events.c | 4 +++- trunk/kernel/trace/trace_output.c | 15 ++++++++++++--- trunk/kernel/trace/trace_output.h | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a4a56a190502..a8b13fbc1dc3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 725c624a58a10ef90a2ff889e122158fabf36147 +refs/heads/master: 110bf2b764eb6026b868d84499263cb24b1bcc8d diff --git a/trunk/kernel/trace/trace_events.c b/trunk/kernel/trace/trace_events.c index 6c81f9c21426..aa08be69a1b6 100644 --- a/trunk/kernel/trace/trace_events.c +++ b/trunk/kernel/trace/trace_events.c @@ -1050,12 +1050,13 @@ static void trace_module_remove_events(struct module *mod) struct ftrace_event_call *call, *p; bool found = false; + down_write(&trace_event_mutex); list_for_each_entry_safe(call, p, &ftrace_events, list) { if (call->mod == mod) { found = true; ftrace_event_enable_disable(call, 0); if (call->event) - unregister_ftrace_event(call->event); + __unregister_ftrace_event(call->event); debugfs_remove_recursive(call->dir); list_del(&call->list); trace_destroy_fields(call); @@ -1079,6 +1080,7 @@ static void trace_module_remove_events(struct module *mod) */ if (found) tracing_reset_current_online_cpus(); + up_write(&trace_event_mutex); } static int trace_module_notify(struct notifier_block *self, diff --git a/trunk/kernel/trace/trace_output.c b/trunk/kernel/trace/trace_output.c index c05aff465dc9..7938f3ae93e3 100644 --- a/trunk/kernel/trace/trace_output.c +++ b/trunk/kernel/trace/trace_output.c @@ -14,7 +14,7 @@ /* must be a power of 2 */ #define EVENT_HASHSIZE 128 -static DECLARE_RWSEM(trace_event_mutex); +DECLARE_RWSEM(trace_event_mutex); DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq); EXPORT_PER_CPU_SYMBOL(ftrace_event_seq); @@ -702,6 +702,16 @@ int register_ftrace_event(struct trace_event *event) } EXPORT_SYMBOL_GPL(register_ftrace_event); +/* + * Used by module code with the trace_event_mutex held for write. + */ +int __unregister_ftrace_event(struct trace_event *event) +{ + hlist_del(&event->node); + list_del(&event->list); + return 0; +} + /** * unregister_ftrace_event - remove a no longer used event * @event: the event to remove @@ -709,8 +719,7 @@ EXPORT_SYMBOL_GPL(register_ftrace_event); int unregister_ftrace_event(struct trace_event *event) { down_write(&trace_event_mutex); - hlist_del(&event->node); - list_del(&event->list); + __unregister_ftrace_event(event); up_write(&trace_event_mutex); return 0; diff --git a/trunk/kernel/trace/trace_output.h b/trunk/kernel/trace/trace_output.h index ac240e76eb01..d38bec4a9c30 100644 --- a/trunk/kernel/trace/trace_output.h +++ b/trunk/kernel/trace/trace_output.h @@ -27,6 +27,10 @@ extern struct trace_event *ftrace_find_event(int type); extern enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags); +/* used by module unregistering */ +extern int __unregister_ftrace_event(struct trace_event *event); +extern struct rw_semaphore trace_event_mutex; + #define MAX_MEMHEX_BYTES 8 #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1)