On Sat, Oct 26, 2024 at 8:48 AM Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> wrote: > > Shrink the struct tracepoint size from 80 bytes to 72 bytes on x86-64 by > moving the (typically NULL) regfunc/unregfunc pointers to an extended > structure. > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> > Cc: Michael Jeanson <mjeanson@xxxxxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: Masami Hiramatsu <mhiramat@xxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Cc: Alexei Starovoitov <ast@xxxxxxxxxx> > Cc: Yonghong Song <yhs@xxxxxx> > Cc: Paul E. McKenney <paulmck@xxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxxxxx> > Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > Cc: Mark Rutland <mark.rutland@xxxxxxx> > Cc: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > Cc: Namhyung Kim <namhyung@xxxxxxxxxx> > Cc: Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> > Cc: bpf@xxxxxxxxxxxxxxx > Cc: Joel Fernandes <joel@xxxxxxxxxxxxxxxxx> > Cc: Jordan Rife <jrife@xxxxxxxxxx> > --- > include/linux/tracepoint-defs.h | 8 ++++++-- > include/linux/tracepoint.h | 19 +++++++++++++------ > kernel/tracepoint.c | 9 ++++----- > 3 files changed, 23 insertions(+), 13 deletions(-) > > diff --git a/include/linux/tracepoint-defs.h b/include/linux/tracepoint-defs.h > index 60a6e8314d4c..967c08d9da84 100644 > --- a/include/linux/tracepoint-defs.h > +++ b/include/linux/tracepoint-defs.h > @@ -29,6 +29,11 @@ struct tracepoint_func { > int prio; > }; > > +struct tracepoint_ext { > + int (*regfunc)(void); > + void (*unregfunc)(void); > +}; > + > struct tracepoint { > const char *name; /* Tracepoint name */ > struct static_key_false key; > @@ -36,9 +41,8 @@ struct tracepoint { > void *static_call_tramp; > void *iterator; > void *probestub; > - int (*regfunc)(void); > - void (*unregfunc)(void); > struct tracepoint_func __rcu *funcs; > + struct tracepoint_ext *ext; > }; > > #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h > index 0dc67fad706c..83dc24ee8b13 100644 > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -302,7 +302,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) > * structures, so we create an array of pointers that will be used for iteration > * on the tracepoints. > */ > -#define DEFINE_TRACE_FN(_name, _reg, _unreg, proto, args) \ > +#define __DEFINE_TRACE_EXT(_name, _ext, proto, args) \ > static const char __tpstrtab_##_name[] \ > __section("__tracepoints_strings") = #_name; \ > extern struct static_call_key STATIC_CALL_KEY(tp_func_##_name); \ > @@ -316,9 +316,9 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) > .static_call_tramp = STATIC_CALL_TRAMP_ADDR(tp_func_##_name), \ > .iterator = &__traceiter_##_name, \ > .probestub = &__probestub_##_name, \ > - .regfunc = _reg, \ > - .unregfunc = _unreg, \ > - .funcs = NULL }; \ > + .funcs = NULL, \ > + .ext = _ext, \ > + }; \ > __TRACEPOINT_ENTRY(_name); \ > int __traceiter_##_name(void *__data, proto) \ > { \ > @@ -341,8 +341,15 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) > } \ > DEFINE_STATIC_CALL(tp_func_##_name, __traceiter_##_name); > > -#define DEFINE_TRACE(name, proto, args) \ > - DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args)); > +#define DEFINE_TRACE_FN(_name, _reg, _unreg, _proto, _args) \ > + struct tracepoint_ext __tracepoint_ext_##_name = { \ can be static, no? > + .regfunc = _reg, \ > + .unregfunc = _unreg, \ > + }; \ > + __DEFINE_TRACE_EXT(_name, &__tracepoint_ext_##_name, PARAMS(_proto), PARAMS(_args)); > + > +#define DEFINE_TRACE(_name, _proto, _args) \ > + __DEFINE_TRACE_EXT(_name, NULL, PARAMS(_proto), PARAMS(_args)); > > #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \ > EXPORT_SYMBOL_GPL(__tracepoint_##name); \ > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c > index 6474e2cf22c9..5658dc92f5b5 100644 > --- a/kernel/tracepoint.c > +++ b/kernel/tracepoint.c > @@ -278,8 +278,8 @@ static int tracepoint_add_func(struct tracepoint *tp, > struct tracepoint_func *old, *tp_funcs; > int ret; > > - if (tp->regfunc && !static_key_enabled(&tp->key)) { > - ret = tp->regfunc(); > + if (tp->ext && tp->ext->regfunc && !static_key_enabled(&tp->key)) { > + ret = tp->ext->regfunc(); > if (ret < 0) > return ret; > } > @@ -362,9 +362,8 @@ static int tracepoint_remove_func(struct tracepoint *tp, > switch (nr_func_state(tp_funcs)) { > case TP_FUNC_0: /* 1->0 */ > /* Removed last function */ > - if (tp->unregfunc && static_key_enabled(&tp->key)) > - tp->unregfunc(); > - > + if (tp->ext && tp->ext->unregfunc && static_key_enabled(&tp->key)) > + tp->ext->unregfunc(); > static_branch_disable(&tp->key); > /* Set iterator static call */ > tracepoint_update_call(tp, tp_funcs); > -- > 2.39.5 >