Message ID | 20241026154629.593041-1-mathieu.desnoyers@efficios.com (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Series | [RFC,v3,1/3] tracing: Introduce tracepoint extended structure | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
On Sat, Oct 26, 2024 at 8:48 AM Mathieu Desnoyers <mathieu.desnoyers@efficios.com> 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@efficios.com> > Cc: Michael Jeanson <mjeanson@efficios.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Masami Hiramatsu <mhiramat@kernel.org> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Alexei Starovoitov <ast@kernel.org> > Cc: Yonghong Song <yhs@fb.com> > Cc: Paul E. McKenney <paulmck@kernel.org> > Cc: Ingo Molnar <mingo@redhat.com> > Cc: Arnaldo Carvalho de Melo <acme@kernel.org> > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> > Cc: Namhyung Kim <namhyung@kernel.org> > Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com> > Cc: bpf@vger.kernel.org > Cc: Joel Fernandes <joel@joelfernandes.org> > Cc: Jordan Rife <jrife@google.com> > --- > 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 >
On 2024-10-27 21:22, Andrii Nakryiko wrote: >> -#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? Yes, sorry, I'll update the series for a v5. Thanks, Mathieu
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 = { \ + .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);
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@efficios.com> Cc: Michael Jeanson <mjeanson@efficios.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Yonghong Song <yhs@fb.com> Cc: Paul E. McKenney <paulmck@kernel.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com> Cc: bpf@vger.kernel.org Cc: Joel Fernandes <joel@joelfernandes.org> Cc: Jordan Rife <jrife@google.com> --- include/linux/tracepoint-defs.h | 8 ++++++-- include/linux/tracepoint.h | 19 +++++++++++++------ kernel/tracepoint.c | 9 ++++----- 3 files changed, 23 insertions(+), 13 deletions(-)