On Fri, 13 Jun 2025 10:28:34 -0400 Steven Rostedt <rost...@goodmis.org> wrote:
> And each DEFINE_EVENT() is approximately 1296 bytes. > ((19559 - 2069) - 5819) / 9 Interesting enough, just raw tracepoints are not much better. I updated the header file (attached) to have 10 of these, and compiled that. DECLARE_TRACE(size_event_1, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); The result is: text data bss dec hex filename 629 1440 0 2069 815 no-events.ko 44837 15424 0 60261 eb65 trace-events.ko 11495 8064 0 19559 4c67 define-events.ko 10865 4408 0 15273 3ba9 declare-trace.ko Where each DECLARE_TRACE() ends up being 1320 bytes. (15273 - 2069) / 10 This is slightly bigger than a DEFINE_EVENT(), but that's also because the DEFINE_EVENT() shares some of the tracepoint creation in the DECLARE_EVENT_CLASS(), where as that work is done fully in the DECLARE_TRACE(). -- Steve
/* SPDX-License-Identifier: GPL-2.0 */ #undef TRACE_SYSTEM #define TRACE_SYSTEM event-sizes #undef TRACE_SYSTEM_VAR #define TRACE_SYSTEM_VAR event_sizes #if !defined(_SIZE_EVENT_H) || defined(TRACE_HEADER_MULTI_READ) #define _SIZE_EVENT_H #include <linux/tracepoint.h> #ifndef SIZE_EVENT_DEFINED #define SIZE_EVENT_DEFINED struct size_event_struct { unsigned long a; unsigned long b; }; #endif #define DEFINE_EVENT_SIZES 0 #define DEFINE_FULL_EVENTS 0 #define DEFINE_JUST_TRACEPOINTS 1 #if DEFINE_EVENT_SIZES TRACE_EVENT(size_event_1, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); #if DEFINE_FULL_EVENTS TRACE_EVENT(size_event_2, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_3, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_4, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_5, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_6, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_7, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_8, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_9, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); TRACE_EVENT(size_event_10, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B), TP_STRUCT__entry( __field( unsigned long, Aa) __field( unsigned long, Ab) __field( unsigned long, Ba) __field( unsigned long, Bb) ), TP_fast_assign( __entry->Aa = A->a; __entry->Ab = A->b; __entry->Ba = B->a; __entry->Bb = B->b; ), TP_printk("Aa=%ld Ab=%ld Ba=%ld Bb=%ld", __entry->Aa, __entry->Ab, __entry->Ba, __entry->Bb) ); #else /* !DEFINE_FULL_EVENTS */ DEFINE_EVENT(size_event_1, size_event_2, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_3, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_4, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_5, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_6, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_7, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_8, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_9, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DEFINE_EVENT(size_event_1, size_event_10, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); #endif /* !DEFINE_FULL_EVENTS */ #elif DEFINE_JUST_TRACEPOINTS DECLARE_TRACE(size_event_1, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_2, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_3, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_4, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_5, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_6, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_7, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_8, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_9, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); DECLARE_TRACE(size_event_10, TP_PROTO(struct size_event_struct *A, struct size_event_struct *B), TP_ARGS(A, B)); #endif /* DEFINE_EVENT_SIZES && DEFINE_JUST_TRACEPOINTS */ #endif /***** NOTICE! The #if protection ends here. *****/ #undef TRACE_INCLUDE_PATH #undef TRACE_INCLUDE_FILE #define TRACE_INCLUDE_PATH . #define TRACE_INCLUDE_FILE size_events #include <trace/define_trace.h>