mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
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>
This commit is contained in:
parent
775cb093bc
commit
5f3efd1dce
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
struct trace_remote;
|
||||
struct trace_event_fields;
|
||||
struct trace_seq;
|
||||
|
||||
struct remote_event_hdr {
|
||||
unsigned short id;
|
||||
|
|
@ -20,4 +21,13 @@ struct remote_event {
|
|||
char *print_fmt;
|
||||
void (*print)(void *evt, struct trace_seq *seq);
|
||||
};
|
||||
|
||||
#define RE_STRUCT(__args...) __args
|
||||
#define re_field(__type, __field) __type __field;
|
||||
|
||||
#define REMOTE_EVENT_FORMAT(__name, __struct) \
|
||||
struct remote_event_format_##__name { \
|
||||
struct remote_event_hdr hdr; \
|
||||
__struct \
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
73
include/trace/define_remote_events.h
Normal file
73
include/trace/define_remote_events.h
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <linux/trace_events.h>
|
||||
#include <linux/trace_remote_event.h>
|
||||
#include <linux/trace_seq.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#define REMOTE_EVENT_INCLUDE(__file) __stringify(../../__file)
|
||||
|
||||
#ifdef REMOTE_EVENT_SECTION
|
||||
# define __REMOTE_EVENT_SECTION(__name) __used __section(REMOTE_EVENT_SECTION"."#__name)
|
||||
#else
|
||||
# define __REMOTE_EVENT_SECTION(__name)
|
||||
#endif
|
||||
|
||||
#define REMOTE_PRINTK_COUNT_ARGS(__args...) \
|
||||
__COUNT_ARGS(, ##__args, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0)
|
||||
|
||||
#define __remote_printk0() \
|
||||
trace_seq_putc(seq, '\n')
|
||||
|
||||
#define __remote_printk1(__fmt) \
|
||||
trace_seq_puts(seq, " " __fmt "\n") \
|
||||
|
||||
#define __remote_printk2(__fmt, __args...) \
|
||||
do { \
|
||||
trace_seq_putc(seq, ' '); \
|
||||
trace_seq_printf(seq, __fmt, __args); \
|
||||
trace_seq_putc(seq, '\n'); \
|
||||
} while (0)
|
||||
|
||||
/* Apply the appropriate trace_seq sequence according to the number of arguments */
|
||||
#define remote_printk(__args...) \
|
||||
CONCATENATE(__remote_printk, REMOTE_PRINTK_COUNT_ARGS(__args))(__args)
|
||||
|
||||
#define RE_PRINTK(__args...) __args
|
||||
|
||||
#define REMOTE_EVENT(__name, __id, __struct, __printk) \
|
||||
REMOTE_EVENT_FORMAT(__name, __struct); \
|
||||
static void remote_event_print_##__name(void *evt, struct trace_seq *seq) \
|
||||
{ \
|
||||
struct remote_event_format_##__name __maybe_unused *__entry = evt; \
|
||||
trace_seq_puts(seq, #__name); \
|
||||
remote_printk(__printk); \
|
||||
}
|
||||
#include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE)
|
||||
|
||||
#undef REMOTE_EVENT
|
||||
#undef RE_PRINTK
|
||||
#undef re_field
|
||||
#define re_field(__type, __field) \
|
||||
{ \
|
||||
.type = #__type, .name = #__field, \
|
||||
.size = sizeof(__type), .align = __alignof__(__type), \
|
||||
.is_signed = is_signed_type(__type), \
|
||||
},
|
||||
#define __entry REC
|
||||
#define RE_PRINTK(__fmt, __args...) "\"" __fmt "\", " __stringify(__args)
|
||||
#define REMOTE_EVENT(__name, __id, __struct, __printk) \
|
||||
static struct trace_event_fields remote_event_fields_##__name[] = { \
|
||||
__struct \
|
||||
{} \
|
||||
}; \
|
||||
static char remote_event_print_fmt_##__name[] = __printk; \
|
||||
static struct remote_event __REMOTE_EVENT_SECTION(__name) \
|
||||
remote_event_##__name = { \
|
||||
.name = #__name, \
|
||||
.id = __id, \
|
||||
.fields = remote_event_fields_##__name, \
|
||||
.print_fmt = remote_event_print_fmt_##__name, \
|
||||
.print = remote_event_print_##__name, \
|
||||
}
|
||||
#include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE)
|
||||
Loading…
Reference in New Issue
Block a user