ftrace: Fix locking in register_ftrace_function_probe()
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Thu, 9 May 2013 22:20:37 +0000 (18:20 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 10 May 2013 00:15:30 +0000 (20:15 -0400)
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>
kernel/trace/ftrace.c

index cacf0856191e1dd245096720cd9b37870f230fb2..f104c45cbcc1740ab4d38e18c3f68951a04a337f 100644 (file)
@@ -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);