Commit ac01fa73 authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt (Google)
Browse files

tracepoint: Have tracepoints created with DECLARE_TRACE() have _tp suffix

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: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 45c28cdc
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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::
+26 −12
Original line number Diff line number Diff line
@@ -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))
	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)

+4 −4
Original line number Diff line number Diff line
@@ -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)

+16 −1
Original line number Diff line number Diff line
@@ -74,10 +74,18 @@

#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. */
@@ -115,6 +123,11 @@
#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>
@@ -136,6 +149,8 @@
#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
+15 −15
Original line number Diff line number Diff line
@@ -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));
Loading