From: Masami Hiramatsu (Google) <[email protected]>

Since __tracepoint_user_init() calls tracepoint_user_register() without
initializing tuser->tpoint with given tracpoint, it does not register
tracepoint stub function as callback correctly, and tprobe does not work.

Initializing tuser->tpoint correctly before tracepoint_user_register()
so that it sets up tracepoint callback.

I confirmed below example works fine again.

echo "t sched_switch preempt prev_pid=prev->pid next_pid=next->pid" > 
/sys/kernel/tracing/dynamic_events
echo 1 > /sys/kernel/tracing/events/tracepoints/sched_switch/enable
cat /sys/kernel/tracing/trace_pipe

Fixes: 2867495dea86 ("tracing: tprobe-events: Register tracepoint when enable 
tprobe event")
Reported-by: Beau Belgrave <[email protected]>
Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
---
 kernel/trace/trace_fprobe.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_fprobe.c b/kernel/trace/trace_fprobe.c
index b36ade43d4b3..d4e78d1ace12 100644
--- a/kernel/trace/trace_fprobe.c
+++ b/kernel/trace/trace_fprobe.c
@@ -106,13 +106,14 @@ static struct tracepoint_user 
*__tracepoint_user_init(const char *name, struct t
        if (!tuser->name)
                return NULL;
 
+       /* Register tracepoint if it is loaded. */
        if (tpoint) {
+               tuser->tpoint = tpoint;
                ret = tracepoint_user_register(tuser);
                if (ret)
                        return ERR_PTR(ret);
        }
 
-       tuser->tpoint = tpoint;
        tuser->refcount = 1;
        INIT_LIST_HEAD(&tuser->list);
        list_add(&tuser->list, &tracepoint_user_list);


Reply via email to