Skip to content

Commit 2d5e067

Browse files
Masami Hiramatsufweisbec
authored andcommitted
tracing/kprobes: Fix trace_probe registration order
Fix trace_probe registration order. ftrace_event_call and ftrace_event must be registered before kprobe/kretprobe, because tracing/profiling handlers dereference the event-id. Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Jim Keniston <jkenisto@us.ibm.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Frank Ch. Eigler <fche@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Jason Baron <jbaron@redhat.com> Cc: K.Prasad <prasad@linux.vnet.ibm.com> Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <20090914204856.18779.52961.stgit@dhcp-100-2-132.bos.redhat.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
1 parent f52487e commit 2d5e067

File tree

1 file changed

+19
-23
lines changed

1 file changed

+19
-23
lines changed

kernel/trace/trace_kprobe.c

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -347,20 +347,15 @@ static struct trace_probe *find_probe_event(const char *event)
347347
return NULL;
348348
}
349349

350-
static void __unregister_trace_probe(struct trace_probe *tp)
350+
/* Unregister a trace_probe and probe_event: call with locking probe_lock */
351+
static void unregister_trace_probe(struct trace_probe *tp)
351352
{
352353
if (probe_is_return(tp))
353354
unregister_kretprobe(&tp->rp);
354355
else
355356
unregister_kprobe(&tp->rp.kp);
356-
}
357-
358-
/* Unregister a trace_probe and probe_event: call with locking probe_lock */
359-
static void unregister_trace_probe(struct trace_probe *tp)
360-
{
361-
unregister_probe_event(tp);
362-
__unregister_trace_probe(tp);
363357
list_del(&tp->list);
358+
unregister_probe_event(tp);
364359
}
365360

366361
/* Register a trace_probe and probe_event */
@@ -371,6 +366,19 @@ static int register_trace_probe(struct trace_probe *tp)
371366

372367
mutex_lock(&probe_lock);
373368

369+
/* register as an event */
370+
old_tp = find_probe_event(tp->call.name);
371+
if (old_tp) {
372+
/* delete old event */
373+
unregister_trace_probe(old_tp);
374+
free_trace_probe(old_tp);
375+
}
376+
ret = register_probe_event(tp);
377+
if (ret) {
378+
pr_warning("Faild to register probe event(%d)\n", ret);
379+
goto end;
380+
}
381+
374382
if (probe_is_return(tp))
375383
ret = register_kretprobe(&tp->rp);
376384
else
@@ -384,21 +392,9 @@ static int register_trace_probe(struct trace_probe *tp)
384392
tp->rp.kp.addr);
385393
ret = -EINVAL;
386394
}
387-
goto end;
388-
}
389-
/* register as an event */
390-
old_tp = find_probe_event(tp->call.name);
391-
if (old_tp) {
392-
/* delete old event */
393-
unregister_trace_probe(old_tp);
394-
free_trace_probe(old_tp);
395-
}
396-
ret = register_probe_event(tp);
397-
if (ret) {
398-
pr_warning("Faild to register probe event(%d)\n", ret);
399-
__unregister_trace_probe(tp);
400-
}
401-
list_add_tail(&tp->list, &probe_list);
395+
unregister_probe_event(tp);
396+
} else
397+
list_add_tail(&tp->list, &probe_list);
402398
end:
403399
mutex_unlock(&probe_lock);
404400
return ret;

0 commit comments

Comments
 (0)