Commit 547cd9ea authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Steven Rostedt (VMware)

tracing/uprobes: Add busy check when cleanup all uprobes

Add a busy check loop in cleanup_all_probes() before
trying to remove all events in uprobe_events, the same way
that kprobe_events does.

Without this change, writing null to uprobe_events will
try to remove events but if one of them is enabled, it will
stop there leaving some events cleared and others not clceared.

With this change, writing null to uprobe_events makes
sure all events are not enabled before removing events.
So, it clears all events, or returns an error (-EBUSY)
with keeping all events.

Link: http://lkml.kernel.org/r/154140841557.17322.12653952888762532401.stgit@devboxReviewed-by: default avatarTom Zanussi <tom.zanussi@linux.intel.com>
Tested-by: default avatarTom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent a7b1d74e
...@@ -587,12 +587,19 @@ static int cleanup_all_probes(void) ...@@ -587,12 +587,19 @@ static int cleanup_all_probes(void)
int ret = 0; int ret = 0;
mutex_lock(&uprobe_lock); mutex_lock(&uprobe_lock);
/* Ensure no probe is in use. */
list_for_each_entry(tu, &uprobe_list, list)
if (trace_probe_is_enabled(&tu->tp)) {
ret = -EBUSY;
goto end;
}
while (!list_empty(&uprobe_list)) { while (!list_empty(&uprobe_list)) {
tu = list_entry(uprobe_list.next, struct trace_uprobe, list); tu = list_entry(uprobe_list.next, struct trace_uprobe, list);
ret = unregister_trace_uprobe(tu); ret = unregister_trace_uprobe(tu);
if (ret) if (ret)
break; break;
} }
end:
mutex_unlock(&uprobe_lock); mutex_unlock(&uprobe_lock);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment