tracing/kprobes: unregister_trace_probe needs to be called under mutex
authorSrikar Dronamraju <srikar@linux.vnet.ibm.com>
Wed, 30 Jun 2010 08:45:48 +0000 (14:15 +0530)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 4 Aug 2010 15:41:23 +0000 (12:41 -0300)
Comment in unregister_trace_probe() says probe_lock will be held when it
gets called. However there is a case where it might called without the
probe_lock being held. Also since we are traversing the probe_list and
deleting an element from the probe_list, probe_lock should be held.

This was first pointed in uprobes traceevent review by Frederic
Weisbecker here.  (http://lkml.org/lkml/2010/5/12/106)

Cc: Ingo Molnar <mingo@elte.hu>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20100630084548.GA10325@linux.vnet.ibm.com>
Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
kernel/trace/trace_kprobe.c

index 1b79d1c15726b03f6a0abfe55b340c7cd9860767..8b27c9849b427905ea9a5ef83864a88526afe405 100644 (file)
@@ -925,14 +925,17 @@ static int create_trace_probe(int argc, char **argv)
                        pr_info("Delete command needs an event name.\n");
                        return -EINVAL;
                }
+               mutex_lock(&probe_lock);
                tp = find_probe_event(event, group);
                if (!tp) {
+                       mutex_unlock(&probe_lock);
                        pr_info("Event %s/%s doesn't exist.\n", group, event);
                        return -ENOENT;
                }
                /* delete an event */
                unregister_trace_probe(tp);
                free_trace_probe(tp);
+               mutex_unlock(&probe_lock);
                return 0;
        }