Skip to content

Commit

Permalink
tracing/kprobes: Simplify the logic of enable_trace_kprobe()
Browse files Browse the repository at this point in the history
The function enable_trace_kprobe() performs slightly differently if the file
parameter is passed in as NULL on non-NULL. Instead of checking file twice,
move the code between the two tests into a static inline helper function to
make the code easier to follow.

Link: http://lkml.kernel.org/r/20180725224728.7b1d5db2@vmware.local.home
Link: http://lkml.kernel.org/r/20180726121152.4dd54330@gandalf.local.home

Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt (VMware) committed Jul 27, 2018
1 parent 72809cb commit 87107a2
Showing 1 changed file with 24 additions and 18 deletions.
42 changes: 24 additions & 18 deletions kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,14 +393,28 @@ static struct trace_kprobe *find_trace_kprobe(const char *event,
return NULL;
}

static inline int __enable_trace_kprobe(struct trace_kprobe *tk)
{
int ret = 0;

if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
if (trace_kprobe_is_return(tk))
ret = enable_kretprobe(&tk->rp);
else
ret = enable_kprobe(&tk->rp.kp);
}

return ret;
}

/*
* Enable trace_probe
* if the file is NULL, enable "perf" handler, or enable "trace" handler.
*/
static int
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
{
struct event_file_link *link = NULL;
struct event_file_link *link;
int ret = 0;

if (file) {
Expand All @@ -414,26 +428,18 @@ enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
list_add_tail_rcu(&link->list, &tk->tp.files);

tk->tp.flags |= TP_FLAG_TRACE;
} else
tk->tp.flags |= TP_FLAG_PROFILE;

if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
if (trace_kprobe_is_return(tk))
ret = enable_kretprobe(&tk->rp);
else
ret = enable_kprobe(&tk->rp.kp);
}

if (ret) {
if (file) {
/* Notice the if is true on not WARN() */
if (!WARN_ON_ONCE(!link))
list_del_rcu(&link->list);
ret = __enable_trace_kprobe(tk);
if (ret) {
list_del_rcu(&link->list);
kfree(link);
tk->tp.flags &= ~TP_FLAG_TRACE;
} else {
tk->tp.flags &= ~TP_FLAG_PROFILE;
}

} else {
tk->tp.flags |= TP_FLAG_PROFILE;
ret = __enable_trace_kprobe(tk);
if (ret)
tk->tp.flags &= ~TP_FLAG_PROFILE;
}
out:
return ret;
Expand Down

0 comments on commit 87107a2

Please sign in to comment.