On Thu, 12 Mar 2026 11:04:56 -0400 "Vineeth Pillai (Google)" <[email protected]> wrote:
> Add trace_invoke_##name() as a companion to trace_##name(). When a > caller already guards a tracepoint with an explicit enabled check: > > if (trace_foo_enabled() && cond) > trace_foo(args); > > trace_foo() internally repeats the static_branch_unlikely() test, which > the compiler cannot fold since static branches are patched binary > instructions. This results in two static-branch evaluations for every > guarded call site. > > trace_invoke_##name() calls __do_trace_##name() directly, skipping the > redundant static-branch re-check. This avoids leaking the internal > __do_trace_##name() symbol into call sites while still eliminating the > double evaluation: > > if (trace_foo_enabled() && cond) > trace_invoke_foo(args); /* calls __do_trace_foo() directly */ > > Three locations are updated: > - __DECLARE_TRACE: invoke form omits static_branch_unlikely, retains > the LOCKDEP RCU-watching assertion. > - __DECLARE_TRACE_SYSCALL: same, plus retains might_fault(). > - !TRACEPOINTS_ENABLED stub: empty no-op so callers compile cleanly > when tracepoints are compiled out. > > Suggested-by: Steven Rostedt <[email protected]> > Suggested-by: Peter Zijlstra <[email protected]> > Signed-off-by: Vineeth Pillai (Google) <[email protected]> > Assisted-by: Claude:claude-sonnet-4-6 I'm guessing Claude helped with the other patches. Did it really help with this one? -- Steve > --- > include/linux/tracepoint.h | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h > index 22ca1c8b54f32..07219316a8e14 100644 > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -294,6 +294,10 @@ static inline struct tracepoint > *tracepoint_ptr_deref(tracepoint_ptr_t *p) > WARN_ONCE(!rcu_is_watching(), \ > "RCU not watching for tracepoint"); \ > } \ > + } \ > + static inline void trace_invoke_##name(proto) \ > + { \ > + __do_trace_##name(args); \ > } > > #define __DECLARE_TRACE_SYSCALL(name, proto, args, data_proto) > \ > @@ -313,6 +317,11 @@ static inline struct tracepoint > *tracepoint_ptr_deref(tracepoint_ptr_t *p) > WARN_ONCE(!rcu_is_watching(), \ > "RCU not watching for tracepoint"); \ > } \ > + } \ > + static inline void trace_invoke_##name(proto) \ > + { \ > + might_fault(); \ > + __do_trace_##name(args); \ > } > > /* > @@ -398,6 +407,8 @@ static inline struct tracepoint > *tracepoint_ptr_deref(tracepoint_ptr_t *p) > #define __DECLARE_TRACE_COMMON(name, proto, args, data_proto) > \ > static inline void trace_##name(proto) \ > { } \ > + static inline void trace_invoke_##name(proto) \ > + { } \ > static inline int \ > register_trace_##name(void (*probe)(data_proto), \ > void *data) \
