On Wed, 25 Jul 2018 16:20:38 +0200 Artem Savkov <asav...@redhat.com> wrote:
> If enable_trace_kprobe fails to enable the probe in enable_k(ret)probe > it returns an error, but does not unset the tp flags it set previously. > This results in a probe being considered enabled and failures like being > unable to remove the probe through kprobe_events file since probes_open() > expects every probe to be disabled. > > Signed-off-by: Artem Savkov <asav...@redhat.com> Masami, Can you ack this? Thanks! -- Steve > --- > kernel/trace/trace_kprobe.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c > index 21f718472942..27ace4513c43 100644 > --- a/kernel/trace/trace_kprobe.c > +++ b/kernel/trace/trace_kprobe.c > @@ -400,11 +400,10 @@ static struct trace_kprobe *find_trace_kprobe(const > char *event, > static int > enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file) > { > + struct event_file_link *link; > int ret = 0; > > if (file) { > - struct event_file_link *link; > - > link = kmalloc(sizeof(*link), GFP_KERNEL); > if (!link) { > ret = -ENOMEM; > @@ -424,6 +423,16 @@ enable_trace_kprobe(struct trace_kprobe *tk, struct > trace_event_file *file) > else > ret = enable_kprobe(&tk->rp.kp); > } > + > + if (ret) { > + if (file) { > + list_del_rcu(&link->list); > + kfree(link); > + tk->tp.flags &= ~TP_FLAG_TRACE; > + } else { > + tk->tp.flags &= ~TP_FLAG_PROFILE; > + } > + } > out: > return ret; > }