Fix: scsi: sd: Atomic write support added in 6.11-rc1
[lttng-modules.git] / include / lttng / events.h
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
9f36eaed 2 *
2df37e95 3 * lttng/events.h
4e3c1b9b 4 *
4e3c1b9b 5 * Holds LTTng per-session event registry.
17baffe2 6 *
886d51a3 7 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4e3c1b9b
MD
8 */
9
9f36eaed
MJ
10#ifndef _LTTNG_EVENTS_H
11#define _LTTNG_EVENTS_H
12
5f4c791e 13#include <lttng/kernel-version.h>
4e3c1b9b 14#include <linux/list.h>
d6d808f3 15#include <linux/kprobes.h>
d83004aa 16#include <linux/kref.h>
41f229dc 17#include <linux/uuid.h>
754d534a 18#include <linux/irq_work.h>
853f5b15
MJ
19#include <linux/uprobes.h>
20
2df37e95
MD
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>
4e3c1b9b 26
e97dc605 27#define lttng_is_signed_type(type) (((type) -1) < (type) 1)
9e7e4892 28
f7d06400 29struct lttng_kernel_channel_buffer;
1a2317f8 30struct lttng_kernel_channel_counter;
8cdc1a81 31struct lttng_kernel_session;
8a57ec02 32struct lttng_kernel_ring_buffer_ctx;
4e3c1b9b 33
c0edae1d
MD
34/* Type description */
35
12bb2edb
MD
36enum lttng_kernel_type {
37 lttng_kernel_type_integer,
38 lttng_kernel_type_string,
437d5aa5
MD
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,
12bb2edb 44 NR_LTTNG_KERNEL_TYPES,
c0edae1d
MD
45};
46
28cbcb59
MD
47enum 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,
c0edae1d
MD
52};
53
a28cc520 54struct lttng_kernel_enum_value {
141ddf28
MD
55 unsigned long long value;
56 unsigned int signedness:1;
57};
58
a28cc520
MD
59struct lttng_kernel_enum_entry {
60 struct lttng_kernel_enum_value start, end; /* start and end are inclusive */
c0edae1d 61 const char *string;
08ad1061
PP
62 struct {
63 unsigned int is_auto:1;
64 } options;
c0edae1d
MD
65};
66
437d5aa5
MD
67/*
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.
70 */
71struct lttng_kernel_type_common {
72 enum lttng_kernel_type type;
73};
74
75struct lttng_kernel_type_integer {
76 struct lttng_kernel_type_common parent;
c099397a
MD
77 unsigned int size; /* in bits */
78 unsigned short alignment; /* in bits */
9cccf98a 79 unsigned int signedness:1,
4697aac7
MD
80 reverse_byte_order:1,
81 user:1; /* fetch from user-space */
e0a7a7c4 82 unsigned int base; /* 2, 8, 10, 16, for pretty print */
437d5aa5
MD
83};
84
85struct lttng_kernel_type_string {
86 struct lttng_kernel_type_common parent;
28cbcb59 87 enum lttng_kernel_string_encoding encoding;
4697aac7 88 unsigned int user:1; /* fetch from user-space */
c099397a
MD
89};
90
437d5aa5
MD
91struct 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;
95};
96
97struct 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. */
c27937ce 101 unsigned int alignment; /* Alignment in bytes before elements. */
437d5aa5
MD
102 enum lttng_kernel_string_encoding encoding;
103};
104
105struct lttng_kernel_type_sequence {
106 struct lttng_kernel_type_common parent;
51ef4536 107 const char *length_name; /* Length field name. If NULL, use previous field. */
437d5aa5 108 const struct lttng_kernel_type_common *elem_type;
c27937ce 109 unsigned int alignment; /* Alignment in bytes before elements. */
437d5aa5
MD
110 enum lttng_kernel_string_encoding encoding;
111};
112
113struct lttng_kernel_type_struct {
114 struct lttng_kernel_type_common parent;
115 unsigned int nr_fields;
4f1d1ee5 116 const struct lttng_kernel_event_field * const *fields; /* Array of pointers to fields. */
c27937ce 117 unsigned int alignment; /* Alignment in bits */
437d5aa5
MD
118};
119
120struct lttng_kernel_type_variant {
121 struct lttng_kernel_type_common parent;
51ef4536 122 const char *tag_name; /* Tag field name. If NULL, use previous field. */
4f1d1ee5 123 const struct lttng_kernel_event_field * const *choices; /* Array of pointers to fields. */
437d5aa5 124 unsigned int nr_choices;
c27937ce 125 unsigned int alignment; /* Alignment in bytes */
c099397a
MD
126};
127
d96a4a7a 128struct lttng_kernel_enum_desc {
c099397a 129 const char *name;
4f1d1ee5 130 const struct lttng_kernel_enum_entry * const *entries;
141ddf28 131 unsigned int nr_entries;
6c8c025b 132 const struct lttng_kernel_probe_desc *probe_desc;
c099397a 133};
c0edae1d
MD
134
135/* Event field description */
136
437d5aa5 137struct lttng_kernel_event_field {
c0edae1d 138 const char *name;
437d5aa5 139 const struct lttng_kernel_type_common *type;
f127e61e 140 unsigned int nowrite:1, /* do not write into trace */
ceabb767 141 nofilter:1; /* do not consider for filter */
c0edae1d
MD
142};
143
9857164a
FD
144#ifndef PARAMS
145#define PARAMS(args...) args
146#endif
147
4697aac7 148#define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base) \
437d5aa5
MD
149 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \
150 .parent = { \
151 .type = lttng_kernel_type_integer, \
152 }, \
153 .size = (_size), \
154 .alignment = (_alignment), \
155 .signedness = (_signedness), \
156 .reverse_byte_order = (_byte_order) != __BYTE_ORDER, \
4697aac7 157 .user = (_user), \
437d5aa5
MD
158 .base = (_base), \
159 }))
160
4697aac7
MD
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)
163
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)
166
167#define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base) \
6f185e4f 168 _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \
437d5aa5
MD
169 lttng_alignof(_type) * CHAR_BIT, \
170 lttng_is_signed_type(_type), \
6f185e4f 171 _byte_order, _user, _base)
437d5aa5 172
4697aac7
MD
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)
175
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)
178
437d5aa5
MD
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, { \
181 .parent = { \
182 .type = lttng_kernel_type_enum, \
183 }, \
184 .desc = (_desc), \
185 .container_type = (_container_type), \
186 }))
187
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, { \
190 .parent = { \
191 .type = lttng_kernel_type_array, \
192 }, \
193 .length = (_length), \
194 .alignment = (_alignment), \
195 .encoding = lttng_kernel_string_encoding_##_encoding, \
196 .elem_type = (_elem_type), \
197 }))
198
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), \
203 __BYTE_ORDER, 10), \
204 0, UTF8)
205
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, { \
208 .parent = { \
209 .type = lttng_kernel_type_sequence, \
210 }, \
211 .length_name = (_length_name), \
212 .alignment = (_alignment), \
213 .encoding = lttng_kernel_string_encoding_##_encoding, \
214 .elem_type = (_elem_type), \
215 }))
216
4697aac7 217#define lttng_kernel_static_type_string(_encoding, _user) \
437d5aa5
MD
218 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \
219 .parent = { \
220 .type = lttng_kernel_type_string, \
221 }, \
222 .encoding = lttng_kernel_string_encoding_##_encoding, \
4697aac7 223 .user = (_user), \
437d5aa5
MD
224 }))
225
9857164a
FD
226#define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment) \
227 { \
437d5aa5
MD
228 .parent = { \
229 .type = lttng_kernel_type_struct, \
230 }, \
231 .nr_fields = (_nr_fields), \
232 .fields = _fields, \
233 .alignment = (_alignment), \
9857164a
FD
234 }
235
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) \
239 ))
437d5aa5
MD
240
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, { \
243 .parent = { \
244 .type = lttng_kernel_type_variant, \
245 }, \
246 .tag_name = (_tag_name), \
247 .choices = _choices, \
248 .nr_choices = (_nr_choices), \
249 .alignment = (_alignment), \
250 }))
251
4697aac7 252#define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter) \
437d5aa5
MD
253 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, { \
254 .name = (_name), \
255 .type = (_type), \
256 .nowrite = (_nowrite), \
437d5aa5
MD
257 .nofilter = (_nofilter), \
258 })
259
260#define lttng_kernel_static_event_field_array(_fields...) \
261 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field *, \
262 _fields \
263 )
264
437d5aa5
MD
265#define lttng_kernel_static_enum_entry_value(_string, _value) \
266 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
267 .start = { \
268 .signedness = lttng_is_signed_type(__typeof__(_value)), \
269 .value = lttng_is_signed_type(__typeof__(_value)) ? \
270 (long long) (_value) : (_value), \
271 }, \
272 .end = { \
273 .signedness = lttng_is_signed_type(__typeof__(_value)), \
274 .value = lttng_is_signed_type(__typeof__(_value)) ? \
275 (long long) (_value) : (_value), \
276 }, \
277 .string = (_string), \
278 }),
279
280#define lttng_kernel_static_enum_entry_range(_string, _range_start, _range_end) \
281 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
282 .start = { \
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), \
286 }, \
287 .end = { \
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), \
291 }, \
292 .string = (_string), \
293 }),
294
295#define lttng_kernel_static_enum_entry_auto(_string) \
296 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
297 .start = { \
298 .signedness = -1, \
299 .value = -1, \
300 }, \
301 .end = { \
302 .signedness = -1, \
303 .value = -1, \
304 }, \
305 .string = (_string), \
306 .options = { \
307 .is_auto = 1, \
308 } \
309 }),
310
a92e844e 311struct lttng_kernel_probe_ctx {
e2d5dbc7 312 struct lttng_kernel_event_common *event;
79150a49
JD
313 uint8_t interruptible;
314};
315
6c8c025b
MD
316struct lttng_kernel_tracepoint_class {
317 void (*probe_callback)(void);
4f1d1ee5 318 const struct lttng_kernel_event_field * const *fields; /* event payload */
6c8c025b
MD
319 unsigned int nr_fields;
320 const struct lttng_kernel_probe_desc *probe_desc;
321};
322
437d5aa5
MD
323struct 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;
6c8c025b 327 const struct lttng_kernel_tracepoint_class *tp_class;
dc7f600a 328 struct module *owner;
c0edae1d
MD
329};
330
437d5aa5
MD
331struct lttng_kernel_probe_desc {
332 const char *provider_name;
4f1d1ee5 333 const struct lttng_kernel_event_desc * const *event_desc;
85a9ca7f
MD
334 unsigned int nr_events;
335 struct list_head head; /* chain registered probes */
3c997079
MD
336 struct list_head lazy_init_head;
337 int lazy; /* lazy registration */
85a9ca7f
MD
338};
339
8a445457
MD
340/*
341 * Result of the run_filter() callback.
342 */
343enum lttng_kernel_event_filter_result {
344 LTTNG_KERNEL_EVENT_FILTER_ACCEPT = 0,
345 LTTNG_KERNEL_EVENT_FILTER_REJECT = 1,
346};
347
a67ba386
MD
348struct lttng_kernel_event_common_private;
349
350enum lttng_kernel_event_type {
351 LTTNG_KERNEL_EVENT_TYPE_RECORDER = 0,
352 LTTNG_KERNEL_EVENT_TYPE_NOTIFIER = 1,
062a5f00 353 LTTNG_KERNEL_EVENT_TYPE_COUNTER = 2
a67ba386
MD
354};
355
356struct lttng_kernel_event_common {
357 struct lttng_kernel_event_common_private *priv; /* Private event interface */
358
359 enum lttng_kernel_event_type type;
360 /* Get child with container_of(). */
361
e64957da 362 int enabled;
a67ba386 363 int eval_filter; /* Need to evaluate filters */
8a445457 364 int (*run_filter)(const struct lttng_kernel_event_common *event,
a67ba386 365 const char *stack_data,
a92e844e 366 struct lttng_kernel_probe_ctx *probe_ctx,
a67ba386 367 void *filter_ctx);
3c997079
MD
368};
369
a67ba386
MD
370struct lttng_kernel_event_recorder_private;
371
372struct lttng_kernel_event_recorder {
373 struct lttng_kernel_event_common parent;
374 struct lttng_kernel_event_recorder_private *priv; /* Private event record interface */
375
f7d06400 376 struct lttng_kernel_channel_buffer *chan;
c3eddb2e
MD
377};
378
d9a337ba
MD
379struct lttng_kernel_event_counter_ctx {
380 int args_available;
381};
382
1a2317f8
MD
383struct lttng_kernel_event_counter_private;
384
385struct lttng_kernel_event_counter {
386 struct lttng_kernel_event_common parent;
387 struct lttng_kernel_event_counter_private *priv; /* Private event counter interface */
388
389 struct lttng_kernel_channel_counter *chan;
d9a337ba
MD
390
391 int use_args; /* Use input arguments. */
1a2317f8
MD
392};
393
a67ba386
MD
394struct lttng_kernel_notification_ctx {
395 int eval_capture; /* Capture evaluation available. */
396};
dffef45d 397
a67ba386 398struct lttng_kernel_event_notifier_private;
8a8ac9a8 399
a67ba386
MD
400struct lttng_kernel_event_notifier {
401 struct lttng_kernel_event_common parent;
402 struct lttng_kernel_event_notifier_private *priv; /* Private event notifier interface */
dffef45d 403
a67ba386
MD
404 int eval_capture; /* Need to evaluate capture */
405 void (*notification_send)(struct lttng_kernel_event_notifier *event_notifier,
a67ba386 406 const char *stack_data,
a92e844e 407 struct lttng_kernel_probe_ctx *probe_ctx,
a67ba386 408 struct lttng_kernel_notification_ctx *notif_ctx);
dffef45d
FD
409};
410
4a399b76
MD
411struct lttng_kernel_channel_buffer_ops {
412 struct lttng_kernel_channel_buffer_ops_private *priv; /* Private channel buffer ops interface. */
413
8a57ec02
MD
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,
f5ffbd77 417 size_t len, size_t alignment);
8a57ec02 418 void (*event_write_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
f5ffbd77 419 const void *src, size_t len, size_t alignment);
8a57ec02 420 void (*event_memset)(struct lttng_kernel_ring_buffer_ctx *ctx,
58aa5d24 421 int c, size_t len);
8a57ec02 422 void (*event_strcpy)(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src,
16f78f3a 423 size_t len);
8a57ec02 424 void (*event_strcpy_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
16f78f3a 425 const char __user *src, size_t len);
0d1080f4
MD
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);
f7d06400
MD
430 void (*lost_event_too_big)(struct lttng_kernel_channel_buffer *lttng_channel);
431};
432
433enum lttng_kernel_channel_type {
434 LTTNG_KERNEL_CHANNEL_TYPE_BUFFER = 0,
76ba9cee 435 LTTNG_KERNEL_CHANNEL_TYPE_COUNTER = 1,
85a9ca7f
MD
436};
437
f7d06400
MD
438struct lttng_kernel_channel_common_private;
439
440/* Use container_of() to get child. */
441struct lttng_kernel_channel_common {
442 struct lttng_kernel_channel_common_private *priv; /* Private channel interface. */
443
444 enum lttng_kernel_channel_type type;
445
e64957da 446 int enabled;
8cdc1a81 447 struct lttng_kernel_session *session;
f7d06400
MD
448};
449
450struct lttng_kernel_channel_buffer_private;
451
452struct lttng_kernel_channel_buffer {
453 struct lttng_kernel_channel_common parent;
454 struct lttng_kernel_channel_buffer_private *priv;
455
4a399b76 456 struct lttng_kernel_channel_buffer_ops *ops;
85a9ca7f
MD
457};
458
143a6f27
MD
459struct lttng_kernel_channel_counter;
460struct lttng_kernel_channel_counter_ops_private;
461
462struct lttng_kernel_channel_counter_ops {
463 struct lttng_kernel_channel_counter_ops_private *priv; /* Private channel counter ops interface */
464
d9a337ba
MD
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);
143a6f27
MD
469};
470
471struct lttng_kernel_channel_counter {
472 struct lttng_kernel_channel_common parent;
473 struct lttng_kernel_channel_counter_private *priv; /* Private channel counter interface */
474
475 struct lttng_kernel_channel_counter_ops *ops;
476};
477
114667d5
MD
478#define LTTNG_DYNAMIC_LEN_STACK_SIZE 128
479
480struct lttng_dynamic_len_stack {
481 size_t stack[LTTNG_DYNAMIC_LEN_STACK_SIZE];
482 size_t offset;
483};
484
485DECLARE_PER_CPU(struct lttng_dynamic_len_stack, lttng_dynamic_len_stack);
e0130fab
MD
486
487/*
8c0393c3 488 * struct lttng_kernel_id_tracker declared in header due to deferencing of *v
e0130fab
MD
489 * in RCU_INITIALIZER(v).
490 */
d1f652f8
MD
491#define LTTNG_ID_HASH_BITS 6
492#define LTTNG_ID_TABLE_SIZE (1 << LTTNG_ID_HASH_BITS)
e0130fab 493
8c0393c3 494struct lttng_kernel_id_tracker_rcu {
d1f652f8
MD
495 struct hlist_head id_hash[LTTNG_ID_TABLE_SIZE];
496};
497
8c0393c3
MD
498struct lttng_kernel_id_tracker {
499 struct lttng_kernel_id_tracker_private *priv; /* Private API */
500
501 struct lttng_kernel_id_tracker_rcu *p; /* RCU dereferenced. */
e0130fab
MD
502};
503
8cdc1a81
MD
504struct lttng_kernel_session_private;
505
506struct lttng_kernel_session {
507 struct lttng_kernel_session_private *priv; /* Private session interface */
508
85a9ca7f 509 int active; /* Is trace session active ? */
8cdc1a81 510
8c0393c3
MD
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;
85a9ca7f
MD
517};
518
d1769981
MD
519int lttng_kernel_probe_register(struct lttng_kernel_probe_desc *desc);
520void lttng_kernel_probe_unregister(struct lttng_kernel_probe_desc *desc);
d83004aa 521
8c0393c3 522bool lttng_id_tracker_lookup(struct lttng_kernel_id_tracker_rcu *p, int id);
271b6681 523
062a5f00
MD
524static inline
525struct lttng_kernel_channel_common *lttng_kernel_get_chan_common_from_event_common(
526 struct lttng_kernel_event_common *event)
527{
528 switch (event->type) {
529 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
530 {
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;
534
535 return &chan_buf->parent;
536 }
537 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
538 {
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;
542
543 return &chan_counter->parent;
544 }
545 default:
546 return NULL;
547 }
548}
549
a90917c3 550#endif /* _LTTNG_EVENTS_H */
This page took 0.101489 seconds and 4 git commands to generate.