Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

tracing: Add helpers to create trace remote events

Declaring remote events can be cumbersome let's add a set of macros to
simplify developers life. The declaration of a remote event is very
similar to kernel's events:

REMOTE_EVENT(name, id,
RE_STRUCT(
re_field(u64 foo)
),
RE_PRINTK("foo=%llu", __entry->foo)
)

Link: https://patch.msgid.link/20260309162516.2623589-12-vdonnefort@google.com
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

authored by

Vincent Donnefort and committed by
Steven Rostedt (Google)
5f3efd1d 775cb093

+83
+10
include/linux/trace_remote_event.h
··· 5 5 6 6 struct trace_remote; 7 7 struct trace_event_fields; 8 + struct trace_seq; 8 9 9 10 struct remote_event_hdr { 10 11 unsigned short id; ··· 21 20 char *print_fmt; 22 21 void (*print)(void *evt, struct trace_seq *seq); 23 22 }; 23 + 24 + #define RE_STRUCT(__args...) __args 25 + #define re_field(__type, __field) __type __field; 26 + 27 + #define REMOTE_EVENT_FORMAT(__name, __struct) \ 28 + struct remote_event_format_##__name { \ 29 + struct remote_event_hdr hdr; \ 30 + __struct \ 31 + } 24 32 #endif
+73
include/trace/define_remote_events.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + 3 + #include <linux/trace_events.h> 4 + #include <linux/trace_remote_event.h> 5 + #include <linux/trace_seq.h> 6 + #include <linux/stringify.h> 7 + 8 + #define REMOTE_EVENT_INCLUDE(__file) __stringify(../../__file) 9 + 10 + #ifdef REMOTE_EVENT_SECTION 11 + # define __REMOTE_EVENT_SECTION(__name) __used __section(REMOTE_EVENT_SECTION"."#__name) 12 + #else 13 + # define __REMOTE_EVENT_SECTION(__name) 14 + #endif 15 + 16 + #define REMOTE_PRINTK_COUNT_ARGS(__args...) \ 17 + __COUNT_ARGS(, ##__args, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0) 18 + 19 + #define __remote_printk0() \ 20 + trace_seq_putc(seq, '\n') 21 + 22 + #define __remote_printk1(__fmt) \ 23 + trace_seq_puts(seq, " " __fmt "\n") \ 24 + 25 + #define __remote_printk2(__fmt, __args...) \ 26 + do { \ 27 + trace_seq_putc(seq, ' '); \ 28 + trace_seq_printf(seq, __fmt, __args); \ 29 + trace_seq_putc(seq, '\n'); \ 30 + } while (0) 31 + 32 + /* Apply the appropriate trace_seq sequence according to the number of arguments */ 33 + #define remote_printk(__args...) \ 34 + CONCATENATE(__remote_printk, REMOTE_PRINTK_COUNT_ARGS(__args))(__args) 35 + 36 + #define RE_PRINTK(__args...) __args 37 + 38 + #define REMOTE_EVENT(__name, __id, __struct, __printk) \ 39 + REMOTE_EVENT_FORMAT(__name, __struct); \ 40 + static void remote_event_print_##__name(void *evt, struct trace_seq *seq) \ 41 + { \ 42 + struct remote_event_format_##__name __maybe_unused *__entry = evt; \ 43 + trace_seq_puts(seq, #__name); \ 44 + remote_printk(__printk); \ 45 + } 46 + #include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE) 47 + 48 + #undef REMOTE_EVENT 49 + #undef RE_PRINTK 50 + #undef re_field 51 + #define re_field(__type, __field) \ 52 + { \ 53 + .type = #__type, .name = #__field, \ 54 + .size = sizeof(__type), .align = __alignof__(__type), \ 55 + .is_signed = is_signed_type(__type), \ 56 + }, 57 + #define __entry REC 58 + #define RE_PRINTK(__fmt, __args...) "\"" __fmt "\", " __stringify(__args) 59 + #define REMOTE_EVENT(__name, __id, __struct, __printk) \ 60 + static struct trace_event_fields remote_event_fields_##__name[] = { \ 61 + __struct \ 62 + {} \ 63 + }; \ 64 + static char remote_event_print_fmt_##__name[] = __printk; \ 65 + static struct remote_event __REMOTE_EVENT_SECTION(__name) \ 66 + remote_event_##__name = { \ 67 + .name = #__name, \ 68 + .id = __id, \ 69 + .fields = remote_event_fields_##__name, \ 70 + .print_fmt = remote_event_print_fmt_##__name, \ 71 + .print = remote_event_print_##__name, \ 72 + } 73 + #include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE)