提交 a232e270 编写于 作者: M Masami Hiramatsu 提交者: Steven Rostedt

tracing/kprobe: Wait for disabling all running kprobe handlers

Wait for disabling all running kprobe handlers when a kprobe
event is disabled, since the caller, trace_remove_event_call()
supposes that a removing event is disabled completely by
disabling the event.
With this change, ftrace can ensure that there is no running
event handlers after disabling it.

Link: http://lkml.kernel.org/r/20130709093526.20138.93100.stgit@mhiramat-M0-7522Signed-off-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
上级 cd92bf61
...@@ -243,11 +243,11 @@ find_event_file_link(struct trace_probe *tp, struct ftrace_event_file *file) ...@@ -243,11 +243,11 @@ find_event_file_link(struct trace_probe *tp, struct ftrace_event_file *file)
static int static int
disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file) disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
{ {
struct event_file_link *link = NULL;
int wait = 0;
int ret = 0; int ret = 0;
if (file) { if (file) {
struct event_file_link *link;
link = find_event_file_link(tp, file); link = find_event_file_link(tp, file);
if (!link) { if (!link) {
ret = -EINVAL; ret = -EINVAL;
...@@ -255,10 +255,7 @@ disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file) ...@@ -255,10 +255,7 @@ disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
} }
list_del_rcu(&link->list); list_del_rcu(&link->list);
/* synchronize with kprobe_trace_func/kretprobe_trace_func */ wait = 1;
synchronize_sched();
kfree(link);
if (!list_empty(&tp->files)) if (!list_empty(&tp->files))
goto out; goto out;
...@@ -271,8 +268,22 @@ disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file) ...@@ -271,8 +268,22 @@ disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
disable_kretprobe(&tp->rp); disable_kretprobe(&tp->rp);
else else
disable_kprobe(&tp->rp.kp); disable_kprobe(&tp->rp.kp);
wait = 1;
} }
out: out:
if (wait) {
/*
* Synchronize with kprobe_trace_func/kretprobe_trace_func
* to ensure disabled (all running handlers are finished).
* This is not only for kfree(), but also the caller,
* trace_remove_event_call() supposes it for releasing
* event_call related objects, which will be accessed in
* the kprobe_trace_func/kretprobe_trace_func.
*/
synchronize_sched();
kfree(link); /* Ignored if link == NULL */
}
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册