diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2013-05-10 02:20:37 +0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-05-10 04:15:30 +0400 |
commit | 5ae0bf5972b66d35e5674e1b7d855b1e111a68ae (patch) | |
tree | 6383ef4d7fd63d6da285f3908c6f3c14028715a0 /kernel/trace | |
parent | da511bf33e47ea1f33f4b672f7da166d2a1b8a91 (diff) | |
download | linux-5ae0bf5972b66d35e5674e1b7d855b1e111a68ae.tar.xz |
ftrace: Fix locking in register_ftrace_function_probe()
The iteration of the ftrace function list and the call to
ftrace_match_record() need to be protected by the ftrace_lock.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/ftrace.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index cacf0856191e..f104c45cbcc1 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -3017,14 +3017,16 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, *orig_hash); if (!hash) { count = -ENOMEM; - goto out_unlock; + goto out; } if (unlikely(ftrace_disabled)) { count = -ENODEV; - goto out_unlock; + goto out; } + mutex_lock(&ftrace_lock); + do_for_each_ftrace_rec(pg, rec) { if (!ftrace_match_record(rec, NULL, search, len, type)) @@ -3070,15 +3072,15 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, } while_for_each_ftrace_rec(); - mutex_lock(&ftrace_lock); ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); if (ret < 0) count = ret; __enable_ftrace_function_probe(); - mutex_unlock(&ftrace_lock); out_unlock: + mutex_unlock(&ftrace_lock); + out: mutex_unlock(&trace_probe_ops.regex_lock); free_ftrace_hash(hash); |