1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
5 * Holds LTTng per-session event registry.
7 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
10 #ifndef _LTTNG_EVENTS_H
11 #define _LTTNG_EVENTS_H
13 #include <lttng/kernel-version.h>
14 #include <linux/list.h>
15 #include <linux/kprobes.h>
16 #include <linux/kref.h>
17 #include <linux/uuid.h>
18 #include <linux/irq_work.h>
19 #include <linux/uprobes.h>
21 #include <lttng/cpuhotplug.h>
22 #include <lttng/tracer.h>
23 #include <lttng/abi.h>
24 #include <lttng/abi-old.h>
25 #include <lttng/endian.h>
27 #define lttng_is_signed_type(type) (((type) -1) < (type) 1)
29 struct lttng_kernel_channel_buffer
;
30 struct lttng_kernel_channel_counter
;
31 struct lttng_kernel_session
;
32 struct lttng_kernel_ring_buffer_ctx
;
34 /* Type description */
36 enum lttng_kernel_type
{
37 lttng_kernel_type_integer
,
38 lttng_kernel_type_string
,
39 lttng_kernel_type_enum
,
40 lttng_kernel_type_array
,
41 lttng_kernel_type_sequence
,
42 lttng_kernel_type_struct
,
43 lttng_kernel_type_variant
,
44 NR_LTTNG_KERNEL_TYPES
,
47 enum lttng_kernel_string_encoding
{
48 lttng_kernel_string_encoding_none
= 0,
49 lttng_kernel_string_encoding_UTF8
= 1,
50 lttng_kernel_string_encoding_ASCII
= 2,
51 NR_LTTNG_KERNEL_STRING_ENCODING
,
54 struct lttng_kernel_enum_value
{
55 unsigned long long value
;
56 unsigned int signedness
:1;
59 struct lttng_kernel_enum_entry
{
60 struct lttng_kernel_enum_value start
, end
; /* start and end are inclusive */
63 unsigned int is_auto
:1;
68 * struct lttng_kernel_type_common is fixed-size. Its children inherits
69 * from it by embedding struct lttng_kernel_type_common as its first field.
71 struct lttng_kernel_type_common
{
72 enum lttng_kernel_type type
;
75 struct lttng_kernel_type_integer
{
76 struct lttng_kernel_type_common parent
;
77 unsigned int size
; /* in bits */
78 unsigned short alignment
; /* in bits */
79 unsigned int signedness
:1,
81 user
:1; /* fetch from user-space */
82 unsigned int base
; /* 2, 8, 10, 16, for pretty print */
85 struct lttng_kernel_type_string
{
86 struct lttng_kernel_type_common parent
;
87 enum lttng_kernel_string_encoding encoding
;
88 unsigned int user
:1; /* fetch from user-space */
91 struct lttng_kernel_type_enum
{
92 struct lttng_kernel_type_common parent
;
93 const struct lttng_kernel_enum_desc
*desc
; /* Enumeration mapping */
94 const struct lttng_kernel_type_common
*container_type
;
97 struct lttng_kernel_type_array
{
98 struct lttng_kernel_type_common parent
;
99 const struct lttng_kernel_type_common
*elem_type
;
100 unsigned int length
; /* Num. elems. */
101 unsigned int alignment
; /* Alignment in bytes before elements. */
102 enum lttng_kernel_string_encoding encoding
;
105 struct lttng_kernel_type_sequence
{
106 struct lttng_kernel_type_common parent
;
107 const char *length_name
; /* Length field name. If NULL, use previous field. */
108 const struct lttng_kernel_type_common
*elem_type
;
109 unsigned int alignment
; /* Alignment in bytes before elements. */
110 enum lttng_kernel_string_encoding encoding
;
113 struct lttng_kernel_type_struct
{
114 struct lttng_kernel_type_common parent
;
115 unsigned int nr_fields
;
116 const struct lttng_kernel_event_field
* const *fields
; /* Array of pointers to fields. */
117 unsigned int alignment
; /* Alignment in bits */
120 struct lttng_kernel_type_variant
{
121 struct lttng_kernel_type_common parent
;
122 const char *tag_name
; /* Tag field name. If NULL, use previous field. */
123 const struct lttng_kernel_event_field
* const *choices
; /* Array of pointers to fields. */
124 unsigned int nr_choices
;
125 unsigned int alignment
; /* Alignment in bytes */
128 struct lttng_kernel_enum_desc
{
130 const struct lttng_kernel_enum_entry
* const *entries
;
131 unsigned int nr_entries
;
132 const struct lttng_kernel_probe_desc
*probe_desc
;
135 /* Event field description */
137 struct lttng_kernel_event_field
{
139 const struct lttng_kernel_type_common
*type
;
140 unsigned int nowrite
:1, /* do not write into trace */
141 nofilter
:1; /* do not consider for filter */
145 #define PARAMS(args...) args
148 #define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base) \
149 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \
151 .type = lttng_kernel_type_integer, \
154 .alignment = (_alignment), \
155 .signedness = (_signedness), \
156 .reverse_byte_order = (_byte_order) != __BYTE_ORDER, \
161 #define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \
162 _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 0, _base)
164 #define lttng_kernel_static_type_user_integer(_size, _alignment, _signedness, _byte_order, _base) \
165 _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 1, _base)
167 #define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base) \
168 _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \
169 lttng_alignof(_type) * CHAR_BIT, \
170 lttng_is_signed_type(_type), \
171 _byte_order, _user, _base)
173 #define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \
174 _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 0, _base)
176 #define lttng_kernel_static_type_user_integer_from_type(_type, _byte_order, _base) \
177 _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 1, _base)
179 #define lttng_kernel_static_type_enum(_desc, _container_type) \
180 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_enum, { \
182 .type = lttng_kernel_type_enum, \
185 .container_type = (_container_type), \
188 #define lttng_kernel_static_type_array(_length, _elem_type, _alignment, _encoding) \
189 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_array, { \
191 .type = lttng_kernel_type_array, \
193 .length = (_length), \
194 .alignment = (_alignment), \
195 .encoding = lttng_kernel_string_encoding_##_encoding, \
196 .elem_type = (_elem_type), \
199 #define lttng_kernel_static_type_array_text(_length) \
200 lttng_kernel_static_type_array(_length, \
201 lttng_kernel_static_type_integer(sizeof(char) * CHAR_BIT, \
202 lttng_alignof(char) * CHAR_BIT, lttng_is_signed_type(char), \
206 #define lttng_kernel_static_type_sequence(_length_name, _elem_type, _alignment, _encoding) \
207 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_sequence, { \
209 .type = lttng_kernel_type_sequence, \
211 .length_name = (_length_name), \
212 .alignment = (_alignment), \
213 .encoding = lttng_kernel_string_encoding_##_encoding, \
214 .elem_type = (_elem_type), \
217 #define lttng_kernel_static_type_string(_encoding, _user) \
218 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \
220 .type = lttng_kernel_type_string, \
222 .encoding = lttng_kernel_string_encoding_##_encoding, \
226 #define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment) \
229 .type = lttng_kernel_type_struct, \
231 .nr_fields = (_nr_fields), \
233 .alignment = (_alignment), \
236 #define lttng_kernel_static_type_struct(_nr_fields, _fields, _alignment) \
237 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_struct, \
238 lttng_kernel_static_type_struct_init(_nr_fields, PARAMS(_fields), _alignment) \
241 #define lttng_kernel_static_type_variant(_nr_choices, _choices, _tag_name, _alignment) \
242 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_variant, { \
244 .type = lttng_kernel_type_variant, \
246 .tag_name = (_tag_name), \
247 .choices = _choices, \
248 .nr_choices = (_nr_choices), \
249 .alignment = (_alignment), \
252 #define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter) \
253 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, { \
256 .nowrite = (_nowrite), \
257 .nofilter = (_nofilter), \
260 #define lttng_kernel_static_event_field_array(_fields...) \
261 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field *, \
265 #define lttng_kernel_static_enum_entry_value(_string, _value) \
266 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
268 .signedness = lttng_is_signed_type(__typeof__(_value)), \
269 .value = lttng_is_signed_type(__typeof__(_value)) ? \
270 (long long) (_value) : (_value), \
273 .signedness = lttng_is_signed_type(__typeof__(_value)), \
274 .value = lttng_is_signed_type(__typeof__(_value)) ? \
275 (long long) (_value) : (_value), \
277 .string = (_string), \
280 #define lttng_kernel_static_enum_entry_range(_string, _range_start, _range_end) \
281 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
283 .signedness = lttng_is_signed_type(__typeof__(_range_start)), \
284 .value = lttng_is_signed_type(__typeof__(_range_start)) ? \
285 (long long) (_range_start) : (_range_start), \
288 .signedness = lttng_is_signed_type(__typeof__(_range_end)), \
289 .value = lttng_is_signed_type(__typeof__(_range_end)) ? \
290 (long long) (_range_end) : (_range_end), \
292 .string = (_string), \
295 #define lttng_kernel_static_enum_entry_auto(_string) \
296 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
305 .string = (_string), \
311 struct lttng_kernel_probe_ctx
{
312 struct lttng_kernel_event_common
*event
;
313 uint8_t interruptible
;
316 struct lttng_kernel_tracepoint_class
{
317 void (*probe_callback
)(void);
318 const struct lttng_kernel_event_field
* const *fields
; /* event payload */
319 unsigned int nr_fields
;
320 const struct lttng_kernel_probe_desc
*probe_desc
;
323 struct lttng_kernel_event_desc
{
324 const char *event_name
; /* lttng-modules name */
325 const char *event_kname
; /* Linux kernel name (tracepoints) */
326 const struct lttng_kernel_probe_desc
*probe_desc
;
327 const struct lttng_kernel_tracepoint_class
*tp_class
;
328 struct module
*owner
;
331 struct lttng_kernel_probe_desc
{
332 const char *provider_name
;
333 const struct lttng_kernel_event_desc
* const *event_desc
;
334 unsigned int nr_events
;
335 struct list_head head
; /* chain registered probes */
336 struct list_head lazy_init_head
;
337 int lazy
; /* lazy registration */
341 * Result of the run_filter() callback.
343 enum lttng_kernel_event_filter_result
{
344 LTTNG_KERNEL_EVENT_FILTER_ACCEPT
= 0,
345 LTTNG_KERNEL_EVENT_FILTER_REJECT
= 1,
348 struct lttng_kernel_event_common_private
;
350 enum lttng_kernel_event_type
{
351 LTTNG_KERNEL_EVENT_TYPE_RECORDER
= 0,
352 LTTNG_KERNEL_EVENT_TYPE_NOTIFIER
= 1,
353 LTTNG_KERNEL_EVENT_TYPE_COUNTER
= 2
356 struct lttng_kernel_event_common
{
357 struct lttng_kernel_event_common_private
*priv
; /* Private event interface */
359 enum lttng_kernel_event_type type
;
360 /* Get child with container_of(). */
363 int eval_filter
; /* Need to evaluate filters */
364 int (*run_filter
)(const struct lttng_kernel_event_common
*event
,
365 const char *stack_data
,
366 struct lttng_kernel_probe_ctx
*probe_ctx
,
370 struct lttng_kernel_event_recorder_private
;
372 struct lttng_kernel_event_recorder
{
373 struct lttng_kernel_event_common parent
;
374 struct lttng_kernel_event_recorder_private
*priv
; /* Private event record interface */
376 struct lttng_kernel_channel_buffer
*chan
;
379 struct lttng_kernel_event_counter_ctx
{
383 struct lttng_kernel_event_counter_private
;
385 struct lttng_kernel_event_counter
{
386 struct lttng_kernel_event_common parent
;
387 struct lttng_kernel_event_counter_private
*priv
; /* Private event counter interface */
389 struct lttng_kernel_channel_counter
*chan
;
391 int use_args
; /* Use input arguments. */
394 struct lttng_kernel_notification_ctx
{
395 int eval_capture
; /* Capture evaluation available. */
398 struct lttng_kernel_event_notifier_private
;
400 struct lttng_kernel_event_notifier
{
401 struct lttng_kernel_event_common parent
;
402 struct lttng_kernel_event_notifier_private
*priv
; /* Private event notifier interface */
404 int eval_capture
; /* Need to evaluate capture */
405 void (*notification_send
)(struct lttng_kernel_event_notifier
*event_notifier
,
406 const char *stack_data
,
407 struct lttng_kernel_probe_ctx
*probe_ctx
,
408 struct lttng_kernel_notification_ctx
*notif_ctx
);
411 struct lttng_kernel_channel_buffer_ops
{
412 struct lttng_kernel_channel_buffer_ops_private
*priv
; /* Private channel buffer ops interface. */
414 int (*event_reserve
)(struct lttng_kernel_ring_buffer_ctx
*ctx
);
415 void (*event_commit
)(struct lttng_kernel_ring_buffer_ctx
*ctx
);
416 void (*event_write
)(struct lttng_kernel_ring_buffer_ctx
*ctx
, const void *src
,
417 size_t len
, size_t alignment
);
418 void (*event_write_from_user
)(struct lttng_kernel_ring_buffer_ctx
*ctx
,
419 const void *src
, size_t len
, size_t alignment
);
420 void (*event_memset
)(struct lttng_kernel_ring_buffer_ctx
*ctx
,
422 void (*event_strcpy
)(struct lttng_kernel_ring_buffer_ctx
*ctx
, const char *src
,
424 void (*event_strcpy_from_user
)(struct lttng_kernel_ring_buffer_ctx
*ctx
,
425 const char __user
*src
, size_t len
);
426 void (*event_pstrcpy_pad
)(struct lttng_kernel_ring_buffer_ctx
*ctx
,
427 const char *src
, size_t len
);
428 void (*event_pstrcpy_pad_from_user
)(struct lttng_kernel_ring_buffer_ctx
*ctx
,
429 const char __user
*src
, size_t len
);
430 void (*lost_event_too_big
)(struct lttng_kernel_channel_buffer
*lttng_channel
);
433 enum lttng_kernel_channel_type
{
434 LTTNG_KERNEL_CHANNEL_TYPE_BUFFER
= 0,
435 LTTNG_KERNEL_CHANNEL_TYPE_COUNTER
= 1,
438 struct lttng_kernel_channel_common_private
;
440 /* Use container_of() to get child. */
441 struct lttng_kernel_channel_common
{
442 struct lttng_kernel_channel_common_private
*priv
; /* Private channel interface. */
444 enum lttng_kernel_channel_type type
;
447 struct lttng_kernel_session
*session
;
450 struct lttng_kernel_channel_buffer_private
;
452 struct lttng_kernel_channel_buffer
{
453 struct lttng_kernel_channel_common parent
;
454 struct lttng_kernel_channel_buffer_private
*priv
;
456 struct lttng_kernel_channel_buffer_ops
*ops
;
459 struct lttng_kernel_channel_counter
;
460 struct lttng_kernel_channel_counter_ops_private
;
462 struct lttng_kernel_channel_counter_ops
{
463 struct lttng_kernel_channel_counter_ops_private
*priv
; /* Private channel counter ops interface */
465 int (*counter_hit
)(struct lttng_kernel_event_counter
*event_counter
,
466 const char *stack_data
,
467 struct lttng_kernel_probe_ctx
*probe_ctx
,
468 struct lttng_kernel_event_counter_ctx
*event_counter_ctx
);
471 struct lttng_kernel_channel_counter
{
472 struct lttng_kernel_channel_common parent
;
473 struct lttng_kernel_channel_counter_private
*priv
; /* Private channel counter interface */
475 struct lttng_kernel_channel_counter_ops
*ops
;
478 #define LTTNG_DYNAMIC_LEN_STACK_SIZE 128
480 struct lttng_dynamic_len_stack
{
481 size_t stack
[LTTNG_DYNAMIC_LEN_STACK_SIZE
];
485 DECLARE_PER_CPU(struct lttng_dynamic_len_stack
, lttng_dynamic_len_stack
);
488 * struct lttng_kernel_id_tracker declared in header due to deferencing of *v
489 * in RCU_INITIALIZER(v).
491 #define LTTNG_ID_HASH_BITS 6
492 #define LTTNG_ID_TABLE_SIZE (1 << LTTNG_ID_HASH_BITS)
494 struct lttng_kernel_id_tracker_rcu
{
495 struct hlist_head id_hash
[LTTNG_ID_TABLE_SIZE
];
498 struct lttng_kernel_id_tracker
{
499 struct lttng_kernel_id_tracker_private
*priv
; /* Private API */
501 struct lttng_kernel_id_tracker_rcu
*p
; /* RCU dereferenced. */
504 struct lttng_kernel_session_private
;
506 struct lttng_kernel_session
{
507 struct lttng_kernel_session_private
*priv
; /* Private session interface */
509 int active
; /* Is trace session active ? */
511 struct lttng_kernel_id_tracker pid_tracker
;
512 struct lttng_kernel_id_tracker vpid_tracker
;
513 struct lttng_kernel_id_tracker uid_tracker
;
514 struct lttng_kernel_id_tracker vuid_tracker
;
515 struct lttng_kernel_id_tracker gid_tracker
;
516 struct lttng_kernel_id_tracker vgid_tracker
;
519 int lttng_kernel_probe_register(struct lttng_kernel_probe_desc
*desc
);
520 void lttng_kernel_probe_unregister(struct lttng_kernel_probe_desc
*desc
);
522 bool lttng_id_tracker_lookup(struct lttng_kernel_id_tracker_rcu
*p
, int id
);
525 struct lttng_kernel_channel_common
*lttng_kernel_get_chan_common_from_event_common(
526 struct lttng_kernel_event_common
*event
)
528 switch (event
->type
) {
529 case LTTNG_KERNEL_EVENT_TYPE_RECORDER
:
531 struct lttng_kernel_event_recorder
*event_recorder
=
532 container_of(event
, struct lttng_kernel_event_recorder
, parent
);
533 struct lttng_kernel_channel_buffer
*chan_buf
= event_recorder
->chan
;
535 return &chan_buf
->parent
;
537 case LTTNG_KERNEL_EVENT_TYPE_COUNTER
:
539 struct lttng_kernel_event_counter
*event_counter
=
540 container_of(event
, struct lttng_kernel_event_counter
, parent
);
541 struct lttng_kernel_channel_counter
*chan_counter
= event_counter
->chan
;
543 return &chan_counter
->parent
;
550 #endif /* _LTTNG_EVENTS_H */