diff options
-rw-r--r-- | kernel/trace/trace_events.c | 4 | ||||
-rw-r--r-- | kernel/trace/trace_output.c | 15 | ||||
-rw-r--r-- | kernel/trace/trace_output.h | 4 |
3 files changed, 19 insertions, 4 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, |
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 | ||
17 | static DECLARE_RWSEM(trace_event_mutex); | 17 | DECLARE_RWSEM(trace_event_mutex); |
18 | 18 | ||
19 | DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq); | 19 | DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq); |
20 | EXPORT_PER_CPU_SYMBOL(ftrace_event_seq); | 20 | EXPORT_PER_CPU_SYMBOL(ftrace_event_seq); |
@@ -702,6 +702,16 @@ int register_ftrace_event(struct trace_event *event) | |||
702 | } | 702 | } |
703 | EXPORT_SYMBOL_GPL(register_ftrace_event); | 703 | EXPORT_SYMBOL_GPL(register_ftrace_event); |
704 | 704 | ||
705 | /* | ||
706 | * Used by module code with the trace_event_mutex held for write. | ||
707 | */ | ||
708 | int __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); | |||
709 | int unregister_ftrace_event(struct trace_event *event) | 719 | int 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; |
diff --git a/kernel/trace/trace_output.h b/kernel/trace/trace_output.h index ac240e76eb01..d38bec4a9c30 100644 --- a/kernel/trace/trace_output.h +++ b/kernel/trace/trace_output.h | |||
@@ -27,6 +27,10 @@ extern struct trace_event *ftrace_find_event(int type); | |||
27 | extern enum print_line_t trace_nop_print(struct trace_iterator *iter, | 27 | extern enum print_line_t trace_nop_print(struct trace_iterator *iter, |
28 | int flags); | 28 | int flags); |
29 | 29 | ||
30 | /* used by module unregistering */ | ||
31 | extern int __unregister_ftrace_event(struct trace_event *event); | ||
32 | extern struct rw_semaphore trace_event_mutex; | ||
33 | |||
30 | #define MAX_MEMHEX_BYTES 8 | 34 | #define MAX_MEMHEX_BYTES 8 |
31 | #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1) | 35 | #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1) |
32 | 36 | ||