On Tue, 17 Nov 2020 15:34:51 -0500 Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > On Tue, 17 Nov 2020 14:47:20 -0500 (EST) > Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> wrote: > > > There seems to be more effect on the data size: adding the "stub_func" field > > in struct tracepoint adds 8320 bytes of data to my vmlinux. But considering > > the layout of struct tracepoint: > > > > struct tracepoint { > > const char *name; /* Tracepoint name */ > > struct static_key key; > > struct static_call_key *static_call_key; > > void *static_call_tramp; > > void *iterator; > > int (*regfunc)(void); > > void (*unregfunc)(void); > > struct tracepoint_func __rcu *funcs; > > void *stub_func; > > }; > > > > I would argue that we have many other things to optimize there if we want to > > shrink the bloat, starting with static keys and system call reg/unregfunc pointers. > > This is the part that I want to decrease, and yes there's other fish to fry > in that code, but I really don't want to be adding more. If it comes down to not trusting calling a stub, I'll still keep the stub logic in, and just add the following: diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 0f21617f1a66..d50a1a652d61 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -33,6 +33,8 @@ struct trace_eval_map { #define TRACEPOINT_DEFAULT_PRIO 10 +extern void tp_stub_func(void *data, ...); + extern struct srcu_struct tracepoint_srcu; extern int @@ -310,7 +312,8 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) do { \ it_func = (it_func_ptr)->func; \ __data = (it_func_ptr)->data; \ - ((void(*)(void *, proto))(it_func))(__data, args); \ + if (likely(it_func != tp_stub_func)) \ + ((void(*)(void *, proto))(it_func))(__data, args); \ } while ((++it_func_ptr)->func); \ return 0; \ } \ diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 774b3733cbbe..f3bb0ee478d1 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c @@ -54,7 +54,7 @@ struct tp_probes { }; /* Called in removal of a func but failed to allocate a new tp_funcs */ -static void tp_stub_func(void) +void tp_stub_func(void *data, ...) { return; } -- Steve