]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tracepoint: Have tracepoints created with DECLARE_TRACE() have _tp suffix
authorSteven Rostedt <rostedt@goodmis.org>
Sat, 10 May 2025 20:37:30 +0000 (16:37 -0400)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 14 May 2025 15:19:32 +0000 (11:19 -0400)
Most tracepoints in the kernel are created with TRACE_EVENT(). The
TRACE_EVENT() macro (and DECLARE_EVENT_CLASS() and DEFINE_EVENT() where in
reality, TRACE_EVENT() is just a helper macro that calls those other two
macros), will create not only a tracepoint (the function trace_<event>()
used in the kernel), it also exposes the tracepoint to user space along
with defining what fields will be saved by that tracepoint.

There are a few places that tracepoints are created in the kernel that are
not exposed to userspace via tracefs. They can only be accessed from code
within the kernel. These tracepoints are created with DEFINE_TRACE()

Most of these tracepoints end with "_tp". This is useful as when the
developer sees that, they know that the tracepoint is for in-kernel only
(meaning it can only be accessed inside the kernel, either directly by the
kernel or indirectly via modules and BPF programs) and is not exposed to
user space.

Instead of making this only a process to add "_tp", enforce it by making
the DECLARE_TRACE() append the "_tp" suffix to the tracepoint. This
requires adding DECLARE_TRACE_EVENT() macros for the TRACE_EVENT() macro
to use that keeps the original name.

Link: https://lore.kernel.org/all/20250418083351.20a60e64@gandalf.local.home/
Cc: netdev <netdev@vger.kernel.org>
Cc: Jiri Olsa <olsajiri@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: David Ahern <dsahern@kernel.org>
Cc: Juri Lelli <juri.lelli@gmail.com>
Cc: Breno Leitao <leitao@debian.org>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Gabriele Monaco <gmonaco@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Link: https://lore.kernel.org/20250510163730.092fad5b@gandalf.local.home
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Documentation/trace/tracepoints.rst
include/linux/tracepoint.h
include/trace/bpf_probe.h
include/trace/define_trace.h
include/trace/events/sched.h
include/trace/events/tcp.h
tools/testing/selftests/bpf/progs/raw_tp_null.c
tools/testing/selftests/bpf/progs/raw_tp_null_fail.c
tools/testing/selftests/bpf/progs/test_module_attach.c
tools/testing/selftests/bpf/progs/test_tp_btf_nullable.c
tools/testing/selftests/bpf/test_kmods/bpf_testmod.c

index decabcc77b567c9af7f0eace310f9efa57b063ca..b35c40e3abbea9f7352ad0ab2f0c6156f0f695cb 100644 (file)
@@ -71,7 +71,7 @@ In subsys/file.c (where the tracing statement must be added)::
        void somefct(void)
        {
                ...
-               trace_subsys_eventname(arg, task);
+               trace_subsys_eventname_tp(arg, task);
                ...
        }
 
@@ -129,12 +129,12 @@ within an if statement with the following::
                for (i = 0; i < count; i++)
                        tot += calculate_nuggets();
 
-               trace_foo_bar(tot);
+               trace_foo_bar_tp(tot);
        }
 
-All trace_<tracepoint>() calls have a matching trace_<tracepoint>_enabled()
+All trace_<tracepoint>_tp() calls have a matching trace_<tracepoint>_enabled()
 function defined that returns true if the tracepoint is enabled and
-false otherwise. The trace_<tracepoint>() should always be within the
+false otherwise. The trace_<tracepoint>_tp() should always be within the
 block of the if (trace_<tracepoint>_enabled()) to prevent races between
 the tracepoint being enabled and the check being seen.
 
@@ -143,7 +143,10 @@ the static_key of the tracepoint to allow the if statement to be implemented
 with jump labels and avoid conditional branches.
 
 .. note:: The convenience macro TRACE_EVENT provides an alternative way to
-      define tracepoints. Check http://lwn.net/Articles/379903,
+      define tracepoints. Note, DECLARE_TRACE(foo) creates a function
+      "trace_foo_tp()" whereas TRACE_EVENT(foo) creates a function
+      "trace_foo()", and also exposes the tracepoint as a trace event in
+      /sys/kernel/tracing/events directory.  Check http://lwn.net/Articles/379903,
       http://lwn.net/Articles/381064 and http://lwn.net/Articles/383362
       for a series of articles with more details.
 
@@ -159,7 +162,9 @@ In a C file::
 
        void do_trace_foo_bar_wrapper(args)
        {
-               trace_foo_bar(args);
+               trace_foo_bar_tp(args); // for tracepoints created via DECLARE_TRACE
+                                       //   or
+               trace_foo_bar(args);    // for tracepoints created via TRACE_EVENT
        }
 
 In the header file::
index a351763e6965a2c79c37a5e15c0502c878db739e..826ce3f8e1f851edba507d321bcdfb6fdf55a2bc 100644 (file)
@@ -464,16 +464,30 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
 #endif
 
 #define DECLARE_TRACE(name, proto, args)                               \
-       __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
+       __DECLARE_TRACE(name##_tp, PARAMS(proto), PARAMS(args),         \
                        cpu_online(raw_smp_processor_id()),             \
                        PARAMS(void *__data, proto))
 
 #define DECLARE_TRACE_CONDITION(name, proto, args, cond)               \
-       __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
+       __DECLARE_TRACE(name##_tp, PARAMS(proto), PARAMS(args),         \
                        cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
                        PARAMS(void *__data, proto))
 
 #define DECLARE_TRACE_SYSCALL(name, proto, args)                       \
+       __DECLARE_TRACE_SYSCALL(name##_tp, PARAMS(proto), PARAMS(args), \
+                               PARAMS(void *__data, proto))
+
+#define DECLARE_TRACE_EVENT(name, proto, args)                         \
+       __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
+                       cpu_online(raw_smp_processor_id()),             \
+                       PARAMS(void *__data, proto))
+
+#define DECLARE_TRACE_EVENT_CONDITION(name, proto, args, cond)         \
+       __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
+                       cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
+                       PARAMS(void *__data, proto))
+
+#define DECLARE_TRACE_EVENT_SYSCALL(name, proto, args)                 \
        __DECLARE_TRACE_SYSCALL(name, PARAMS(proto), PARAMS(args),      \
                                PARAMS(void *__data, proto))
 
@@ -591,32 +605,32 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
 
 #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)
 #define DEFINE_EVENT(template, name, proto, args)              \
-       DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
+       DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
 #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg)\
-       DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
+       DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
 #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
-       DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
+       DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
 #define DEFINE_EVENT_CONDITION(template, name, proto,          \
                               args, cond)                      \
-       DECLARE_TRACE_CONDITION(name, PARAMS(proto),            \
+       DECLARE_TRACE_EVENT_CONDITION(name, PARAMS(proto),      \
                                PARAMS(args), PARAMS(cond))
 
 #define TRACE_EVENT(name, proto, args, struct, assign, print)  \
-       DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
+       DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
 #define TRACE_EVENT_FN(name, proto, args, struct,              \
                assign, print, reg, unreg)                      \
-       DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
-#define TRACE_EVENT_FN_COND(name, proto, args, cond, struct,           \
+       DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
+#define TRACE_EVENT_FN_COND(name, proto, args, cond, struct,   \
                assign, print, reg, unreg)                      \
-       DECLARE_TRACE_CONDITION(name, PARAMS(proto),    \
+       DECLARE_TRACE_EVENT_CONDITION(name, PARAMS(proto),      \
                        PARAMS(args), PARAMS(cond))
 #define TRACE_EVENT_CONDITION(name, proto, args, cond,         \
                              struct, assign, print)            \
-       DECLARE_TRACE_CONDITION(name, PARAMS(proto),            \
+       DECLARE_TRACE_EVENT_CONDITION(name, PARAMS(proto),      \
                                PARAMS(args), PARAMS(cond))
 #define TRACE_EVENT_SYSCALL(name, proto, args, struct, assign, \
                            print, reg, unreg)                  \
-       DECLARE_TRACE_SYSCALL(name, PARAMS(proto), PARAMS(args))
+       DECLARE_TRACE_EVENT_SYSCALL(name, PARAMS(proto), PARAMS(args))
 
 #define TRACE_EVENT_FLAGS(event, flag)
 
index 183fa2aa293544041d3dd8819ea31d693aee4492..9391d54d3f124ab0d56ec57445cfc79baeffc28c 100644 (file)
@@ -119,14 +119,14 @@ static inline void bpf_test_buffer_##call(void)                           \
 
 #undef DECLARE_TRACE
 #define DECLARE_TRACE(call, proto, args)                               \
-       __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args))          \
-       __DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), 0)
+       __BPF_DECLARE_TRACE(call##_tp, PARAMS(proto), PARAMS(args))             \
+       __DEFINE_EVENT(call##_tp, call##_tp, PARAMS(proto), PARAMS(args), 0)
 
 #undef DECLARE_TRACE_WRITABLE
 #define DECLARE_TRACE_WRITABLE(call, proto, args, size) \
        __CHECK_WRITABLE_BUF_SIZE(call, PARAMS(proto), PARAMS(args), size) \
-       __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) \
-       __DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), size)
+       __BPF_DECLARE_TRACE(call##_tp, PARAMS(proto), PARAMS(args)) \
+       __DEFINE_EVENT(call##_tp, call##_tp, PARAMS(proto), PARAMS(args), size)
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
index ed52d0506c69ffe07cfce736834f4ec6995e9c43..b2ba5a80583f8df8f6c0c74df541a12fc8168b64 100644 (file)
 
 #undef DECLARE_TRACE
 #define DECLARE_TRACE(name, proto, args)       \
-       DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
+       DEFINE_TRACE(name##_tp, PARAMS(proto), PARAMS(args))
 
 #undef DECLARE_TRACE_CONDITION
 #define DECLARE_TRACE_CONDITION(name, proto, args, cond)       \
+       DEFINE_TRACE(name##_tp, PARAMS(proto), PARAMS(args))
+
+#undef DECLARE_TRACE_EVENT
+#define DECLARE_TRACE_EVENT(name, proto, args) \
+       DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
+
+#undef DECLARE_TRACE_EVENT_CONDITION
+#define DECLARE_TRACE_EVENT_CONDITION(name, proto, args, cond) \
        DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
 
 /* If requested, create helpers for calling these tracepoints from Rust. */
 #undef DECLARE_TRACE_CONDITION
 #define DECLARE_TRACE_CONDITION(name, proto, args, cond)
 
+#undef DECLARE_TRACE_EVENT
+#define DECLARE_TRACE_EVENT(name, proto, args)
+#undef DECLARE_TRACE_EVENT_CONDITION
+#define DECLARE_TRACE_EVENT_CONDITION(name, proto, args, cond)
+
 #ifdef TRACEPOINTS_ENABLED
 #include <trace/trace_events.h>
 #include <trace/perf.h>
 #undef TRACE_HEADER_MULTI_READ
 #undef DECLARE_TRACE
 #undef DECLARE_TRACE_CONDITION
+#undef DECLARE_TRACE_EVENT
+#undef DECLARE_TRACE_EVENT_CONDITION
 
 /* Only undef what we defined in this file */
 #ifdef UNDEF_TRACE_INCLUDE_FILE
index 8994e97d86c13a3c43238aa3ee2570abd5fda421..152fc8b37aa5b5015c1753ee91138c05dbc4cf0a 100644 (file)
@@ -773,64 +773,64 @@ TRACE_EVENT(sched_wake_idle_without_ipi,
  *
  * Postfixed with _tp to make them easily identifiable in the code.
  */
-DECLARE_TRACE(pelt_cfs_tp,
+DECLARE_TRACE(pelt_cfs,
        TP_PROTO(struct cfs_rq *cfs_rq),
        TP_ARGS(cfs_rq));
 
-DECLARE_TRACE(pelt_rt_tp,
+DECLARE_TRACE(pelt_rt,
        TP_PROTO(struct rq *rq),
        TP_ARGS(rq));
 
-DECLARE_TRACE(pelt_dl_tp,
+DECLARE_TRACE(pelt_dl,
        TP_PROTO(struct rq *rq),
        TP_ARGS(rq));
 
-DECLARE_TRACE(pelt_hw_tp,
+DECLARE_TRACE(pelt_hw,
        TP_PROTO(struct rq *rq),
        TP_ARGS(rq));
 
-DECLARE_TRACE(pelt_irq_tp,
+DECLARE_TRACE(pelt_irq,
        TP_PROTO(struct rq *rq),
        TP_ARGS(rq));
 
-DECLARE_TRACE(pelt_se_tp,
+DECLARE_TRACE(pelt_se,
        TP_PROTO(struct sched_entity *se),
        TP_ARGS(se));
 
-DECLARE_TRACE(sched_cpu_capacity_tp,
+DECLARE_TRACE(sched_cpu_capacity,
        TP_PROTO(struct rq *rq),
        TP_ARGS(rq));
 
-DECLARE_TRACE(sched_overutilized_tp,
+DECLARE_TRACE(sched_overutilized,
        TP_PROTO(struct root_domain *rd, bool overutilized),
        TP_ARGS(rd, overutilized));
 
-DECLARE_TRACE(sched_util_est_cfs_tp,
+DECLARE_TRACE(sched_util_est_cfs,
        TP_PROTO(struct cfs_rq *cfs_rq),
        TP_ARGS(cfs_rq));
 
-DECLARE_TRACE(sched_util_est_se_tp,
+DECLARE_TRACE(sched_util_est_se,
        TP_PROTO(struct sched_entity *se),
        TP_ARGS(se));
 
-DECLARE_TRACE(sched_update_nr_running_tp,
+DECLARE_TRACE(sched_update_nr_running,
        TP_PROTO(struct rq *rq, int change),
        TP_ARGS(rq, change));
 
-DECLARE_TRACE(sched_compute_energy_tp,
+DECLARE_TRACE(sched_compute_energy,
        TP_PROTO(struct task_struct *p, int dst_cpu, unsigned long energy,
                 unsigned long max_util, unsigned long busy_time),
        TP_ARGS(p, dst_cpu, energy, max_util, busy_time));
 
-DECLARE_TRACE(sched_entry_tp,
+DECLARE_TRACE(sched_entry,
        TP_PROTO(bool preempt, unsigned long ip),
        TP_ARGS(preempt, ip));
 
-DECLARE_TRACE(sched_exit_tp,
+DECLARE_TRACE(sched_exit,
        TP_PROTO(bool is_switch, unsigned long ip),
        TP_ARGS(is_switch, ip));
 
-DECLARE_TRACE_CONDITION(sched_set_state_tp,
+DECLARE_TRACE_CONDITION(sched_set_state,
        TP_PROTO(struct task_struct *tsk, int state),
        TP_ARGS(tsk, state),
        TP_CONDITION(!!(tsk->__state) != !!state));
index 1a40c41ff8c30a31b5c7002a4109de1cd8ef389e..4f9fa1b5b89bbb824cb483ed9b06963dcab9eeec 100644 (file)
@@ -259,7 +259,7 @@ TRACE_EVENT(tcp_retransmit_synack,
                  __entry->saddr_v6, __entry->daddr_v6)
 );
 
-DECLARE_TRACE(tcp_cwnd_reduction_tp,
+DECLARE_TRACE(tcp_cwnd_reduction,
        TP_PROTO(const struct sock *sk, int newly_acked_sacked,
                 int newly_lost, int flag),
        TP_ARGS(sk, newly_acked_sacked, newly_lost, flag)
index 5927054b6dd96fec1dd4d4c1af67dade75a872c8..efa416f53968b6c64bf34cc6eff20319da364c73 100644 (file)
@@ -10,7 +10,7 @@ char _license[] SEC("license") = "GPL";
 int tid;
 int i;
 
-SEC("tp_btf/bpf_testmod_test_raw_tp_null")
+SEC("tp_btf/bpf_testmod_test_raw_tp_null_tp")
 int BPF_PROG(test_raw_tp_null, struct sk_buff *skb)
 {
        struct task_struct *task = bpf_get_current_task_btf();
index 38d669957bf1b08e041bb1e32eb55e64c7a675f7..0d58114a4955ce29ee3681b729b865b8906b7fce 100644 (file)
@@ -8,7 +8,7 @@
 char _license[] SEC("license") = "GPL";
 
 /* Ensure module parameter has PTR_MAYBE_NULL */
-SEC("tp_btf/bpf_testmod_test_raw_tp_null")
+SEC("tp_btf/bpf_testmod_test_raw_tp_null_tp")
 __failure __msg("R1 invalid mem access 'trusted_ptr_or_null_'")
 int test_raw_tp_null_bpf_testmod_test_raw_tp_null_arg_1(void *ctx) {
     asm volatile("r1 = *(u64 *)(r1 +0); r1 = *(u64 *)(r1 +0);" ::: __clobber_all);
index 7f3c233943b3ae49a9b177bc12a52a6f85abd475..03d7f89787a18809995965e1236abd823252481a 100644 (file)
@@ -19,7 +19,7 @@ int BPF_PROG(handle_raw_tp,
 
 __u32 raw_tp_bare_write_sz = 0;
 
-SEC("raw_tp/bpf_testmod_test_write_bare")
+SEC("raw_tp/bpf_testmod_test_write_bare_tp")
 int BPF_PROG(handle_raw_tp_bare,
             struct task_struct *task, struct bpf_testmod_test_write_ctx *write_ctx)
 {
@@ -31,7 +31,7 @@ int raw_tp_writable_bare_in_val = 0;
 int raw_tp_writable_bare_early_ret = 0;
 int raw_tp_writable_bare_out_val = 0;
 
-SEC("raw_tp.w/bpf_testmod_test_writable_bare")
+SEC("raw_tp.w/bpf_testmod_test_writable_bare_tp")
 int BPF_PROG(handle_raw_tp_writable_bare,
             struct bpf_testmod_test_writable_ctx *writable)
 {
index 39ff06f2c834ae28081da7dae23755d5a8699e83..cf0547a613ffc42fa007e736660c3475334a88e5 100644 (file)
@@ -6,14 +6,14 @@
 #include "../test_kmods/bpf_testmod.h"
 #include "bpf_misc.h"
 
-SEC("tp_btf/bpf_testmod_test_nullable_bare")
+SEC("tp_btf/bpf_testmod_test_nullable_bare_tp")
 __failure __msg("R1 invalid mem access 'trusted_ptr_or_null_'")
 int BPF_PROG(handle_tp_btf_nullable_bare1, struct bpf_testmod_test_read_ctx *nullable_ctx)
 {
        return nullable_ctx->len;
 }
 
-SEC("tp_btf/bpf_testmod_test_nullable_bare")
+SEC("tp_btf/bpf_testmod_test_nullable_bare_tp")
 int BPF_PROG(handle_tp_btf_nullable_bare2, struct bpf_testmod_test_read_ctx *nullable_ctx)
 {
        if (nullable_ctx)
index 3220f1d28697e6f22ff6da2ea80417f7f187f538..18eded4d1d15864910b9ad73555f5b4c3ea642bf 100644 (file)
@@ -413,7 +413,7 @@ bpf_testmod_test_read(struct file *file, struct kobject *kobj,
 
        (void)bpf_testmod_test_arg_ptr_to_struct(&struct_arg1_2);
 
-       (void)trace_bpf_testmod_test_raw_tp_null(NULL);
+       (void)trace_bpf_testmod_test_raw_tp_null_tp(NULL);
 
        bpf_testmod_test_struct_ops3();
 
@@ -431,14 +431,14 @@ bpf_testmod_test_read(struct file *file, struct kobject *kobj,
        if (bpf_testmod_loop_test(101) > 100)
                trace_bpf_testmod_test_read(current, &ctx);
 
-       trace_bpf_testmod_test_nullable_bare(NULL);
+       trace_bpf_testmod_test_nullable_bare_tp(NULL);
 
        /* Magic number to enable writable tp */
        if (len == 64) {
                struct bpf_testmod_test_writable_ctx writable = {
                        .val = 1024,
                };
-               trace_bpf_testmod_test_writable_bare(&writable);
+               trace_bpf_testmod_test_writable_bare_tp(&writable);
                if (writable.early_ret)
                        return snprintf(buf, len, "%d\n", writable.val);
        }
@@ -470,7 +470,7 @@ bpf_testmod_test_write(struct file *file, struct kobject *kobj,
                .len = len,
        };
 
-       trace_bpf_testmod_test_write_bare(current, &ctx);
+       trace_bpf_testmod_test_write_bare_tp(current, &ctx);
 
        return -EIO; /* always fail */
 }