Fix: memory leaks on event destroy
[lttng-modules.git] / lttng-events.c
CommitLineData
9f36eaed
MJ
1/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
2 *
a90917c3 3 * lttng-events.c
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
389d7070
MD
10/*
11 * This page_alloc.h wrapper needs to be included before gfpflags.h because it
12 * overrides a function with a define.
13 */
14#include "wrapper/page_alloc.h"
15
4e3c1b9b 16#include <linux/module.h>
c0e31d2e
MD
17#include <linux/mutex.h>
18#include <linux/sched.h>
11b5a3c2 19#include <linux/slab.h>
c099397a 20#include <linux/jiffies.h>
99dc9597 21#include <linux/utsname.h>
abc0446a 22#include <linux/err.h>
7e6f9ef6
MD
23#include <linux/seq_file.h>
24#include <linux/file.h>
25#include <linux/anon_inodes.h>
241ae9a8 26#include <wrapper/file.h>
3c997079 27#include <linux/jhash.h>
8c6e7f13 28#include <linux/uaccess.h>
a606b6e8 29#include <linux/vmalloc.h>
8a107a42 30#include <linux/uuid.h>
3c997079 31
dc61cb20 32#include <wrapper/uuid.h>
da0fcb14 33#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
241ae9a8
MD
34#include <wrapper/random.h>
35#include <wrapper/tracepoint.h>
36#include <wrapper/list.h>
cbc19040 37#include <wrapper/types.h>
241ae9a8
MD
38#include <lttng-kernel-version.h>
39#include <lttng-events.h>
40#include <lttng-tracer.h>
41#include <lttng-abi-old.h>
5214fa50 42#include <lttng-endian.h>
4993071a 43#include <lttng-string-utils.h>
241ae9a8 44#include <wrapper/vzalloc.h>
64af2437
MD
45#include <wrapper/ringbuffer/backend.h>
46#include <wrapper/ringbuffer/frontend.h>
25cc7051 47#include <wrapper/time.h>
4e3c1b9b 48
d83004aa
JD
49#define METADATA_CACHE_DEFAULT_SIZE 4096
50
4e3c1b9b 51static LIST_HEAD(sessions);
a90917c3 52static LIST_HEAD(lttng_transport_list);
d83004aa
JD
53/*
54 * Protect the sessions and metadata caches.
55 */
4e3c1b9b
MD
56static DEFINE_MUTEX(sessions_mutex);
57static struct kmem_cache *event_cache;
58
3c997079
MD
59static void lttng_session_lazy_sync_enablers(struct lttng_session *session);
60static void lttng_session_sync_enablers(struct lttng_session *session);
61static void lttng_enabler_destroy(struct lttng_enabler *enabler);
62
a90917c3
MD
63static void _lttng_event_destroy(struct lttng_event *event);
64static void _lttng_channel_destroy(struct lttng_channel *chan);
65static int _lttng_event_unregister(struct lttng_event *event);
c099397a 66static
a90917c3
MD
67int _lttng_event_metadata_statedump(struct lttng_session *session,
68 struct lttng_channel *chan,
69 struct lttng_event *event);
c099397a 70static
a90917c3 71int _lttng_session_metadata_statedump(struct lttng_session *session);
d83004aa
JD
72static
73void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream);
f513b2bf
MD
74static
75int _lttng_field_statedump(struct lttng_session *session,
76 const struct lttng_event_field *field,
77 size_t nesting);
c099397a 78
c099397a 79void synchronize_trace(void)
abcca994 80{
b78104db 81#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,1,0))
f4a8ec4d
MJ
82 synchronize_rcu();
83#else
abcca994 84 synchronize_sched();
f4a8ec4d
MJ
85#endif
86
b78104db 87#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0))
b8590f40
MD
88#ifdef CONFIG_PREEMPT_RT_FULL
89 synchronize_rcu();
90#endif
b78104db 91#else /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0)) */
abcca994
MD
92#ifdef CONFIG_PREEMPT_RT
93 synchronize_rcu();
94#endif
b78104db 95#endif /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,4,0)) */
abcca994
MD
96}
97
3c997079
MD
98void lttng_lock_sessions(void)
99{
100 mutex_lock(&sessions_mutex);
101}
102
103void lttng_unlock_sessions(void)
104{
105 mutex_unlock(&sessions_mutex);
106}
107
108/*
109 * Called with sessions lock held.
110 */
111int lttng_session_active(void)
112{
113 struct lttng_session *iter;
114
115 list_for_each_entry(iter, &sessions, list) {
116 if (iter->active)
117 return 1;
118 }
119 return 0;
120}
121
a90917c3 122struct lttng_session *lttng_session_create(void)
4e3c1b9b 123{
a90917c3 124 struct lttng_session *session;
d83004aa 125 struct lttng_metadata_cache *metadata_cache;
3c997079 126 int i;
4e3c1b9b
MD
127
128 mutex_lock(&sessions_mutex);
48f5e0b5 129 session = lttng_kvzalloc(sizeof(struct lttng_session), GFP_KERNEL);
4e3c1b9b 130 if (!session)
d83004aa 131 goto err;
4e3c1b9b 132 INIT_LIST_HEAD(&session->chan);
f3d01b96 133 INIT_LIST_HEAD(&session->events);
dc61cb20 134 lttng_guid_gen(&session->uuid);
d83004aa
JD
135
136 metadata_cache = kzalloc(sizeof(struct lttng_metadata_cache),
137 GFP_KERNEL);
138 if (!metadata_cache)
139 goto err_free_session;
f6da044f 140 metadata_cache->data = lttng_vzalloc(METADATA_CACHE_DEFAULT_SIZE);
d83004aa
JD
141 if (!metadata_cache->data)
142 goto err_free_cache;
143 metadata_cache->cache_alloc = METADATA_CACHE_DEFAULT_SIZE;
144 kref_init(&metadata_cache->refcount);
92d9f5e6 145 mutex_init(&metadata_cache->lock);
d83004aa
JD
146 session->metadata_cache = metadata_cache;
147 INIT_LIST_HEAD(&metadata_cache->metadata_stream);
a36580d5
MD
148 memcpy(&metadata_cache->uuid, &session->uuid,
149 sizeof(metadata_cache->uuid));
3c997079
MD
150 INIT_LIST_HEAD(&session->enablers_head);
151 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
152 INIT_HLIST_HEAD(&session->events_ht.table[i]);
4e3c1b9b
MD
153 list_add(&session->list, &sessions);
154 mutex_unlock(&sessions_mutex);
155 return session;
d83004aa
JD
156
157err_free_cache:
158 kfree(metadata_cache);
159err_free_session:
48f5e0b5 160 lttng_kvfree(session);
d83004aa
JD
161err:
162 mutex_unlock(&sessions_mutex);
163 return NULL;
164}
165
166void metadata_cache_destroy(struct kref *kref)
167{
168 struct lttng_metadata_cache *cache =
169 container_of(kref, struct lttng_metadata_cache, refcount);
a606b6e8 170 vfree(cache->data);
d83004aa 171 kfree(cache);
4e3c1b9b
MD
172}
173
a90917c3 174void lttng_session_destroy(struct lttng_session *session)
4e3c1b9b 175{
a90917c3
MD
176 struct lttng_channel *chan, *tmpchan;
177 struct lttng_event *event, *tmpevent;
d83004aa 178 struct lttng_metadata_stream *metadata_stream;
3c997079 179 struct lttng_enabler *enabler, *tmpenabler;
dda6a249 180 int ret;
4e3c1b9b
MD
181
182 mutex_lock(&sessions_mutex);
a8f2d0c7 183 WRITE_ONCE(session->active, 0);
1ec65de1
MD
184 list_for_each_entry(chan, &session->chan, list) {
185 ret = lttng_syscalls_unregister(chan);
186 WARN_ON(ret);
187 }
dda6a249 188 list_for_each_entry(event, &session->events, list) {
a90917c3 189 ret = _lttng_event_unregister(event);
dda6a249
MD
190 WARN_ON(ret);
191 }
abcca994 192 synchronize_trace(); /* Wait for in-flight events to complete */
e298d6af
MD
193 list_for_each_entry(chan, &session->chan, list) {
194 ret = lttng_syscalls_destroy(chan);
195 WARN_ON(ret);
196 }
3c997079
MD
197 list_for_each_entry_safe(enabler, tmpenabler,
198 &session->enablers_head, node)
199 lttng_enabler_destroy(enabler);
4e3c1b9b 200 list_for_each_entry_safe(event, tmpevent, &session->events, list)
a90917c3 201 _lttng_event_destroy(event);
d83004aa
JD
202 list_for_each_entry_safe(chan, tmpchan, &session->chan, list) {
203 BUG_ON(chan->channel_type == METADATA_CHANNEL);
a90917c3 204 _lttng_channel_destroy(chan);
d83004aa 205 }
b8363d6a 206 mutex_lock(&session->metadata_cache->lock);
d83004aa
JD
207 list_for_each_entry(metadata_stream, &session->metadata_cache->metadata_stream, list)
208 _lttng_metadata_channel_hangup(metadata_stream);
b8363d6a 209 mutex_unlock(&session->metadata_cache->lock);
e0130fab
MD
210 if (session->pid_tracker)
211 lttng_pid_tracker_destroy(session->pid_tracker);
d83004aa 212 kref_put(&session->metadata_cache->refcount, metadata_cache_destroy);
4e3c1b9b
MD
213 list_del(&session->list);
214 mutex_unlock(&sessions_mutex);
48f5e0b5 215 lttng_kvfree(session);
4e3c1b9b
MD
216}
217
601252cf
MD
218int lttng_session_statedump(struct lttng_session *session)
219{
220 int ret;
221
222 mutex_lock(&sessions_mutex);
223 ret = lttng_statedump_start(session);
224 mutex_unlock(&sessions_mutex);
225 return ret;
226}
227
a90917c3 228int lttng_session_enable(struct lttng_session *session)
c0e31d2e
MD
229{
230 int ret = 0;
a90917c3 231 struct lttng_channel *chan;
c0e31d2e
MD
232
233 mutex_lock(&sessions_mutex);
234 if (session->active) {
235 ret = -EBUSY;
236 goto end;
237 }
c099397a 238
3c997079
MD
239 /* Set transient enabler state to "enabled" */
240 session->tstate = 1;
241
c099397a
MD
242 /*
243 * Snapshot the number of events per channel to know the type of header
244 * we need to use.
245 */
246 list_for_each_entry(chan, &session->chan, list) {
247 if (chan->header_type)
248 continue; /* don't change it if session stop/restart */
249 if (chan->free_event_id < 31)
250 chan->header_type = 1; /* compact */
251 else
252 chan->header_type = 2; /* large */
253 }
254
3c997079
MD
255 /* We need to sync enablers with session before activation. */
256 lttng_session_sync_enablers(session);
257
64af2437 258 /* Clear each stream's quiescent state. */
09b93db9
MD
259 list_for_each_entry(chan, &session->chan, list) {
260 if (chan->channel_type != METADATA_CHANNEL)
261 lib_ring_buffer_clear_quiescent_channel(chan->chan);
262 }
64af2437 263
a8f2d0c7
MJ
264 WRITE_ONCE(session->active, 1);
265 WRITE_ONCE(session->been_active, 1);
a90917c3 266 ret = _lttng_session_metadata_statedump(session);
c337ddc2 267 if (ret) {
a8f2d0c7 268 WRITE_ONCE(session->active, 0);
c337ddc2
MD
269 goto end;
270 }
271 ret = lttng_statedump_start(session);
360f38ea 272 if (ret)
a8f2d0c7 273 WRITE_ONCE(session->active, 0);
c0e31d2e
MD
274end:
275 mutex_unlock(&sessions_mutex);
11b5a3c2 276 return ret;
c0e31d2e
MD
277}
278
a90917c3 279int lttng_session_disable(struct lttng_session *session)
c0e31d2e
MD
280{
281 int ret = 0;
64af2437 282 struct lttng_channel *chan;
c0e31d2e
MD
283
284 mutex_lock(&sessions_mutex);
285 if (!session->active) {
286 ret = -EBUSY;
287 goto end;
288 }
a8f2d0c7 289 WRITE_ONCE(session->active, 0);
3c997079
MD
290
291 /* Set transient enabler state to "disabled" */
292 session->tstate = 0;
293 lttng_session_sync_enablers(session);
64af2437
MD
294
295 /* Set each stream's quiescent state. */
09b93db9
MD
296 list_for_each_entry(chan, &session->chan, list) {
297 if (chan->channel_type != METADATA_CHANNEL)
298 lib_ring_buffer_set_quiescent_channel(chan->chan);
299 }
c0e31d2e
MD
300end:
301 mutex_unlock(&sessions_mutex);
11b5a3c2 302 return ret;
c0e31d2e
MD
303}
304
9616f0bf
JD
305int lttng_session_metadata_regenerate(struct lttng_session *session)
306{
307 int ret = 0;
308 struct lttng_channel *chan;
309 struct lttng_event *event;
310 struct lttng_metadata_cache *cache = session->metadata_cache;
311 struct lttng_metadata_stream *stream;
312
313 mutex_lock(&sessions_mutex);
314 if (!session->active) {
315 ret = -EBUSY;
316 goto end;
317 }
318
319 mutex_lock(&cache->lock);
320 memset(cache->data, 0, cache->cache_alloc);
321 cache->metadata_written = 0;
322 cache->version++;
323 list_for_each_entry(stream, &session->metadata_cache->metadata_stream, list) {
324 stream->metadata_out = 0;
325 stream->metadata_in = 0;
326 }
327 mutex_unlock(&cache->lock);
328
329 session->metadata_dumped = 0;
330 list_for_each_entry(chan, &session->chan, list) {
331 chan->metadata_dumped = 0;
332 }
333
334 list_for_each_entry(event, &session->events, list) {
335 event->metadata_dumped = 0;
336 }
337
338 ret = _lttng_session_metadata_statedump(session);
339
340end:
341 mutex_unlock(&sessions_mutex);
342 return ret;
343}
344
a90917c3 345int lttng_channel_enable(struct lttng_channel *channel)
e64957da 346{
3c997079 347 int ret = 0;
e64957da 348
3c997079
MD
349 mutex_lock(&sessions_mutex);
350 if (channel->channel_type == METADATA_CHANNEL) {
351 ret = -EPERM;
352 goto end;
353 }
354 if (channel->enabled) {
355 ret = -EEXIST;
356 goto end;
357 }
358 /* Set transient enabler state to "enabled" */
359 channel->tstate = 1;
360 lttng_session_sync_enablers(channel->session);
361 /* Set atomically the state to "enabled" */
a8f2d0c7 362 WRITE_ONCE(channel->enabled, 1);
3c997079
MD
363end:
364 mutex_unlock(&sessions_mutex);
365 return ret;
e64957da
MD
366}
367
a90917c3 368int lttng_channel_disable(struct lttng_channel *channel)
e64957da 369{
3c997079 370 int ret = 0;
e64957da 371
3c997079
MD
372 mutex_lock(&sessions_mutex);
373 if (channel->channel_type == METADATA_CHANNEL) {
374 ret = -EPERM;
375 goto end;
376 }
377 if (!channel->enabled) {
378 ret = -EEXIST;
379 goto end;
380 }
381 /* Set atomically the state to "disabled" */
a8f2d0c7 382 WRITE_ONCE(channel->enabled, 0);
3c997079
MD
383 /* Set transient enabler state to "enabled" */
384 channel->tstate = 0;
385 lttng_session_sync_enablers(channel->session);
386end:
387 mutex_unlock(&sessions_mutex);
388 return ret;
e64957da
MD
389}
390
a90917c3 391int lttng_event_enable(struct lttng_event *event)
e64957da 392{
3c997079 393 int ret = 0;
e64957da 394
3c997079
MD
395 mutex_lock(&sessions_mutex);
396 if (event->chan->channel_type == METADATA_CHANNEL) {
397 ret = -EPERM;
398 goto end;
399 }
400 if (event->enabled) {
401 ret = -EEXIST;
402 goto end;
403 }
a0493bef
MD
404 switch (event->instrumentation) {
405 case LTTNG_KERNEL_TRACEPOINT:
406 case LTTNG_KERNEL_SYSCALL:
407 ret = -EINVAL;
408 break;
409 case LTTNG_KERNEL_KPROBE:
149b9a9d 410 case LTTNG_KERNEL_UPROBE:
a0493bef 411 case LTTNG_KERNEL_NOOP:
a8f2d0c7 412 WRITE_ONCE(event->enabled, 1);
a0493bef
MD
413 break;
414 case LTTNG_KERNEL_KRETPROBE:
415 ret = lttng_kretprobes_event_enable_state(event, 1);
416 break;
853aee81 417 case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
a0493bef
MD
418 default:
419 WARN_ON_ONCE(1);
420 ret = -EINVAL;
421 }
3c997079
MD
422end:
423 mutex_unlock(&sessions_mutex);
424 return ret;
e64957da
MD
425}
426
a90917c3 427int lttng_event_disable(struct lttng_event *event)
e64957da 428{
3c997079 429 int ret = 0;
e64957da 430
3c997079
MD
431 mutex_lock(&sessions_mutex);
432 if (event->chan->channel_type == METADATA_CHANNEL) {
433 ret = -EPERM;
434 goto end;
435 }
436 if (!event->enabled) {
437 ret = -EEXIST;
438 goto end;
439 }
a0493bef
MD
440 switch (event->instrumentation) {
441 case LTTNG_KERNEL_TRACEPOINT:
442 case LTTNG_KERNEL_SYSCALL:
443 ret = -EINVAL;
444 break;
445 case LTTNG_KERNEL_KPROBE:
149b9a9d 446 case LTTNG_KERNEL_UPROBE:
a0493bef 447 case LTTNG_KERNEL_NOOP:
a8f2d0c7 448 WRITE_ONCE(event->enabled, 0);
a0493bef
MD
449 break;
450 case LTTNG_KERNEL_KRETPROBE:
451 ret = lttng_kretprobes_event_enable_state(event, 0);
452 break;
853aee81 453 case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
a0493bef
MD
454 default:
455 WARN_ON_ONCE(1);
456 ret = -EINVAL;
457 }
3c997079
MD
458end:
459 mutex_unlock(&sessions_mutex);
460 return ret;
e64957da
MD
461}
462
a90917c3 463static struct lttng_transport *lttng_transport_find(const char *name)
f3d01b96 464{
a90917c3 465 struct lttng_transport *transport;
f3d01b96 466
a90917c3 467 list_for_each_entry(transport, &lttng_transport_list, node) {
f3d01b96
MD
468 if (!strcmp(transport->name, name))
469 return transport;
470 }
471 return NULL;
472}
473
a90917c3 474struct lttng_channel *lttng_channel_create(struct lttng_session *session,
5dbbdb43
MD
475 const char *transport_name,
476 void *buf_addr,
4e3c1b9b
MD
477 size_t subbuf_size, size_t num_subbuf,
478 unsigned int switch_timer_interval,
d83004aa
JD
479 unsigned int read_timer_interval,
480 enum channel_type channel_type)
4e3c1b9b 481{
a90917c3
MD
482 struct lttng_channel *chan;
483 struct lttng_transport *transport = NULL;
4e3c1b9b
MD
484
485 mutex_lock(&sessions_mutex);
d83004aa 486 if (session->been_active && channel_type != METADATA_CHANNEL)
e5382b6d 487 goto active; /* Refuse to add channel to active session */
a90917c3 488 transport = lttng_transport_find(transport_name);
f3d01b96
MD
489 if (!transport) {
490 printk(KERN_WARNING "LTTng transport %s not found\n",
491 transport_name);
c0e31d2e 492 goto notransport;
f3d01b96 493 }
a33c9927
MD
494 if (!try_module_get(transport->owner)) {
495 printk(KERN_WARNING "LTT : Can't lock transport module.\n");
496 goto notransport;
497 }
a90917c3 498 chan = kzalloc(sizeof(struct lttng_channel), GFP_KERNEL);
4e3c1b9b 499 if (!chan)
c0e31d2e 500 goto nomem;
4e3c1b9b 501 chan->session = session;
05d32c64 502 chan->id = session->free_chan_id++;
3b731ab1 503 chan->ops = &transport->ops;
125b4df4
MD
504 /*
505 * Note: the channel creation op already writes into the packet
506 * headers. Therefore the "chan" information used as input
507 * should be already accessible.
508 */
5f5ddf01
MD
509 chan->chan = transport->ops.channel_create(transport_name,
510 chan, buf_addr, subbuf_size, num_subbuf,
511 switch_timer_interval, read_timer_interval);
f3d01b96
MD
512 if (!chan->chan)
513 goto create_error;
3c997079 514 chan->tstate = 1;
e64957da 515 chan->enabled = 1;
a33c9927 516 chan->transport = transport;
d83004aa 517 chan->channel_type = channel_type;
4e3c1b9b
MD
518 list_add(&chan->list, &session->chan);
519 mutex_unlock(&sessions_mutex);
520 return chan;
521
f3d01b96
MD
522create_error:
523 kfree(chan);
c0e31d2e 524nomem:
a33c9927
MD
525 if (transport)
526 module_put(transport->owner);
c0e31d2e 527notransport:
e5382b6d 528active:
4e3c1b9b
MD
529 mutex_unlock(&sessions_mutex);
530 return NULL;
531}
532
533/*
d83004aa
JD
534 * Only used internally at session destruction for per-cpu channels, and
535 * when metadata channel is released.
536 * Needs to be called with sessions mutex held.
4e3c1b9b 537 */
aa7c23a9 538static
a90917c3 539void _lttng_channel_destroy(struct lttng_channel *chan)
4e3c1b9b 540{
11b5a3c2 541 chan->ops->channel_destroy(chan->chan);
a33c9927 542 module_put(chan->transport->owner);
4e3c1b9b 543 list_del(&chan->list);
8070f5c0 544 lttng_destroy_context(chan->ctx);
4e3c1b9b
MD
545 kfree(chan);
546}
547
d83004aa
JD
548void lttng_metadata_channel_destroy(struct lttng_channel *chan)
549{
550 BUG_ON(chan->channel_type != METADATA_CHANNEL);
551
552 /* Protect the metadata cache with the sessions_mutex. */
553 mutex_lock(&sessions_mutex);
554 _lttng_channel_destroy(chan);
555 mutex_unlock(&sessions_mutex);
556}
557EXPORT_SYMBOL_GPL(lttng_metadata_channel_destroy);
558
559static
560void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream)
561{
562 stream->finalized = 1;
563 wake_up_interruptible(&stream->read_wait);
564}
565
e5382b6d
MD
566/*
567 * Supports event creation while tracing session is active.
3c997079 568 * Needs to be called with sessions mutex held.
e5382b6d 569 */
3c997079
MD
570struct lttng_event *_lttng_event_create(struct lttng_channel *chan,
571 struct lttng_kernel_event *event_param,
572 void *filter,
573 const struct lttng_event_desc *event_desc,
574 enum lttng_kernel_instrumentation itype)
4e3c1b9b 575{
3c997079 576 struct lttng_session *session = chan->session;
a90917c3 577 struct lttng_event *event;
3c997079
MD
578 const char *event_name;
579 struct hlist_head *head;
580 size_t name_len;
581 uint32_t hash;
3d084699 582 int ret;
4e3c1b9b 583
abc0446a 584 if (chan->free_event_id == -1U) {
4cf0bf51 585 ret = -EMFILE;
e5382b6d 586 goto full;
abc0446a 587 }
3c997079
MD
588
589 switch (itype) {
590 case LTTNG_KERNEL_TRACEPOINT:
591 event_name = event_desc->name;
592 break;
593 case LTTNG_KERNEL_KPROBE:
149b9a9d 594 case LTTNG_KERNEL_UPROBE:
3c997079 595 case LTTNG_KERNEL_KRETPROBE:
3c997079 596 case LTTNG_KERNEL_NOOP:
33a39a3c 597 case LTTNG_KERNEL_SYSCALL:
3c997079
MD
598 event_name = event_param->name;
599 break;
853aee81 600 case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
3c997079
MD
601 default:
602 WARN_ON_ONCE(1);
603 ret = -EINVAL;
604 goto type_error;
605 }
606 name_len = strlen(event_name);
607 hash = jhash(event_name, name_len, 0);
608 head = &session->events_ht.table[hash & (LTTNG_EVENT_HT_SIZE - 1)];
d216ecae 609 lttng_hlist_for_each_entry(event, head, hlist) {
3c997079
MD
610 WARN_ON_ONCE(!event->desc);
611 if (!strncmp(event->desc->name, event_name,
612 LTTNG_KERNEL_SYM_NAME_LEN - 1)
613 && chan == event->chan) {
614 ret = -EEXIST;
615 goto exist;
abc0446a
MD
616 }
617 }
3c997079 618
11b5a3c2 619 event = kmem_cache_zalloc(event_cache, GFP_KERNEL);
abc0446a 620 if (!event) {
4cf0bf51 621 ret = -ENOMEM;
4e3c1b9b 622 goto cache_error;
abc0446a 623 }
4e3c1b9b
MD
624 event->chan = chan;
625 event->filter = filter;
e5382b6d 626 event->id = chan->free_event_id++;
3c997079
MD
627 event->instrumentation = itype;
628 event->evtype = LTTNG_TYPE_EVENT;
07dfc1d0 629 INIT_LIST_HEAD(&event->bytecode_runtime_head);
3c997079
MD
630 INIT_LIST_HEAD(&event->enablers_ref_head);
631
632 switch (itype) {
ab2277d6 633 case LTTNG_KERNEL_TRACEPOINT:
3c997079
MD
634 /* Event will be enabled by enabler sync. */
635 event->enabled = 0;
636 event->registered = 0;
637 event->desc = lttng_event_get(event_name);
abc0446a 638 if (!event->desc) {
4cf0bf51 639 ret = -ENOENT;
d3dbe23c 640 goto register_error;
abc0446a 641 }
3c997079
MD
642 /* Populate lttng_event structure before event registration. */
643 smp_wmb();
baf20995 644 break;
ab2277d6 645 case LTTNG_KERNEL_KPROBE:
a0493bef
MD
646 /*
647 * Needs to be explicitly enabled after creation, since
648 * we may want to apply filters.
649 */
650 event->enabled = 0;
3c997079
MD
651 event->registered = 1;
652 /*
653 * Populate lttng_event structure before event
654 * registration.
655 */
656 smp_wmb();
657 ret = lttng_kprobes_register(event_name,
f17701fb
MD
658 event_param->u.kprobe.symbol_name,
659 event_param->u.kprobe.offset,
660 event_param->u.kprobe.addr,
661 event);
abc0446a 662 if (ret) {
4cf0bf51 663 ret = -EINVAL;
d6d808f3 664 goto register_error;
abc0446a 665 }
edeb3137
MD
666 ret = try_module_get(event->desc->owner);
667 WARN_ON_ONCE(!ret);
d6d808f3 668 break;
7371f44c
MD
669 case LTTNG_KERNEL_KRETPROBE:
670 {
a90917c3 671 struct lttng_event *event_return;
7371f44c
MD
672
673 /* kretprobe defines 2 events */
a0493bef
MD
674 /*
675 * Needs to be explicitly enabled after creation, since
676 * we may want to apply filters.
677 */
678 event->enabled = 0;
3c997079 679 event->registered = 1;
7371f44c
MD
680 event_return =
681 kmem_cache_zalloc(event_cache, GFP_KERNEL);
abc0446a 682 if (!event_return) {
4cf0bf51 683 ret = -ENOMEM;
7371f44c 684 goto register_error;
abc0446a 685 }
7371f44c
MD
686 event_return->chan = chan;
687 event_return->filter = filter;
688 event_return->id = chan->free_event_id++;
a0493bef 689 event_return->enabled = 0;
3c997079
MD
690 event_return->registered = 1;
691 event_return->instrumentation = itype;
7371f44c 692 /*
a90917c3 693 * Populate lttng_event structure before kretprobe registration.
7371f44c
MD
694 */
695 smp_wmb();
3c997079 696 ret = lttng_kretprobes_register(event_name,
7371f44c
MD
697 event_param->u.kretprobe.symbol_name,
698 event_param->u.kretprobe.offset,
699 event_param->u.kretprobe.addr,
700 event, event_return);
701 if (ret) {
702 kmem_cache_free(event_cache, event_return);
4cf0bf51 703 ret = -EINVAL;
7371f44c
MD
704 goto register_error;
705 }
706 /* Take 2 refs on the module: one per event. */
707 ret = try_module_get(event->desc->owner);
708 WARN_ON_ONCE(!ret);
709 ret = try_module_get(event->desc->owner);
710 WARN_ON_ONCE(!ret);
a90917c3 711 ret = _lttng_event_metadata_statedump(chan->session, chan,
7371f44c 712 event_return);
abc0446a 713 WARN_ON_ONCE(ret > 0);
7371f44c
MD
714 if (ret) {
715 kmem_cache_free(event_cache, event_return);
716 module_put(event->desc->owner);
717 module_put(event->desc->owner);
718 goto statedump_error;
719 }
720 list_add(&event_return->list, &chan->session->events);
721 break;
722 }
1ec65de1 723 case LTTNG_KERNEL_NOOP:
33a39a3c 724 case LTTNG_KERNEL_SYSCALL:
a0493bef
MD
725 /*
726 * Needs to be explicitly enabled after creation, since
727 * we may want to apply filters.
728 */
729 event->enabled = 0;
3c997079
MD
730 event->registered = 0;
731 event->desc = event_desc;
e298d6af
MD
732 switch (event_param->u.syscall.entryexit) {
733 case LTTNG_KERNEL_SYSCALL_ENTRYEXIT:
734 ret = -EINVAL;
735 goto register_error;
736 case LTTNG_KERNEL_SYSCALL_ENTRY:
737 event->u.syscall.entryexit = LTTNG_SYSCALL_ENTRY;
738 break;
739 case LTTNG_KERNEL_SYSCALL_EXIT:
740 event->u.syscall.entryexit = LTTNG_SYSCALL_EXIT;
741 break;
742 }
743 switch (event_param->u.syscall.abi) {
744 case LTTNG_KERNEL_SYSCALL_ABI_ALL:
745 ret = -EINVAL;
746 goto register_error;
747 case LTTNG_KERNEL_SYSCALL_ABI_NATIVE:
748 event->u.syscall.abi = LTTNG_SYSCALL_ABI_NATIVE;
749 break;
750 case LTTNG_KERNEL_SYSCALL_ABI_COMPAT:
751 event->u.syscall.abi = LTTNG_SYSCALL_ABI_COMPAT;
752 break;
753 }
abc0446a 754 if (!event->desc) {
4cf0bf51 755 ret = -EINVAL;
259b6cb3 756 goto register_error;
abc0446a 757 }
1ec65de1 758 break;
149b9a9d 759 case LTTNG_KERNEL_UPROBE:
a344f64b
FD
760 /*
761 * Needs to be explicitly enabled after creation, since
762 * we may want to apply filters.
763 */
764 event->enabled = 0;
765 event->registered = 1;
3aed4dca 766
a344f64b
FD
767 /*
768 * Populate lttng_event structure before event
769 * registration.
770 */
771 smp_wmb();
149b9a9d
YB
772
773 ret = lttng_uprobes_register(event_param->name,
56377c91 774 event_param->u.uprobe.fd,
149b9a9d
YB
775 event);
776 if (ret)
777 goto register_error;
778 ret = try_module_get(event->desc->owner);
779 WARN_ON_ONCE(!ret);
780 break;
853aee81 781 case LTTNG_KERNEL_FUNCTION: /* Fall-through */
baf20995
MD
782 default:
783 WARN_ON_ONCE(1);
4cf0bf51 784 ret = -EINVAL;
df07930b 785 goto register_error;
baf20995 786 }
a90917c3 787 ret = _lttng_event_metadata_statedump(chan->session, chan, event);
abc0446a
MD
788 WARN_ON_ONCE(ret > 0);
789 if (ret) {
c099397a 790 goto statedump_error;
abc0446a 791 }
3c997079 792 hlist_add_head(&event->hlist, head);
dda6a249 793 list_add(&event->list, &chan->session->events);
4e3c1b9b
MD
794 return event;
795
c099397a 796statedump_error:
259b6cb3 797 /* If a statedump error occurs, events will not be readable. */
11b5a3c2 798register_error:
11b5a3c2 799 kmem_cache_free(event_cache, event);
4e3c1b9b
MD
800cache_error:
801exist:
3c997079 802type_error:
e5382b6d 803full:
4cf0bf51 804 return ERR_PTR(ret);
4e3c1b9b
MD
805}
806
3c997079
MD
807struct lttng_event *lttng_event_create(struct lttng_channel *chan,
808 struct lttng_kernel_event *event_param,
809 void *filter,
810 const struct lttng_event_desc *event_desc,
811 enum lttng_kernel_instrumentation itype)
812{
813 struct lttng_event *event;
814
815 mutex_lock(&sessions_mutex);
816 event = _lttng_event_create(chan, event_param, filter, event_desc,
817 itype);
818 mutex_unlock(&sessions_mutex);
819 return event;
820}
821
822/* Only used for tracepoints for now. */
823static
824void register_event(struct lttng_event *event)
825{
826 const struct lttng_event_desc *desc;
f127e61e 827 int ret = -EINVAL;
3c997079 828
3c997079
MD
829 if (event->registered)
830 return;
4ecb5ad5 831
3c997079 832 desc = event->desc;
4ecb5ad5
MD
833 switch (event->instrumentation) {
834 case LTTNG_KERNEL_TRACEPOINT:
835 ret = lttng_wrapper_tracepoint_probe_register(desc->kname,
836 desc->probe_callback,
837 event);
838 break;
839 case LTTNG_KERNEL_SYSCALL:
e298d6af 840 ret = lttng_syscall_filter_enable(event->chan, event);
4ecb5ad5
MD
841 break;
842 case LTTNG_KERNEL_KPROBE:
a344f64b 843 case LTTNG_KERNEL_UPROBE:
4ecb5ad5 844 case LTTNG_KERNEL_KRETPROBE:
4ecb5ad5
MD
845 case LTTNG_KERNEL_NOOP:
846 ret = 0;
847 break;
853aee81 848 case LTTNG_KERNEL_FUNCTION: /* Fall-through */
4ecb5ad5
MD
849 default:
850 WARN_ON_ONCE(1);
851 }
3c997079
MD
852 if (!ret)
853 event->registered = 1;
854}
855
4e3c1b9b
MD
856/*
857 * Only used internally at session destruction.
858 */
a90917c3 859int _lttng_event_unregister(struct lttng_event *event)
4e3c1b9b 860{
4ecb5ad5 861 const struct lttng_event_desc *desc;
11b5a3c2
MD
862 int ret = -EINVAL;
863
3c997079
MD
864 if (!event->registered)
865 return 0;
866
4ecb5ad5 867 desc = event->desc;
38d024ae 868 switch (event->instrumentation) {
ab2277d6 869 case LTTNG_KERNEL_TRACEPOINT:
20591cf7 870 ret = lttng_wrapper_tracepoint_probe_unregister(event->desc->kname,
85a9ca7f 871 event->desc->probe_callback,
11b5a3c2 872 event);
baf20995 873 break;
ab2277d6 874 case LTTNG_KERNEL_KPROBE:
f17701fb 875 lttng_kprobes_unregister(event);
d6d808f3
MD
876 ret = 0;
877 break;
7371f44c
MD
878 case LTTNG_KERNEL_KRETPROBE:
879 lttng_kretprobes_unregister(event);
880 ret = 0;
881 break;
33a39a3c 882 case LTTNG_KERNEL_SYSCALL:
e298d6af 883 ret = lttng_syscall_filter_disable(event->chan, event);
4ecb5ad5
MD
884 break;
885 case LTTNG_KERNEL_NOOP:
259b6cb3
MD
886 ret = 0;
887 break;
149b9a9d
YB
888 case LTTNG_KERNEL_UPROBE:
889 lttng_uprobes_unregister(event);
890 ret = 0;
891 break;
853aee81 892 case LTTNG_KERNEL_FUNCTION: /* Fall-through */
baf20995
MD
893 default:
894 WARN_ON_ONCE(1);
895 }
3c997079
MD
896 if (!ret)
897 event->registered = 0;
dda6a249
MD
898 return ret;
899}
900
901/*
902 * Only used internally at session destruction.
903 */
be066e6c 904static
a90917c3 905void _lttng_event_destroy(struct lttng_event *event)
dda6a249 906{
509680fb
MD
907 struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref;
908
edeb3137
MD
909 switch (event->instrumentation) {
910 case LTTNG_KERNEL_TRACEPOINT:
a90917c3 911 lttng_event_put(event->desc);
edeb3137
MD
912 break;
913 case LTTNG_KERNEL_KPROBE:
914 module_put(event->desc->owner);
915 lttng_kprobes_destroy_private(event);
916 break;
7371f44c
MD
917 case LTTNG_KERNEL_KRETPROBE:
918 module_put(event->desc->owner);
919 lttng_kretprobes_destroy_private(event);
920 break;
259b6cb3 921 case LTTNG_KERNEL_NOOP:
33a39a3c 922 case LTTNG_KERNEL_SYSCALL:
259b6cb3 923 break;
149b9a9d
YB
924 case LTTNG_KERNEL_UPROBE:
925 module_put(event->desc->owner);
926 lttng_uprobes_destroy_private(event);
927 break;
853aee81 928 case LTTNG_KERNEL_FUNCTION: /* Fall-through */
edeb3137
MD
929 default:
930 WARN_ON_ONCE(1);
931 }
dda6a249 932 list_del(&event->list);
8070f5c0 933 lttng_destroy_context(event->ctx);
509680fb
MD
934 lttng_free_event_filter_runtime(event);
935 /* Free event enabler refs */
936 list_for_each_entry_safe(enabler_ref, tmp_enabler_ref,
937 &event->enablers_ref_head, node)
938 kfree(enabler_ref);
11b5a3c2 939 kmem_cache_free(event_cache, event);
4e3c1b9b
MD
940}
941
e0130fab
MD
942int lttng_session_track_pid(struct lttng_session *session, int pid)
943{
944 int ret;
945
946 if (pid < -1)
947 return -EINVAL;
948 mutex_lock(&sessions_mutex);
949 if (pid == -1) {
950 /* track all pids: destroy tracker. */
951 if (session->pid_tracker) {
952 struct lttng_pid_tracker *lpf;
953
954 lpf = session->pid_tracker;
955 rcu_assign_pointer(session->pid_tracker, NULL);
956 synchronize_trace();
957 lttng_pid_tracker_destroy(lpf);
958 }
959 ret = 0;
960 } else {
961 if (!session->pid_tracker) {
962 struct lttng_pid_tracker *lpf;
963
964 lpf = lttng_pid_tracker_create();
965 if (!lpf) {
966 ret = -ENOMEM;
967 goto unlock;
968 }
969 ret = lttng_pid_tracker_add(lpf, pid);
970 rcu_assign_pointer(session->pid_tracker, lpf);
971 } else {
972 ret = lttng_pid_tracker_add(session->pid_tracker, pid);
973 }
974 }
975unlock:
976 mutex_unlock(&sessions_mutex);
977 return ret;
978}
979
980int lttng_session_untrack_pid(struct lttng_session *session, int pid)
981{
982 int ret;
983
984 if (pid < -1)
985 return -EINVAL;
986 mutex_lock(&sessions_mutex);
987 if (pid == -1) {
988 /* untrack all pids: replace by empty tracker. */
989 struct lttng_pid_tracker *old_lpf = session->pid_tracker;
990 struct lttng_pid_tracker *lpf;
991
992 lpf = lttng_pid_tracker_create();
993 if (!lpf) {
994 ret = -ENOMEM;
995 goto unlock;
996 }
997 rcu_assign_pointer(session->pid_tracker, lpf);
998 synchronize_trace();
999 if (old_lpf)
1000 lttng_pid_tracker_destroy(old_lpf);
1001 ret = 0;
1002 } else {
1003 if (!session->pid_tracker) {
1004 ret = -ENOENT;
1005 goto unlock;
1006 }
1007 ret = lttng_pid_tracker_del(session->pid_tracker, pid);
1008 }
1009unlock:
1010 mutex_unlock(&sessions_mutex);
1011 return ret;
1012}
1013
7e6f9ef6
MD
1014static
1015void *pid_list_start(struct seq_file *m, loff_t *pos)
1016{
1017 struct lttng_session *session = m->private;
1018 struct lttng_pid_tracker *lpf;
1019 struct lttng_pid_hash_node *e;
1020 int iter = 0, i;
1021
1022 mutex_lock(&sessions_mutex);
1023 lpf = session->pid_tracker;
1024 if (lpf) {
1025 for (i = 0; i < LTTNG_PID_TABLE_SIZE; i++) {
1026 struct hlist_head *head = &lpf->pid_hash[i];
1027
f934e302 1028 lttng_hlist_for_each_entry(e, head, hlist) {
7e6f9ef6
MD
1029 if (iter++ >= *pos)
1030 return e;
1031 }
1032 }
1033 } else {
1034 /* PID tracker disabled. */
1035 if (iter >= *pos && iter == 0) {
1036 return session; /* empty tracker */
1037 }
1038 iter++;
1039 }
1040 /* End of list */
1041 return NULL;
1042}
1043
1044/* Called with sessions_mutex held. */
1045static
1046void *pid_list_next(struct seq_file *m, void *p, loff_t *ppos)
1047{
1048 struct lttng_session *session = m->private;
1049 struct lttng_pid_tracker *lpf;
1050 struct lttng_pid_hash_node *e;
1051 int iter = 0, i;
1052
1053 (*ppos)++;
1054 lpf = session->pid_tracker;
1055 if (lpf) {
1056 for (i = 0; i < LTTNG_PID_TABLE_SIZE; i++) {
1057 struct hlist_head *head = &lpf->pid_hash[i];
1058
f934e302 1059 lttng_hlist_for_each_entry(e, head, hlist) {
7e6f9ef6
MD
1060 if (iter++ >= *ppos)
1061 return e;
1062 }
1063 }
1064 } else {
1065 /* PID tracker disabled. */
1066 if (iter >= *ppos && iter == 0)
1067 return session; /* empty tracker */
1068 iter++;
1069 }
1070
1071 /* End of list */
1072 return NULL;
1073}
1074
1075static
1076void pid_list_stop(struct seq_file *m, void *p)
1077{
1078 mutex_unlock(&sessions_mutex);
1079}
1080
1081static
1082int pid_list_show(struct seq_file *m, void *p)
1083{
1084 int pid;
1085
1086 if (p == m->private) {
1087 /* Tracker disabled. */
1088 pid = -1;
1089 } else {
1090 const struct lttng_pid_hash_node *e = p;
1091
1092 pid = lttng_pid_tracker_get_node_pid(e);
1093 }
1094 seq_printf(m, "process { pid = %d; };\n", pid);
1095 return 0;
1096}
1097
1098static
1099const struct seq_operations lttng_tracker_pids_list_seq_ops = {
1100 .start = pid_list_start,
1101 .next = pid_list_next,
1102 .stop = pid_list_stop,
1103 .show = pid_list_show,
1104};
1105
1106static
1107int lttng_tracker_pids_list_open(struct inode *inode, struct file *file)
1108{
1109 return seq_open(file, &lttng_tracker_pids_list_seq_ops);
1110}
1111
1112static
1113int lttng_tracker_pids_list_release(struct inode *inode, struct file *file)
1114{
1115 struct seq_file *m = file->private_data;
1116 struct lttng_session *session = m->private;
1117 int ret;
1118
1119 WARN_ON_ONCE(!session);
1120 ret = seq_release(inode, file);
1121 if (!ret && session)
1122 fput(session->file);
1123 return ret;
1124}
1125
1126const struct file_operations lttng_tracker_pids_list_fops = {
1127 .owner = THIS_MODULE,
1128 .open = lttng_tracker_pids_list_open,
1129 .read = seq_read,
1130 .llseek = seq_lseek,
1131 .release = lttng_tracker_pids_list_release,
1132};
1133
1134int lttng_session_list_tracker_pids(struct lttng_session *session)
1135{
1136 struct file *tracker_pids_list_file;
1137 struct seq_file *m;
1138 int file_fd, ret;
1139
1140 file_fd = lttng_get_unused_fd();
1141 if (file_fd < 0) {
1142 ret = file_fd;
1143 goto fd_error;
1144 }
1145
1146 tracker_pids_list_file = anon_inode_getfile("[lttng_tracker_pids_list]",
1147 &lttng_tracker_pids_list_fops,
1148 NULL, O_RDWR);
1149 if (IS_ERR(tracker_pids_list_file)) {
1150 ret = PTR_ERR(tracker_pids_list_file);
1151 goto file_error;
1152 }
5ad19305
MJ
1153 if (!atomic_long_add_unless(&session->file->f_count, 1, LONG_MAX)) {
1154 ret = -EOVERFLOW;
9c1f4643
MD
1155 goto refcount_error;
1156 }
7e6f9ef6
MD
1157 ret = lttng_tracker_pids_list_fops.open(NULL, tracker_pids_list_file);
1158 if (ret < 0)
1159 goto open_error;
1160 m = tracker_pids_list_file->private_data;
1161 m->private = session;
1162 fd_install(file_fd, tracker_pids_list_file);
7e6f9ef6
MD
1163
1164 return file_fd;
1165
1166open_error:
9c1f4643
MD
1167 atomic_long_dec(&session->file->f_count);
1168refcount_error:
7e6f9ef6
MD
1169 fput(tracker_pids_list_file);
1170file_error:
1171 put_unused_fd(file_fd);
1172fd_error:
1173 return ret;
1174}
1175
3c997079
MD
1176/*
1177 * Enabler management.
1178 */
1179static
4993071a
PP
1180int lttng_match_enabler_star_glob(const char *desc_name,
1181 const char *pattern)
3c997079 1182{
cbc19040
MD
1183 if (!strutils_star_glob_match(pattern, LTTNG_SIZE_MAX,
1184 desc_name, LTTNG_SIZE_MAX))
3c997079
MD
1185 return 0;
1186 return 1;
1187}
1188
1189static
4ecb5ad5
MD
1190int lttng_match_enabler_name(const char *desc_name,
1191 const char *name)
3c997079 1192{
4ecb5ad5 1193 if (strcmp(desc_name, name))
3c997079
MD
1194 return 0;
1195 return 1;
1196}
1197
1198static
1199int lttng_desc_match_enabler(const struct lttng_event_desc *desc,
1200 struct lttng_enabler *enabler)
1201{
4ecb5ad5 1202 const char *desc_name, *enabler_name;
e298d6af 1203 bool compat = false, entry = false;
4ecb5ad5
MD
1204
1205 enabler_name = enabler->event_param.name;
1206 switch (enabler->event_param.instrumentation) {
1207 case LTTNG_KERNEL_TRACEPOINT:
1208 desc_name = desc->name;
e298d6af
MD
1209 switch (enabler->type) {
1210 case LTTNG_ENABLER_STAR_GLOB:
1211 return lttng_match_enabler_star_glob(desc_name, enabler_name);
1212 case LTTNG_ENABLER_NAME:
1213 return lttng_match_enabler_name(desc_name, enabler_name);
1214 default:
1215 return -EINVAL;
1216 }
4ecb5ad5
MD
1217 break;
1218 case LTTNG_KERNEL_SYSCALL:
1219 desc_name = desc->name;
e298d6af 1220 if (!strncmp(desc_name, "compat_", strlen("compat_"))) {
4ecb5ad5 1221 desc_name += strlen("compat_");
e298d6af
MD
1222 compat = true;
1223 }
4ecb5ad5
MD
1224 if (!strncmp(desc_name, "syscall_exit_",
1225 strlen("syscall_exit_"))) {
1226 desc_name += strlen("syscall_exit_");
1227 } else if (!strncmp(desc_name, "syscall_entry_",
1228 strlen("syscall_entry_"))) {
1229 desc_name += strlen("syscall_entry_");
e298d6af 1230 entry = true;
4ecb5ad5
MD
1231 } else {
1232 WARN_ON_ONCE(1);
1233 return -EINVAL;
1234 }
e298d6af
MD
1235 switch (enabler->event_param.u.syscall.entryexit) {
1236 case LTTNG_KERNEL_SYSCALL_ENTRYEXIT:
1237 break;
1238 case LTTNG_KERNEL_SYSCALL_ENTRY:
1239 if (!entry)
1240 return 0;
1241 break;
1242 case LTTNG_KERNEL_SYSCALL_EXIT:
1243 if (entry)
1244 return 0;
1245 break;
1246 default:
1247 return -EINVAL;
1248 }
1249 switch (enabler->event_param.u.syscall.abi) {
1250 case LTTNG_KERNEL_SYSCALL_ABI_ALL:
1251 break;
1252 case LTTNG_KERNEL_SYSCALL_ABI_NATIVE:
1253 if (compat)
1254 return 0;
1255 break;
1256 case LTTNG_KERNEL_SYSCALL_ABI_COMPAT:
1257 if (!compat)
1258 return 0;
1259 break;
1260 default:
1261 return -EINVAL;
1262 }
1263 switch (enabler->event_param.u.syscall.match) {
1264 case LTTNG_SYSCALL_MATCH_NAME:
1265 switch (enabler->type) {
1266 case LTTNG_ENABLER_STAR_GLOB:
1267 return lttng_match_enabler_star_glob(desc_name, enabler_name);
1268 case LTTNG_ENABLER_NAME:
1269 return lttng_match_enabler_name(desc_name, enabler_name);
1270 default:
1271 return -EINVAL;
1272 }
1273 break;
1274 case LTTNG_SYSCALL_MATCH_NR:
1275 return -EINVAL; /* Not implemented. */
1276 default:
1277 return -EINVAL;
1278 }
4ecb5ad5
MD
1279 break;
1280 default:
1281 WARN_ON_ONCE(1);
1282 return -EINVAL;
1283 }
3c997079
MD
1284}
1285
1286static
1287int lttng_event_match_enabler(struct lttng_event *event,
1288 struct lttng_enabler *enabler)
1289{
33a39a3c
MD
1290 if (enabler->event_param.instrumentation != event->instrumentation)
1291 return 0;
3c997079
MD
1292 if (lttng_desc_match_enabler(event->desc, enabler)
1293 && event->chan == enabler->chan)
1294 return 1;
1295 else
1296 return 0;
1297}
1298
1299static
1300struct lttng_enabler_ref *lttng_event_enabler_ref(struct lttng_event *event,
1301 struct lttng_enabler *enabler)
1302{
1303 struct lttng_enabler_ref *enabler_ref;
1304
1305 list_for_each_entry(enabler_ref,
1306 &event->enablers_ref_head, node) {
1307 if (enabler_ref->ref == enabler)
1308 return enabler_ref;
1309 }
1310 return NULL;
1311}
1312
3c997079 1313static
33a39a3c 1314void lttng_create_tracepoint_if_missing(struct lttng_enabler *enabler)
3c997079
MD
1315{
1316 struct lttng_session *session = enabler->chan->session;
1317 struct lttng_probe_desc *probe_desc;
1318 const struct lttng_event_desc *desc;
1319 int i;
1320 struct list_head *probe_list;
1321
1322 probe_list = lttng_get_probe_list_head();
1323 /*
1324 * For each probe event, if we find that a probe event matches
1325 * our enabler, create an associated lttng_event if not
1326 * already present.
1327 */
1328 list_for_each_entry(probe_desc, probe_list, head) {
1329 for (i = 0; i < probe_desc->nr_events; i++) {
1330 int found = 0;
1331 struct hlist_head *head;
1332 const char *event_name;
1333 size_t name_len;
1334 uint32_t hash;
1335 struct lttng_event *event;
1336
1337 desc = probe_desc->event_desc[i];
1338 if (!lttng_desc_match_enabler(desc, enabler))
1339 continue;
1340 event_name = desc->name;
1341 name_len = strlen(event_name);
1342
1343 /*
1344 * Check if already created.
1345 */
1346 hash = jhash(event_name, name_len, 0);
1347 head = &session->events_ht.table[hash & (LTTNG_EVENT_HT_SIZE - 1)];
d216ecae 1348 lttng_hlist_for_each_entry(event, head, hlist) {
3c997079
MD
1349 if (event->desc == desc
1350 && event->chan == enabler->chan)
1351 found = 1;
1352 }
1353 if (found)
1354 continue;
1355
1356 /*
1357 * We need to create an event for this
1358 * event probe.
1359 */
1360 event = _lttng_event_create(enabler->chan,
1361 NULL, NULL, desc,
1362 LTTNG_KERNEL_TRACEPOINT);
1363 if (!event) {
1364 printk(KERN_INFO "Unable to create event %s\n",
1365 probe_desc->event_desc[i]->name);
1366 }
1367 }
1368 }
1369}
1370
33a39a3c
MD
1371static
1372void lttng_create_syscall_if_missing(struct lttng_enabler *enabler)
1373{
1374 int ret;
1375
1376 ret = lttng_syscalls_register(enabler->chan, NULL);
1377 WARN_ON_ONCE(ret);
1378}
1379
1380/*
1381 * Create struct lttng_event if it is missing and present in the list of
1382 * tracepoint probes.
1383 * Should be called with sessions mutex held.
1384 */
1385static
1386void lttng_create_event_if_missing(struct lttng_enabler *enabler)
1387{
1388 switch (enabler->event_param.instrumentation) {
1389 case LTTNG_KERNEL_TRACEPOINT:
1390 lttng_create_tracepoint_if_missing(enabler);
1391 break;
1392 case LTTNG_KERNEL_SYSCALL:
1393 lttng_create_syscall_if_missing(enabler);
1394 break;
1395 default:
1396 WARN_ON_ONCE(1);
1397 break;
1398 }
1399}
1400
3c997079
MD
1401/*
1402 * Create events associated with an enabler (if not already present),
1403 * and add backward reference from the event to the enabler.
1404 * Should be called with sessions mutex held.
1405 */
1406static
1407int lttng_enabler_ref_events(struct lttng_enabler *enabler)
1408{
e298d6af
MD
1409 struct lttng_channel *chan = enabler->chan;
1410 struct lttng_session *session = chan->session;
3c997079
MD
1411 struct lttng_event *event;
1412
e298d6af
MD
1413 if (enabler->event_param.instrumentation == LTTNG_KERNEL_SYSCALL &&
1414 enabler->event_param.u.syscall.entryexit == LTTNG_KERNEL_SYSCALL_ENTRYEXIT &&
1415 enabler->event_param.u.syscall.abi == LTTNG_KERNEL_SYSCALL_ABI_ALL &&
1416 enabler->event_param.u.syscall.match == LTTNG_SYSCALL_MATCH_NAME &&
1417 !strcmp(enabler->event_param.name, "*")) {
1418 if (enabler->enabled)
1419 WRITE_ONCE(chan->syscall_all, 1);
1420 else
1421 WRITE_ONCE(chan->syscall_all, 0);
1422 }
1423
3c997079
MD
1424 /* First ensure that probe events are created for this enabler. */
1425 lttng_create_event_if_missing(enabler);
1426
1427 /* For each event matching enabler in session event list. */
1428 list_for_each_entry(event, &session->events, list) {
1429 struct lttng_enabler_ref *enabler_ref;
1430
1431 if (!lttng_event_match_enabler(event, enabler))
1432 continue;
1433 enabler_ref = lttng_event_enabler_ref(event, enabler);
1434 if (!enabler_ref) {
1435 /*
1436 * If no backward ref, create it.
1437 * Add backward ref from event to enabler.
1438 */
1439 enabler_ref = kzalloc(sizeof(*enabler_ref), GFP_KERNEL);
1440 if (!enabler_ref)
1441 return -ENOMEM;
1442 enabler_ref->ref = enabler;
1443 list_add(&enabler_ref->node,
1444 &event->enablers_ref_head);
1445 }
1446
f127e61e
MD
1447 /*
1448 * Link filter bytecodes if not linked yet.
1449 */
1450 lttng_enabler_event_link_bytecode(event, enabler);
1451
3c997079
MD
1452 /* TODO: merge event context. */
1453 }
1454 return 0;
1455}
1456
1457/*
1458 * Called at module load: connect the probe on all enablers matching
1459 * this event.
1460 * Called with sessions lock held.
1461 */
1462int lttng_fix_pending_events(void)
1463{
1464 struct lttng_session *session;
1465
1466 list_for_each_entry(session, &sessions, list)
1467 lttng_session_lazy_sync_enablers(session);
1468 return 0;
1469}
1470
1471struct lttng_enabler *lttng_enabler_create(enum lttng_enabler_type type,
1472 struct lttng_kernel_event *event_param,
1473 struct lttng_channel *chan)
1474{
1475 struct lttng_enabler *enabler;
1476
1477 enabler = kzalloc(sizeof(*enabler), GFP_KERNEL);
1478 if (!enabler)
1479 return NULL;
1480 enabler->type = type;
07dfc1d0 1481 INIT_LIST_HEAD(&enabler->filter_bytecode_head);
3c997079
MD
1482 memcpy(&enabler->event_param, event_param,
1483 sizeof(enabler->event_param));
1484 enabler->chan = chan;
1485 /* ctx left NULL */
4fd19d8a 1486 enabler->enabled = 0;
3c997079
MD
1487 enabler->evtype = LTTNG_TYPE_ENABLER;
1488 mutex_lock(&sessions_mutex);
1489 list_add(&enabler->node, &enabler->chan->session->enablers_head);
1490 lttng_session_lazy_sync_enablers(enabler->chan->session);
1491 mutex_unlock(&sessions_mutex);
1492 return enabler;
1493}
1494
1495int lttng_enabler_enable(struct lttng_enabler *enabler)
1496{
1497 mutex_lock(&sessions_mutex);
1498 enabler->enabled = 1;
1499 lttng_session_lazy_sync_enablers(enabler->chan->session);
1500 mutex_unlock(&sessions_mutex);
1501 return 0;
1502}
1503
1504int lttng_enabler_disable(struct lttng_enabler *enabler)
1505{
1506 mutex_lock(&sessions_mutex);
1507 enabler->enabled = 0;
1508 lttng_session_lazy_sync_enablers(enabler->chan->session);
1509 mutex_unlock(&sessions_mutex);
1510 return 0;
1511}
1512
07dfc1d0
MD
1513int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler,
1514 struct lttng_kernel_filter_bytecode __user *bytecode)
1515{
1516 struct lttng_filter_bytecode_node *bytecode_node;
1517 uint32_t bytecode_len;
1518 int ret;
1519
1520 ret = get_user(bytecode_len, &bytecode->len);
1521 if (ret)
1522 return ret;
1523 bytecode_node = kzalloc(sizeof(*bytecode_node) + bytecode_len,
1524 GFP_KERNEL);
1525 if (!bytecode_node)
1526 return -ENOMEM;
1527 ret = copy_from_user(&bytecode_node->bc, bytecode,
1528 sizeof(*bytecode) + bytecode_len);
1529 if (ret)
1530 goto error_free;
1531 bytecode_node->enabler = enabler;
1532 /* Enforce length based on allocated size */
1533 bytecode_node->bc.len = bytecode_len;
1534 list_add_tail(&bytecode_node->node, &enabler->filter_bytecode_head);
1535 lttng_session_lazy_sync_enablers(enabler->chan->session);
1536 return 0;
1537
1538error_free:
1539 kfree(bytecode_node);
1540 return ret;
1541}
1542
3aed4dca
FD
1543int lttng_event_add_callsite(struct lttng_event *event,
1544 struct lttng_kernel_event_callsite __user *callsite)
1545{
1546
1547 switch (event->instrumentation) {
1548 case LTTNG_KERNEL_UPROBE:
1549 return lttng_uprobes_add_callsite(event, callsite);
1550 default:
1551 return -EINVAL;
1552 }
1553}
1554
3c997079
MD
1555int lttng_enabler_attach_context(struct lttng_enabler *enabler,
1556 struct lttng_kernel_context *context_param)
1557{
1558 return -ENOSYS;
1559}
1560
1561static
1562void lttng_enabler_destroy(struct lttng_enabler *enabler)
1563{
07dfc1d0
MD
1564 struct lttng_filter_bytecode_node *filter_node, *tmp_filter_node;
1565
1566 /* Destroy filter bytecode */
1567 list_for_each_entry_safe(filter_node, tmp_filter_node,
1568 &enabler->filter_bytecode_head, node) {
1569 kfree(filter_node);
1570 }
1571
3c997079
MD
1572 /* Destroy contexts */
1573 lttng_destroy_context(enabler->ctx);
1574
1575 list_del(&enabler->node);
1576 kfree(enabler);
1577}
1578
1579/*
1580 * lttng_session_sync_enablers should be called just before starting a
1581 * session.
1582 * Should be called with sessions mutex held.
1583 */
1584static
1585void lttng_session_sync_enablers(struct lttng_session *session)
1586{
1587 struct lttng_enabler *enabler;
1588 struct lttng_event *event;
1589
1590 list_for_each_entry(enabler, &session->enablers_head, node)
1591 lttng_enabler_ref_events(enabler);
1592 /*
1593 * For each event, if at least one of its enablers is enabled,
1594 * and its channel and session transient states are enabled, we
1595 * enable the event, else we disable it.
1596 */
1597 list_for_each_entry(event, &session->events, list) {
1598 struct lttng_enabler_ref *enabler_ref;
07dfc1d0
MD
1599 struct lttng_bytecode_runtime *runtime;
1600 int enabled = 0, has_enablers_without_bytecode = 0;
3c997079 1601
4ecb5ad5
MD
1602 switch (event->instrumentation) {
1603 case LTTNG_KERNEL_TRACEPOINT:
1604 case LTTNG_KERNEL_SYSCALL:
3c997079
MD
1605 /* Enable events */
1606 list_for_each_entry(enabler_ref,
1607 &event->enablers_ref_head, node) {
1608 if (enabler_ref->ref->enabled) {
1609 enabled = 1;
1610 break;
1611 }
1612 }
4ecb5ad5
MD
1613 break;
1614 default:
3c997079
MD
1615 /* Not handled with lazy sync. */
1616 continue;
1617 }
1618 /*
1619 * Enabled state is based on union of enablers, with
1620 * intesection of session and channel transient enable
1621 * states.
1622 */
1623 enabled = enabled && session->tstate && event->chan->tstate;
1624
a8f2d0c7 1625 WRITE_ONCE(event->enabled, enabled);
3c997079
MD
1626 /*
1627 * Sync tracepoint registration with event enabled
1628 * state.
1629 */
1630 if (enabled) {
1631 register_event(event);
1632 } else {
1633 _lttng_event_unregister(event);
1634 }
07dfc1d0
MD
1635
1636 /* Check if has enablers without bytecode enabled */
1637 list_for_each_entry(enabler_ref,
1638 &event->enablers_ref_head, node) {
1639 if (enabler_ref->ref->enabled
1640 && list_empty(&enabler_ref->ref->filter_bytecode_head)) {
1641 has_enablers_without_bytecode = 1;
1642 break;
1643 }
1644 }
1645 event->has_enablers_without_bytecode =
1646 has_enablers_without_bytecode;
1647
1648 /* Enable filters */
1649 list_for_each_entry(runtime,
f127e61e 1650 &event->bytecode_runtime_head, node)
07dfc1d0 1651 lttng_filter_sync_state(runtime);
3c997079
MD
1652 }
1653}
1654
1655/*
1656 * Apply enablers to session events, adding events to session if need
1657 * be. It is required after each modification applied to an active
1658 * session, and right before session "start".
1659 * "lazy" sync means we only sync if required.
1660 * Should be called with sessions mutex held.
1661 */
1662static
1663void lttng_session_lazy_sync_enablers(struct lttng_session *session)
1664{
1665 /* We can skip if session is not active */
1666 if (!session->active)
1667 return;
1668 lttng_session_sync_enablers(session);
1669}
1670
1ec3f75a 1671/*
d83004aa
JD
1672 * Serialize at most one packet worth of metadata into a metadata
1673 * channel.
92d9f5e6
MD
1674 * We grab the metadata cache mutex to get exclusive access to our metadata
1675 * buffer and to the metadata cache. Exclusive access to the metadata buffer
1676 * allows us to do racy operations such as looking for remaining space left in
1677 * packet and write, since mutual exclusion protects us from concurrent writes.
1678 * Mutual exclusion on the metadata cache allow us to read the cache content
1679 * without racing against reallocation of the cache by updates.
35097f36
JD
1680 * Returns the number of bytes written in the channel, 0 if no data
1681 * was written and a negative value on error.
1ec3f75a 1682 */
b3b8072b 1683int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
695b3509 1684 struct channel *chan, bool *coherent)
d83004aa
JD
1685{
1686 struct lib_ring_buffer_ctx ctx;
1687 int ret = 0;
1688 size_t len, reserve_len;
1689
f613e3e6 1690 /*
92d9f5e6
MD
1691 * Ensure we support mutiple get_next / put sequences followed by
1692 * put_next. The metadata cache lock protects reading the metadata
1693 * cache. It can indeed be read concurrently by "get_next_subbuf" and
1694 * "flush" operations on the buffer invoked by different processes.
1695 * Moreover, since the metadata cache memory can be reallocated, we
1696 * need to have exclusive access against updates even though we only
1697 * read it.
f613e3e6 1698 */
92d9f5e6 1699 mutex_lock(&stream->metadata_cache->lock);
f613e3e6
MD
1700 WARN_ON(stream->metadata_in < stream->metadata_out);
1701 if (stream->metadata_in != stream->metadata_out)
de23d59d 1702 goto end;
f613e3e6 1703
9616f0bf
JD
1704 /* Metadata regenerated, change the version. */
1705 if (stream->metadata_cache->version != stream->version)
1706 stream->version = stream->metadata_cache->version;
1707
d83004aa 1708 len = stream->metadata_cache->metadata_written -
f613e3e6 1709 stream->metadata_in;
9de2c215 1710 if (!len)
de23d59d 1711 goto end;
d83004aa 1712 reserve_len = min_t(size_t,
b3b8072b 1713 stream->transport->ops.packet_avail_size(chan),
d83004aa 1714 len);
b3b8072b 1715 lib_ring_buffer_ctx_init(&ctx, chan, NULL, reserve_len,
d83004aa
JD
1716 sizeof(char), -1);
1717 /*
1718 * If reservation failed, return an error to the caller.
1719 */
b3b8072b 1720 ret = stream->transport->ops.event_reserve(&ctx, 0);
d83004aa
JD
1721 if (ret != 0) {
1722 printk(KERN_WARNING "LTTng: Metadata event reservation failed\n");
695b3509 1723 stream->coherent = false;
d83004aa
JD
1724 goto end;
1725 }
b3b8072b 1726 stream->transport->ops.event_write(&ctx,
f613e3e6 1727 stream->metadata_cache->data + stream->metadata_in,
d83004aa 1728 reserve_len);
b3b8072b 1729 stream->transport->ops.event_commit(&ctx);
f613e3e6 1730 stream->metadata_in += reserve_len;
a5e2ec2d 1731 if (reserve_len < len)
695b3509
MD
1732 stream->coherent = false;
1733 else
1734 stream->coherent = true;
d83004aa
JD
1735 ret = reserve_len;
1736
1737end:
695b3509
MD
1738 if (coherent)
1739 *coherent = stream->coherent;
92d9f5e6 1740 mutex_unlock(&stream->metadata_cache->lock);
d83004aa
JD
1741 return ret;
1742}
1743
695b3509
MD
1744static
1745void lttng_metadata_begin(struct lttng_session *session)
1746{
a5e2ec2d
MD
1747 if (atomic_inc_return(&session->metadata_cache->producing) == 1)
1748 mutex_lock(&session->metadata_cache->lock);
695b3509
MD
1749}
1750
1751static
1752void lttng_metadata_end(struct lttng_session *session)
1753{
a5e2ec2d
MD
1754 WARN_ON_ONCE(!atomic_read(&session->metadata_cache->producing));
1755 if (atomic_dec_return(&session->metadata_cache->producing) == 0) {
1756 struct lttng_metadata_stream *stream;
1757
a5e2ec2d
MD
1758 list_for_each_entry(stream, &session->metadata_cache->metadata_stream, list)
1759 wake_up_interruptible(&stream->read_wait);
073fe00c 1760 mutex_unlock(&session->metadata_cache->lock);
a5e2ec2d 1761 }
695b3509
MD
1762}
1763
d83004aa
JD
1764/*
1765 * Write the metadata to the metadata cache.
1766 * Must be called with sessions_mutex held.
92d9f5e6
MD
1767 * The metadata cache lock protects us from concurrent read access from
1768 * thread outputting metadata content to ring buffer.
695b3509
MD
1769 * The content of the printf is printed as a single atomic metadata
1770 * transaction.
d83004aa 1771 */
a90917c3 1772int lttng_metadata_printf(struct lttng_session *session,
c099397a
MD
1773 const char *fmt, ...)
1774{
c099397a 1775 char *str;
d83004aa 1776 size_t len;
c099397a
MD
1777 va_list ap;
1778
21ed5ea7 1779 WARN_ON_ONCE(!LTTNG_READ_ONCE(session->active));
c099397a
MD
1780
1781 va_start(ap, fmt);
1782 str = kvasprintf(GFP_KERNEL, fmt, ap);
1783 va_end(ap);
1784 if (!str)
1785 return -ENOMEM;
1786
1ec3f75a 1787 len = strlen(str);
a5e2ec2d 1788 WARN_ON_ONCE(!atomic_read(&session->metadata_cache->producing));
d83004aa
JD
1789 if (session->metadata_cache->metadata_written + len >
1790 session->metadata_cache->cache_alloc) {
1791 char *tmp_cache_realloc;
1792 unsigned int tmp_cache_alloc_size;
1793
1794 tmp_cache_alloc_size = max_t(unsigned int,
1795 session->metadata_cache->cache_alloc + len,
1796 session->metadata_cache->cache_alloc << 1);
f6da044f 1797 tmp_cache_realloc = lttng_vzalloc(tmp_cache_alloc_size);
d83004aa
JD
1798 if (!tmp_cache_realloc)
1799 goto err;
a606b6e8
ML
1800 if (session->metadata_cache->data) {
1801 memcpy(tmp_cache_realloc,
1802 session->metadata_cache->data,
1803 session->metadata_cache->cache_alloc);
1804 vfree(session->metadata_cache->data);
1805 }
1806
d83004aa
JD
1807 session->metadata_cache->cache_alloc = tmp_cache_alloc_size;
1808 session->metadata_cache->data = tmp_cache_realloc;
c099397a 1809 }
d83004aa
JD
1810 memcpy(session->metadata_cache->data +
1811 session->metadata_cache->metadata_written,
1812 str, len);
1813 session->metadata_cache->metadata_written += len;
c099397a 1814 kfree(str);
d83004aa 1815
d83004aa
JD
1816 return 0;
1817
1818err:
1819 kfree(str);
1820 return -ENOMEM;
c099397a
MD
1821}
1822
f513b2bf
MD
1823static
1824int print_tabs(struct lttng_session *session, size_t nesting)
1825{
1826 size_t i;
1827
1828 for (i = 0; i < nesting; i++) {
1829 int ret;
1830
1831 ret = lttng_metadata_printf(session, " ");
1832 if (ret) {
1833 return ret;
1834 }
1835 }
1836 return 0;
1837}
1838
1839/*
1840 * Must be called with sessions_mutex held.
1841 */
1842static
1843int _lttng_struct_type_statedump(struct lttng_session *session,
1844 const struct lttng_type *type,
1845 size_t nesting)
1846{
1847 int ret;
1848 uint32_t i, nr_fields;
1849
1850 ret = print_tabs(session, nesting);
1851 if (ret)
1852 return ret;
1853 ret = lttng_metadata_printf(session,
1854 "struct {\n");
1855 if (ret)
1856 return ret;
1857 nr_fields = type->u._struct.nr_fields;
1858 for (i = 0; i < nr_fields; i++) {
1859 const struct lttng_event_field *iter_field;
1860
1861 iter_field = &type->u._struct.fields[i];
1862 ret = _lttng_field_statedump(session, iter_field, nesting + 1);
1863 if (ret)
1864 return ret;
1865 }
1866 ret = print_tabs(session, nesting);
1867 if (ret)
1868 return ret;
1869 ret = lttng_metadata_printf(session,
1870 "}");
1871 return ret;
1872}
1873
1874/*
1875 * Must be called with sessions_mutex held.
1876 */
1877static
1878int _lttng_struct_statedump(struct lttng_session *session,
1879 const struct lttng_event_field *field,
1880 size_t nesting)
1881{
1882 int ret;
1883
1884 ret = _lttng_struct_type_statedump(session,
1885 &field->type, nesting);
1886 if (ret)
1887 return ret;
1888 ret = lttng_metadata_printf(session,
1889 "_%s;\n",
1890 field->name);
1891 return ret;
1892}
1893
65c85aa6
MD
1894/*
1895 * Must be called with sessions_mutex held.
1896 */
1897static
1898int _lttng_variant_type_statedump(struct lttng_session *session,
1899 const struct lttng_type *type,
1900 size_t nesting)
1901{
1902 int ret;
1903 uint32_t i, nr_choices;
1904
1905 ret = print_tabs(session, nesting);
1906 if (ret)
1907 return ret;
1908 ret = lttng_metadata_printf(session,
1909 "variant <_%s> {\n",
1910 type->u.variant.tag_name);
1911 if (ret)
1912 return ret;
1913 nr_choices = type->u.variant.nr_choices;
1914 for (i = 0; i < nr_choices; i++) {
1915 const struct lttng_event_field *iter_field;
1916
1917 iter_field = &type->u.variant.choices[i];
1918 ret = _lttng_field_statedump(session, iter_field, nesting + 1);
1919 if (ret)
1920 return ret;
1921 }
1922 ret = print_tabs(session, nesting);
1923 if (ret)
1924 return ret;
1925 ret = lttng_metadata_printf(session,
1926 "}");
1927 return ret;
1928}
1929
1930/*
1931 * Must be called with sessions_mutex held.
1932 */
1933static
1934int _lttng_variant_statedump(struct lttng_session *session,
1935 const struct lttng_event_field *field,
1936 size_t nesting)
1937{
1938 int ret;
1939
1940 ret = _lttng_variant_type_statedump(session,
1941 &field->type, nesting);
1942 if (ret)
1943 return ret;
1944 ret = lttng_metadata_printf(session,
1945 "_%s;\n",
1946 field->name);
1947 return ret;
1948}
1949
f513b2bf
MD
1950/*
1951 * Must be called with sessions_mutex held.
1952 */
1953static
1954int _lttng_array_compound_statedump(struct lttng_session *session,
1955 const struct lttng_event_field *field,
1956 size_t nesting)
1957{
1958 int ret;
1959 const struct lttng_type *elem_type;
1960
65c85aa6 1961 /* Only array of structures and variants are currently supported. */
f513b2bf
MD
1962 elem_type = field->type.u.array_compound.elem_type;
1963 switch (elem_type->atype) {
1964 case atype_struct:
1965 ret = _lttng_struct_type_statedump(session, elem_type, nesting);
1966 if (ret)
1967 return ret;
1968 break;
65c85aa6
MD
1969 case atype_variant:
1970 ret = _lttng_variant_type_statedump(session, elem_type, nesting);
1971 if (ret)
1972 return ret;
1973 break;
f513b2bf
MD
1974 default:
1975 return -EINVAL;
1976 }
1977 ret = lttng_metadata_printf(session,
1978 " _%s[%u];\n",
1979 field->name,
1980 field->type.u.array_compound.length);
1981 return ret;
1982}
1983
1984/*
1985 * Must be called with sessions_mutex held.
1986 */
1987static
1988int _lttng_sequence_compound_statedump(struct lttng_session *session,
1989 const struct lttng_event_field *field,
1990 size_t nesting)
1991{
1992 int ret;
1993 const char *length_name;
1994 const struct lttng_type *elem_type;
1995
1996 length_name = field->type.u.sequence_compound.length_name;
1997
65c85aa6 1998 /* Only array of structures and variants are currently supported. */
f513b2bf
MD
1999 elem_type = field->type.u.sequence_compound.elem_type;
2000 switch (elem_type->atype) {
2001 case atype_struct:
2002 ret = _lttng_struct_type_statedump(session, elem_type, nesting);
2003 if (ret)
2004 return ret;
2005 break;
65c85aa6
MD
2006 case atype_variant:
2007 ret = _lttng_variant_type_statedump(session, elem_type, nesting);
2008 if (ret)
2009 return ret;
2010 break;
f513b2bf
MD
2011 default:
2012 return -EINVAL;
2013 }
2014 ret = lttng_metadata_printf(session,
2015 " _%s[ _%s ];\n",
2016 field->name,
2017 length_name);
2018 return ret;
2019}
2020
141ddf28
MD
2021/*
2022 * Must be called with sessions_mutex held.
2023 */
2024static
2025int _lttng_enum_statedump(struct lttng_session *session,
2026 const struct lttng_event_field *field,
2027 size_t nesting)
2028{
2029 const struct lttng_enum_desc *enum_desc;
2030 const struct lttng_integer_type *container_type;
2031 int ret;
2032 unsigned int i, nr_entries;
2033
2034 enum_desc = field->type.u.basic.enumeration.desc;
2035 container_type = &field->type.u.basic.enumeration.container_type;
2036 nr_entries = enum_desc->nr_entries;
2037
2038 ret = print_tabs(session, nesting);
2039 if (ret)
2040 goto end;
2041 ret = lttng_metadata_printf(session,
578e68ec 2042 "enum : integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } {\n",
141ddf28
MD
2043 container_type->size,
2044 container_type->alignment,
2045 container_type->signedness,
2046 (container_type->encoding == lttng_encode_none)
2047 ? "none"
2048 : (container_type->encoding == lttng_encode_UTF8)
2049 ? "UTF8"
2050 : "ASCII",
578e68ec
GB
2051 container_type->base,
2052#if __BYTE_ORDER == __BIG_ENDIAN
2053 container_type->reverse_byte_order ? " byte_order = le;" : ""
2054#else
2055 container_type->reverse_byte_order ? " byte_order = be;" : ""
2056#endif
2057 );
141ddf28
MD
2058 if (ret)
2059 goto end;
2060 /* Dump all entries */
2061 for (i = 0; i < nr_entries; i++) {
2062 const struct lttng_enum_entry *entry = &enum_desc->entries[i];
2063 int j, len;
2064
2065 ret = print_tabs(session, nesting + 1);
2066 if (ret)
2067 goto end;
2068 ret = lttng_metadata_printf(session,
2069 "\"");
2070 if (ret)
2071 goto end;
2072 len = strlen(entry->string);
2073 /* Escape the character '"' */
2074 for (j = 0; j < len; j++) {
2075 char c = entry->string[j];
2076
2077 switch (c) {
2078 case '"':
2079 ret = lttng_metadata_printf(session,
2080 "\\\"");
2081 break;
2082 case '\\':
2083 ret = lttng_metadata_printf(session,
2084 "\\\\");
2085 break;
2086 default:
2087 ret = lttng_metadata_printf(session,
2088 "%c", c);
2089 break;
2090 }
2091 if (ret)
2092 goto end;
2093 }
08ad1061
PP
2094 ret = lttng_metadata_printf(session, "\"");
2095 if (ret)
2096 goto end;
2097
2098 if (entry->options.is_auto) {
2099 ret = lttng_metadata_printf(session, ",\n");
2100 if (ret)
2101 goto end;
141ddf28 2102 } else {
7c559490
MD
2103 ret = lttng_metadata_printf(session,
2104 " = ");
2105 if (ret)
2106 goto end;
2107 if (entry->start.signedness)
141ddf28 2108 ret = lttng_metadata_printf(session,
7c559490
MD
2109 "%lld", (long long) entry->start.value);
2110 else
2111 ret = lttng_metadata_printf(session,
2112 "%llu", entry->start.value);
2113 if (ret)
2114 goto end;
2115 if (entry->start.signedness == entry->end.signedness &&
2116 entry->start.value
2117 == entry->end.value) {
141ddf28 2118 ret = lttng_metadata_printf(session,
7c559490
MD
2119 ",\n");
2120 } else {
2121 if (entry->end.signedness) {
2122 ret = lttng_metadata_printf(session,
2123 " ... %lld,\n",
2124 (long long) entry->end.value);
2125 } else {
2126 ret = lttng_metadata_printf(session,
2127 " ... %llu,\n",
2128 entry->end.value);
2129 }
141ddf28 2130 }
7c559490
MD
2131 if (ret)
2132 goto end;
141ddf28 2133 }
141ddf28
MD
2134 }
2135 ret = print_tabs(session, nesting);
2136 if (ret)
2137 goto end;
2138 ret = lttng_metadata_printf(session, "} _%s;\n",
2139 field->name);
2140end:
2141 return ret;
2142}
2143
d83004aa
JD
2144/*
2145 * Must be called with sessions_mutex held.
2146 */
c099397a 2147static
a90917c3 2148int _lttng_field_statedump(struct lttng_session *session,
f513b2bf
MD
2149 const struct lttng_event_field *field,
2150 size_t nesting)
c099397a 2151{
c099397a 2152 int ret = 0;
c099397a 2153
8070f5c0
MD
2154 switch (field->type.atype) {
2155 case atype_integer:
f513b2bf
MD
2156 ret = print_tabs(session, nesting);
2157 if (ret)
2158 return ret;
8070f5c0 2159 ret = lttng_metadata_printf(session,
f513b2bf 2160 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s;\n",
8070f5c0
MD
2161 field->type.u.basic.integer.size,
2162 field->type.u.basic.integer.alignment,
2163 field->type.u.basic.integer.signedness,
2164 (field->type.u.basic.integer.encoding == lttng_encode_none)
2165 ? "none"
2166 : (field->type.u.basic.integer.encoding == lttng_encode_UTF8)
2167 ? "UTF8"
2168 : "ASCII",
2169 field->type.u.basic.integer.base,
5214fa50 2170#if __BYTE_ORDER == __BIG_ENDIAN
8070f5c0 2171 field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
c099397a 2172#else
8070f5c0 2173 field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
c099397a 2174#endif
8070f5c0
MD
2175 field->name);
2176 break;
2177 case atype_enum:
141ddf28 2178 ret = _lttng_enum_statedump(session, field, nesting);
8070f5c0
MD
2179 break;
2180 case atype_array:
3834b99f 2181 case atype_array_bitfield:
8070f5c0
MD
2182 {
2183 const struct lttng_basic_type *elem_type;
2184
2185 elem_type = &field->type.u.array.elem_type;
43803cf2 2186 if (field->type.u.array.elem_alignment) {
f513b2bf
MD
2187 ret = print_tabs(session, nesting);
2188 if (ret)
2189 return ret;
43803cf2 2190 ret = lttng_metadata_printf(session,
f513b2bf 2191 "struct { } align(%u) _%s_padding;\n",
43803cf2
MD
2192 field->type.u.array.elem_alignment * CHAR_BIT,
2193 field->name);
2194 if (ret)
2195 return ret;
2196 }
f513b2bf
MD
2197 ret = print_tabs(session, nesting);
2198 if (ret)
2199 return ret;
8070f5c0 2200 ret = lttng_metadata_printf(session,
f513b2bf 2201 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
8070f5c0
MD
2202 elem_type->u.basic.integer.size,
2203 elem_type->u.basic.integer.alignment,
2204 elem_type->u.basic.integer.signedness,
2205 (elem_type->u.basic.integer.encoding == lttng_encode_none)
2206 ? "none"
2207 : (elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
2208 ? "UTF8"
2209 : "ASCII",
2210 elem_type->u.basic.integer.base,
5214fa50 2211#if __BYTE_ORDER == __BIG_ENDIAN
8070f5c0 2212 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
8fa75f34 2213#else
8070f5c0 2214 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
8fa75f34 2215#endif
8070f5c0
MD
2216 field->name, field->type.u.array.length);
2217 break;
2218 }
2219 case atype_sequence:
3834b99f 2220 case atype_sequence_bitfield:
8070f5c0
MD
2221 {
2222 const struct lttng_basic_type *elem_type;
2223 const struct lttng_basic_type *length_type;
2224
2225 elem_type = &field->type.u.sequence.elem_type;
2226 length_type = &field->type.u.sequence.length_type;
f513b2bf
MD
2227 ret = print_tabs(session, nesting);
2228 if (ret)
2229 return ret;
8070f5c0 2230 ret = lttng_metadata_printf(session,
f513b2bf 2231 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } __%s_length;\n",
8070f5c0 2232 length_type->u.basic.integer.size,
32257272 2233 (unsigned int) length_type->u.basic.integer.alignment,
8070f5c0
MD
2234 length_type->u.basic.integer.signedness,
2235 (length_type->u.basic.integer.encoding == lttng_encode_none)
2236 ? "none"
0635cdd4 2237 : ((length_type->u.basic.integer.encoding == lttng_encode_UTF8)
8070f5c0 2238 ? "UTF8"
0635cdd4 2239 : "ASCII"),
8070f5c0 2240 length_type->u.basic.integer.base,
5214fa50 2241#if __BYTE_ORDER == __BIG_ENDIAN
8070f5c0 2242 length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
e0a7a7c4 2243#else
0635cdd4 2244 length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
e0a7a7c4 2245#endif
27d2368e
MD
2246 field->name);
2247 if (ret)
2248 return ret;
2249
43803cf2 2250 if (field->type.u.sequence.elem_alignment) {
f513b2bf
MD
2251 ret = print_tabs(session, nesting);
2252 if (ret)
2253 return ret;
43803cf2 2254 ret = lttng_metadata_printf(session,
f513b2bf 2255 "struct { } align(%u) _%s_padding;\n",
43803cf2
MD
2256 field->type.u.sequence.elem_alignment * CHAR_BIT,
2257 field->name);
2258 if (ret)
2259 return ret;
2260 }
f513b2bf
MD
2261 ret = print_tabs(session, nesting);
2262 if (ret)
2263 return ret;
27d2368e 2264 ret = lttng_metadata_printf(session,
f513b2bf 2265 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
8070f5c0 2266 elem_type->u.basic.integer.size,
32257272 2267 (unsigned int) elem_type->u.basic.integer.alignment,
8070f5c0
MD
2268 elem_type->u.basic.integer.signedness,
2269 (elem_type->u.basic.integer.encoding == lttng_encode_none)
2270 ? "none"
0635cdd4 2271 : ((elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
8070f5c0 2272 ? "UTF8"
0635cdd4 2273 : "ASCII"),
8070f5c0 2274 elem_type->u.basic.integer.base,
5214fa50 2275#if __BYTE_ORDER == __BIG_ENDIAN
8070f5c0 2276 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
8fa75f34 2277#else
8070f5c0 2278 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
8fa75f34 2279#endif
8070f5c0 2280 field->name,
27d2368e 2281 field->name);
8070f5c0
MD
2282 break;
2283 }
c099397a 2284
8070f5c0
MD
2285 case atype_string:
2286 /* Default encoding is UTF8 */
f513b2bf
MD
2287 ret = print_tabs(session, nesting);
2288 if (ret)
2289 return ret;
8070f5c0 2290 ret = lttng_metadata_printf(session,
f513b2bf 2291 "string%s _%s;\n",
8070f5c0
MD
2292 field->type.u.basic.string.encoding == lttng_encode_ASCII ?
2293 " { encoding = ASCII; }" : "",
2294 field->name);
2295 break;
f513b2bf
MD
2296 case atype_struct:
2297 ret = _lttng_struct_statedump(session, field, nesting);
2298 break;
2299 case atype_array_compound:
2300 ret = _lttng_array_compound_statedump(session, field, nesting);
2301 break;
2302 case atype_sequence_compound:
2303 ret = _lttng_sequence_compound_statedump(session, field, nesting);
2304 break;
65c85aa6
MD
2305 case atype_variant:
2306 ret = _lttng_variant_statedump(session, field, nesting);
2307 break;
f513b2bf 2308
8070f5c0
MD
2309 default:
2310 WARN_ON_ONCE(1);
2311 return -EINVAL;
2312 }
2313 return ret;
2314}
2315
2316static
a90917c3 2317int _lttng_context_metadata_statedump(struct lttng_session *session,
8070f5c0
MD
2318 struct lttng_ctx *ctx)
2319{
2320 int ret = 0;
2321 int i;
2322
2323 if (!ctx)
2324 return 0;
2325 for (i = 0; i < ctx->nr_fields; i++) {
2326 const struct lttng_ctx_field *field = &ctx->fields[i];
2327
f513b2bf 2328 ret = _lttng_field_statedump(session, &field->event_field, 2);
8070f5c0
MD
2329 if (ret)
2330 return ret;
2331 }
2332 return ret;
2333}
2334
2335static
a90917c3
MD
2336int _lttng_fields_metadata_statedump(struct lttng_session *session,
2337 struct lttng_event *event)
8070f5c0
MD
2338{
2339 const struct lttng_event_desc *desc = event->desc;
2340 int ret = 0;
2341 int i;
2342
2343 for (i = 0; i < desc->nr_fields; i++) {
2344 const struct lttng_event_field *field = &desc->fields[i];
2345
f513b2bf 2346 ret = _lttng_field_statedump(session, field, 2);
8070f5c0
MD
2347 if (ret)
2348 return ret;
c099397a
MD
2349 }
2350 return ret;
2351}
2352
d83004aa
JD
2353/*
2354 * Must be called with sessions_mutex held.
695b3509
MD
2355 * The entire event metadata is printed as a single atomic metadata
2356 * transaction.
d83004aa 2357 */
c099397a 2358static
a90917c3
MD
2359int _lttng_event_metadata_statedump(struct lttng_session *session,
2360 struct lttng_channel *chan,
2361 struct lttng_event *event)
c099397a
MD
2362{
2363 int ret = 0;
2364
21ed5ea7 2365 if (event->metadata_dumped || !LTTNG_READ_ONCE(session->active))
c099397a 2366 return 0;
d83004aa 2367 if (chan->channel_type == METADATA_CHANNEL)
c099397a
MD
2368 return 0;
2369
695b3509
MD
2370 lttng_metadata_begin(session);
2371
c099397a
MD
2372 ret = lttng_metadata_printf(session,
2373 "event {\n"
ae734547 2374 " name = \"%s\";\n"
c099397a 2375 " id = %u;\n"
b9074a1b 2376 " stream_id = %u;\n",
c099397a
MD
2377 event->desc->name,
2378 event->id,
2379 event->chan->id);
2380 if (ret)
2381 goto end;
2382
b9074a1b
MD
2383 if (event->ctx) {
2384 ret = lttng_metadata_printf(session,
2385 " context := struct {\n");
2386 if (ret)
2387 goto end;
2388 }
a90917c3 2389 ret = _lttng_context_metadata_statedump(session, event->ctx);
8070f5c0
MD
2390 if (ret)
2391 goto end;
b9074a1b
MD
2392 if (event->ctx) {
2393 ret = lttng_metadata_printf(session,
2394 " };\n");
2395 if (ret)
2396 goto end;
2397 }
8070f5c0
MD
2398
2399 ret = lttng_metadata_printf(session,
8070f5c0
MD
2400 " fields := struct {\n"
2401 );
2402 if (ret)
2403 goto end;
2404
a90917c3 2405 ret = _lttng_fields_metadata_statedump(session, event);
c099397a
MD
2406 if (ret)
2407 goto end;
2408
2409 /*
2410 * LTTng space reservation can only reserve multiples of the
2411 * byte size.
2412 */
2413 ret = lttng_metadata_printf(session,
9115fbdc
MD
2414 " };\n"
2415 "};\n\n");
c099397a
MD
2416 if (ret)
2417 goto end;
2418
c099397a
MD
2419 event->metadata_dumped = 1;
2420end:
695b3509 2421 lttng_metadata_end(session);
c099397a
MD
2422 return ret;
2423
2424}
2425
d83004aa
JD
2426/*
2427 * Must be called with sessions_mutex held.
695b3509
MD
2428 * The entire channel metadata is printed as a single atomic metadata
2429 * transaction.
d83004aa 2430 */
c099397a 2431static
a90917c3
MD
2432int _lttng_channel_metadata_statedump(struct lttng_session *session,
2433 struct lttng_channel *chan)
c099397a
MD
2434{
2435 int ret = 0;
2436
21ed5ea7 2437 if (chan->metadata_dumped || !LTTNG_READ_ONCE(session->active))
c099397a 2438 return 0;
d83004aa
JD
2439
2440 if (chan->channel_type == METADATA_CHANNEL)
c099397a
MD
2441 return 0;
2442
695b3509
MD
2443 lttng_metadata_begin(session);
2444
c099397a
MD
2445 WARN_ON_ONCE(!chan->header_type);
2446 ret = lttng_metadata_printf(session,
2447 "stream {\n"
2448 " id = %u;\n"
9115fbdc 2449 " event.header := %s;\n"
b9074a1b 2450 " packet.context := struct packet_context;\n",
c099397a
MD
2451 chan->id,
2452 chan->header_type == 1 ? "struct event_header_compact" :
2453 "struct event_header_large");
2454 if (ret)
2455 goto end;
2456
b9074a1b
MD
2457 if (chan->ctx) {
2458 ret = lttng_metadata_printf(session,
2459 " event.context := struct {\n");
2460 if (ret)
2461 goto end;
2462 }
a90917c3 2463 ret = _lttng_context_metadata_statedump(session, chan->ctx);
8070f5c0
MD
2464 if (ret)
2465 goto end;
b9074a1b
MD
2466 if (chan->ctx) {
2467 ret = lttng_metadata_printf(session,
2468 " };\n");
2469 if (ret)
2470 goto end;
2471 }
8070f5c0
MD
2472
2473 ret = lttng_metadata_printf(session,
b9074a1b 2474 "};\n\n");
8070f5c0 2475
c099397a
MD
2476 chan->metadata_dumped = 1;
2477end:
695b3509 2478 lttng_metadata_end(session);
c099397a
MD
2479 return ret;
2480}
2481
d83004aa
JD
2482/*
2483 * Must be called with sessions_mutex held.
2484 */
9115fbdc 2485static
a90917c3 2486int _lttng_stream_packet_context_declare(struct lttng_session *session)
9115fbdc
MD
2487{
2488 return lttng_metadata_printf(session,
2489 "struct packet_context {\n"
a3ccff4f
MD
2490 " uint64_clock_monotonic_t timestamp_begin;\n"
2491 " uint64_clock_monotonic_t timestamp_end;\n"
576ca06a
MD
2492 " uint64_t content_size;\n"
2493 " uint64_t packet_size;\n"
5b3cf4f9 2494 " uint64_t packet_seq_num;\n"
a9afe705 2495 " unsigned long events_discarded;\n"
9115fbdc 2496 " uint32_t cpu_id;\n"
c6dfdf6f 2497 "};\n\n"
9115fbdc
MD
2498 );
2499}
2500
2501/*
2502 * Compact header:
2503 * id: range: 0 - 30.
2504 * id 31 is reserved to indicate an extended header.
2505 *
2506 * Large header:
2507 * id: range: 0 - 65534.
2508 * id 65535 is reserved to indicate an extended header.
d83004aa
JD
2509 *
2510 * Must be called with sessions_mutex held.
9115fbdc
MD
2511 */
2512static
a90917c3 2513int _lttng_event_header_declare(struct lttng_session *session)
9115fbdc
MD
2514{
2515 return lttng_metadata_printf(session,
2516 "struct event_header_compact {\n"
2517 " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
2518 " variant <id> {\n"
2519 " struct {\n"
a3ccff4f 2520 " uint27_clock_monotonic_t timestamp;\n"
9115fbdc
MD
2521 " } compact;\n"
2522 " struct {\n"
2523 " uint32_t id;\n"
a3ccff4f 2524 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
2525 " } extended;\n"
2526 " } v;\n"
2527 "} align(%u);\n"
2528 "\n"
2529 "struct event_header_large {\n"
2530 " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
2531 " variant <id> {\n"
2532 " struct {\n"
a3ccff4f 2533 " uint32_clock_monotonic_t timestamp;\n"
9115fbdc
MD
2534 " } compact;\n"
2535 " struct {\n"
2536 " uint32_t id;\n"
a3ccff4f 2537 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
2538 " } extended;\n"
2539 " } v;\n"
2540 "} align(%u);\n\n",
a90917c3
MD
2541 lttng_alignof(uint32_t) * CHAR_BIT,
2542 lttng_alignof(uint16_t) * CHAR_BIT
9115fbdc
MD
2543 );
2544}
2545
a3ccff4f
MD
2546 /*
2547 * Approximation of NTP time of day to clock monotonic correlation,
2548 * taken at start of trace.
2549 * Yes, this is only an approximation. Yes, we can (and will) do better
2550 * in future versions.
5283350b
MD
2551 * This function may return a negative offset. It may happen if the
2552 * system sets the REALTIME clock to 0 after boot.
25cc7051
MJ
2553 *
2554 * Use 64bit timespec on kernels that have it, this makes 32bit arch
2555 * y2038 compliant.
a3ccff4f
MD
2556 */
2557static
8967b2a3 2558int64_t measure_clock_offset(void)
a3ccff4f 2559{
dcb93448 2560 uint64_t monotonic_avg, monotonic[2], realtime;
2754583e 2561 uint64_t tcf = trace_clock_freq();
dcb93448 2562 int64_t offset;
a3ccff4f 2563 unsigned long flags;
25cc7051
MJ
2564#ifdef LTTNG_KERNEL_HAS_TIMESPEC64
2565 struct timespec64 rts = { 0, 0 };
2566#else
2567 struct timespec rts = { 0, 0 };
2568#endif
a3ccff4f
MD
2569
2570 /* Disable interrupts to increase correlation precision. */
2571 local_irq_save(flags);
2572 monotonic[0] = trace_clock_read64();
25cc7051
MJ
2573#ifdef LTTNG_KERNEL_HAS_TIMESPEC64
2574 ktime_get_real_ts64(&rts);
2575#else
216b6baa 2576 getnstimeofday(&rts);
25cc7051 2577#endif
a3ccff4f
MD
2578 monotonic[1] = trace_clock_read64();
2579 local_irq_restore(flags);
2580
dcb93448 2581 monotonic_avg = (monotonic[0] + monotonic[1]) >> 1;
2754583e
MD
2582 realtime = (uint64_t) rts.tv_sec * tcf;
2583 if (tcf == NSEC_PER_SEC) {
2584 realtime += rts.tv_nsec;
2585 } else {
2586 uint64_t n = rts.tv_nsec * tcf;
2587
2588 do_div(n, NSEC_PER_SEC);
2589 realtime += n;
2590 }
dcb93448 2591 offset = (int64_t) realtime - monotonic_avg;
a3ccff4f
MD
2592 return offset;
2593}
2594
deba832d
JR
2595static
2596int print_escaped_ctf_string(struct lttng_session *session, const char *string)
2597{
2598 int ret;
2599 size_t i;
2600 char cur;
2601
2602 i = 0;
2603 cur = string[i];
2604 while (cur != '\0') {
2605 switch (cur) {
2606 case '\n':
2607 ret = lttng_metadata_printf(session, "%s", "\\n");
2608 break;
2609 case '\\':
2610 case '"':
2611 ret = lttng_metadata_printf(session, "%c", '\\');
2612 if (ret)
2613 goto error;
2614 /* We still print the current char */
2615 /* Fallthrough */
2616 default:
2617 ret = lttng_metadata_printf(session, "%c", cur);
2618 break;
2619 }
2620
2621 if (ret)
2622 goto error;
2623
2624 cur = string[++i];
2625 }
2626error:
2627 return ret;
2628}
2629
2630static
a9550ab5
JR
2631int print_metadata_escaped_field(struct lttng_session *session, const char *field,
2632 const char *field_value)
deba832d
JR
2633{
2634 int ret;
2635
a9550ab5 2636 ret = lttng_metadata_printf(session, " %s = \"", field);
deba832d
JR
2637 if (ret)
2638 goto error;
2639
a9550ab5 2640 ret = print_escaped_ctf_string(session, field_value);
deba832d
JR
2641 if (ret)
2642 goto error;
2643
2644 ret = lttng_metadata_printf(session, "\";\n");
2645
2646error:
2647 return ret;
2648}
2649
c099397a
MD
2650/*
2651 * Output metadata into this session's metadata buffers.
d83004aa 2652 * Must be called with sessions_mutex held.
c099397a
MD
2653 */
2654static
a90917c3 2655int _lttng_session_metadata_statedump(struct lttng_session *session)
c099397a 2656{
30bdb6e4 2657 unsigned char *uuid_c = session->uuid.b;
a82c63f1 2658 unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN];
a90917c3
MD
2659 struct lttng_channel *chan;
2660 struct lttng_event *event;
c099397a
MD
2661 int ret = 0;
2662
21ed5ea7 2663 if (!LTTNG_READ_ONCE(session->active))
c099397a 2664 return 0;
695b3509
MD
2665
2666 lttng_metadata_begin(session);
2667
c099397a
MD
2668 if (session->metadata_dumped)
2669 goto skip_session;
c099397a 2670
d793d5e1 2671 snprintf(uuid_s, sizeof(uuid_s),
30bdb6e4
MD
2672 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
2673 uuid_c[0], uuid_c[1], uuid_c[2], uuid_c[3],
2674 uuid_c[4], uuid_c[5], uuid_c[6], uuid_c[7],
2675 uuid_c[8], uuid_c[9], uuid_c[10], uuid_c[11],
2676 uuid_c[12], uuid_c[13], uuid_c[14], uuid_c[15]);
d793d5e1
MD
2677
2678 ret = lttng_metadata_printf(session,
9115fbdc
MD
2679 "typealias integer { size = 8; align = %u; signed = false; } := uint8_t;\n"
2680 "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n"
2681 "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n"
2682 "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n"
a9afe705 2683 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
9115fbdc
MD
2684 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
2685 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
d793d5e1
MD
2686 "\n"
2687 "trace {\n"
2688 " major = %u;\n"
2689 " minor = %u;\n"
30bdb6e4 2690 " uuid = \"%s\";\n"
d793d5e1
MD
2691 " byte_order = %s;\n"
2692 " packet.header := struct {\n"
2693 " uint32_t magic;\n"
1ec3f75a 2694 " uint8_t uuid[16];\n"
d793d5e1 2695 " uint32_t stream_id;\n"
5594698f 2696 " uint64_t stream_instance_id;\n"
0eb25f58 2697 " };\n"
d793d5e1 2698 "};\n\n",
a90917c3
MD
2699 lttng_alignof(uint8_t) * CHAR_BIT,
2700 lttng_alignof(uint16_t) * CHAR_BIT,
2701 lttng_alignof(uint32_t) * CHAR_BIT,
2702 lttng_alignof(uint64_t) * CHAR_BIT,
a9afe705
MD
2703 sizeof(unsigned long) * CHAR_BIT,
2704 lttng_alignof(unsigned long) * CHAR_BIT,
c6c9e10f
MD
2705 CTF_SPEC_MAJOR,
2706 CTF_SPEC_MINOR,
d793d5e1 2707 uuid_s,
5214fa50 2708#if __BYTE_ORDER == __BIG_ENDIAN
d793d5e1
MD
2709 "be"
2710#else
2711 "le"
2712#endif
2713 );
2714 if (ret)
2715 goto end;
2716
99dc9597
MD
2717 ret = lttng_metadata_printf(session,
2718 "env {\n"
a6058143 2719 " hostname = \"%s\";\n"
c6c9e10f 2720 " domain = \"kernel\";\n"
99dc9597 2721 " sysname = \"%s\";\n"
c6c9e10f
MD
2722 " kernel_release = \"%s\";\n"
2723 " kernel_version = \"%s\";\n"
2724 " tracer_name = \"lttng-modules\";\n"
2725 " tracer_major = %d;\n"
2726 " tracer_minor = %d;\n"
2727 " tracer_patchlevel = %d;\n"
deba832d 2728 " trace_buffering_scheme = \"global\";\n",
3d0d43db 2729 current->nsproxy->uts_ns->name.nodename,
99dc9597
MD
2730 utsname()->sysname,
2731 utsname()->release,
c6c9e10f
MD
2732 utsname()->version,
2733 LTTNG_MODULES_MAJOR_VERSION,
2734 LTTNG_MODULES_MINOR_VERSION,
2735 LTTNG_MODULES_PATCHLEVEL_VERSION
99dc9597
MD
2736 );
2737 if (ret)
2738 goto end;
2739
a9550ab5
JR
2740 ret = print_metadata_escaped_field(session, "trace_name", session->name);
2741 if (ret)
2742 goto end;
2743 ret = print_metadata_escaped_field(session, "trace_creation_datetime",
2744 session->creation_time);
deba832d
JR
2745 if (ret)
2746 goto end;
2747
2748 /* Close env */
2749 ret = lttng_metadata_printf(session, "};\n\n");
2750 if (ret)
2751 goto end;
2752
a3ccff4f
MD
2753 ret = lttng_metadata_printf(session,
2754 "clock {\n"
2754583e
MD
2755 " name = \"%s\";\n",
2756 trace_clock_name()
a82c63f1
MD
2757 );
2758 if (ret)
2759 goto end;
2760
2761 if (!trace_clock_uuid(clock_uuid_s)) {
2762 ret = lttng_metadata_printf(session,
7c27cb17 2763 " uuid = \"%s\";\n",
a82c63f1
MD
2764 clock_uuid_s
2765 );
2766 if (ret)
2767 goto end;
2768 }
2769
2770 ret = lttng_metadata_printf(session,
2754583e 2771 " description = \"%s\";\n"
a3ccff4f
MD
2772 " freq = %llu; /* Frequency, in Hz */\n"
2773 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
8967b2a3 2774 " offset = %lld;\n"
a3ccff4f 2775 "};\n\n",
2754583e 2776 trace_clock_description(),
a3ccff4f 2777 (unsigned long long) trace_clock_freq(),
8967b2a3 2778 (long long) measure_clock_offset()
a3ccff4f
MD
2779 );
2780 if (ret)
2781 goto end;
2782
2783 ret = lttng_metadata_printf(session,
2784 "typealias integer {\n"
2785 " size = 27; align = 1; signed = false;\n"
2754583e 2786 " map = clock.%s.value;\n"
a3ccff4f
MD
2787 "} := uint27_clock_monotonic_t;\n"
2788 "\n"
2789 "typealias integer {\n"
2790 " size = 32; align = %u; signed = false;\n"
2754583e 2791 " map = clock.%s.value;\n"
a3ccff4f
MD
2792 "} := uint32_clock_monotonic_t;\n"
2793 "\n"
2794 "typealias integer {\n"
2795 " size = 64; align = %u; signed = false;\n"
2754583e 2796 " map = clock.%s.value;\n"
a3ccff4f 2797 "} := uint64_clock_monotonic_t;\n\n",
2754583e 2798 trace_clock_name(),
a3ccff4f 2799 lttng_alignof(uint32_t) * CHAR_BIT,
2754583e
MD
2800 trace_clock_name(),
2801 lttng_alignof(uint64_t) * CHAR_BIT,
2802 trace_clock_name()
a3ccff4f
MD
2803 );
2804 if (ret)
2805 goto end;
2806
a90917c3 2807 ret = _lttng_stream_packet_context_declare(session);
9115fbdc
MD
2808 if (ret)
2809 goto end;
2810
a90917c3 2811 ret = _lttng_event_header_declare(session);
9115fbdc
MD
2812 if (ret)
2813 goto end;
2814
c099397a
MD
2815skip_session:
2816 list_for_each_entry(chan, &session->chan, list) {
a90917c3 2817 ret = _lttng_channel_metadata_statedump(session, chan);
c099397a
MD
2818 if (ret)
2819 goto end;
2820 }
2821
2822 list_for_each_entry(event, &session->events, list) {
a90917c3 2823 ret = _lttng_event_metadata_statedump(session, event->chan, event);
c099397a
MD
2824 if (ret)
2825 goto end;
2826 }
2827 session->metadata_dumped = 1;
2828end:
695b3509 2829 lttng_metadata_end(session);
c099397a
MD
2830 return ret;
2831}
2832
c0e31d2e 2833/**
a90917c3 2834 * lttng_transport_register - LTT transport registration
c0e31d2e
MD
2835 * @transport: transport structure
2836 *
2837 * Registers a transport which can be used as output to extract the data out of
2838 * LTTng. The module calling this registration function must ensure that no
2839 * trap-inducing code will be executed by the transport functions. E.g.
da0fcb14 2840 * vmalloc_sync_mappings() must be called between a vmalloc and the moment the memory
c0e31d2e 2841 * is made visible to the transport function. This registration acts as a
da0fcb14 2842 * vmalloc_sync_mappings. Therefore, only if the module allocates virtual memory
c0e31d2e
MD
2843 * after its registration must it synchronize the TLBs.
2844 */
a90917c3 2845void lttng_transport_register(struct lttng_transport *transport)
c0e31d2e
MD
2846{
2847 /*
2848 * Make sure no page fault can be triggered by the module about to be
2849 * registered. We deal with this here so we don't have to call
da0fcb14 2850 * vmalloc_sync_mappings() in each module's init.
c0e31d2e 2851 */
da0fcb14 2852 wrapper_vmalloc_sync_mappings();
c0e31d2e
MD
2853
2854 mutex_lock(&sessions_mutex);
a90917c3 2855 list_add_tail(&transport->node, &lttng_transport_list);
c0e31d2e
MD
2856 mutex_unlock(&sessions_mutex);
2857}
a90917c3 2858EXPORT_SYMBOL_GPL(lttng_transport_register);
c0e31d2e
MD
2859
2860/**
a90917c3 2861 * lttng_transport_unregister - LTT transport unregistration
c0e31d2e
MD
2862 * @transport: transport structure
2863 */
a90917c3 2864void lttng_transport_unregister(struct lttng_transport *transport)
c0e31d2e
MD
2865{
2866 mutex_lock(&sessions_mutex);
2867 list_del(&transport->node);
2868 mutex_unlock(&sessions_mutex);
2869}
a90917c3 2870EXPORT_SYMBOL_GPL(lttng_transport_unregister);
c0e31d2e 2871
b78104db 2872#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0))
1e367326
MD
2873
2874enum cpuhp_state lttng_hp_prepare;
2875enum cpuhp_state lttng_hp_online;
2876
2877static int lttng_hotplug_prepare(unsigned int cpu, struct hlist_node *node)
2878{
2879 struct lttng_cpuhp_node *lttng_node;
2880
2881 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
2882 switch (lttng_node->component) {
2883 case LTTNG_RING_BUFFER_FRONTEND:
2884 return 0;
2885 case LTTNG_RING_BUFFER_BACKEND:
2886 return lttng_cpuhp_rb_backend_prepare(cpu, lttng_node);
2887 case LTTNG_RING_BUFFER_ITER:
2888 return 0;
2889 case LTTNG_CONTEXT_PERF_COUNTERS:
2890 return 0;
2891 default:
2892 return -EINVAL;
2893 }
2894}
2895
2896static int lttng_hotplug_dead(unsigned int cpu, struct hlist_node *node)
2897{
2898 struct lttng_cpuhp_node *lttng_node;
2899
2900 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
2901 switch (lttng_node->component) {
2902 case LTTNG_RING_BUFFER_FRONTEND:
2903 return lttng_cpuhp_rb_frontend_dead(cpu, lttng_node);
2904 case LTTNG_RING_BUFFER_BACKEND:
2905 return 0;
2906 case LTTNG_RING_BUFFER_ITER:
2907 return 0;
2908 case LTTNG_CONTEXT_PERF_COUNTERS:
2909 return lttng_cpuhp_perf_counter_dead(cpu, lttng_node);
2910 default:
2911 return -EINVAL;
2912 }
2913}
2914
2915static int lttng_hotplug_online(unsigned int cpu, struct hlist_node *node)
2916{
2917 struct lttng_cpuhp_node *lttng_node;
2918
2919 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
2920 switch (lttng_node->component) {
2921 case LTTNG_RING_BUFFER_FRONTEND:
2922 return lttng_cpuhp_rb_frontend_online(cpu, lttng_node);
2923 case LTTNG_RING_BUFFER_BACKEND:
2924 return 0;
2925 case LTTNG_RING_BUFFER_ITER:
2926 return lttng_cpuhp_rb_iter_online(cpu, lttng_node);
2927 case LTTNG_CONTEXT_PERF_COUNTERS:
2928 return lttng_cpuhp_perf_counter_online(cpu, lttng_node);
2929 default:
2930 return -EINVAL;
2931 }
2932}
2933
2934static int lttng_hotplug_offline(unsigned int cpu, struct hlist_node *node)
2935{
2936 struct lttng_cpuhp_node *lttng_node;
2937
2938 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
2939 switch (lttng_node->component) {
2940 case LTTNG_RING_BUFFER_FRONTEND:
2941 return lttng_cpuhp_rb_frontend_offline(cpu, lttng_node);
2942 case LTTNG_RING_BUFFER_BACKEND:
2943 return 0;
2944 case LTTNG_RING_BUFFER_ITER:
2945 return 0;
2946 case LTTNG_CONTEXT_PERF_COUNTERS:
2947 return 0;
2948 default:
2949 return -EINVAL;
2950 }
2951}
2952
2953static int __init lttng_init_cpu_hotplug(void)
2954{
2955 int ret;
2956
2957 ret = cpuhp_setup_state_multi(CPUHP_BP_PREPARE_DYN, "lttng:prepare",
2958 lttng_hotplug_prepare,
2959 lttng_hotplug_dead);
2960 if (ret < 0) {
2961 return ret;
2962 }
2963 lttng_hp_prepare = ret;
2964 lttng_rb_set_hp_prepare(ret);
2965
2966 ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "lttng:online",
2967 lttng_hotplug_online,
2968 lttng_hotplug_offline);
2969 if (ret < 0) {
2970 cpuhp_remove_multi_state(lttng_hp_prepare);
2971 lttng_hp_prepare = 0;
2972 return ret;
2973 }
2974 lttng_hp_online = ret;
2975 lttng_rb_set_hp_online(ret);
2976
2977 return 0;
2978}
2979
2980static void __exit lttng_exit_cpu_hotplug(void)
2981{
2982 lttng_rb_set_hp_online(0);
2983 cpuhp_remove_multi_state(lttng_hp_online);
2984 lttng_rb_set_hp_prepare(0);
2985 cpuhp_remove_multi_state(lttng_hp_prepare);
2986}
2987
b78104db 2988#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
1e367326
MD
2989static int lttng_init_cpu_hotplug(void)
2990{
2991 return 0;
2992}
2993static void lttng_exit_cpu_hotplug(void)
2994{
2995}
b78104db 2996#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
1e367326
MD
2997
2998
a90917c3 2999static int __init lttng_events_init(void)
4e3c1b9b 3000{
1c25284c
MD
3001 int ret;
3002
453b2495
JD
3003 ret = wrapper_lttng_fixup_sig(THIS_MODULE);
3004 if (ret)
3005 return ret;
389d7070 3006 ret = wrapper_get_pfnblock_flags_mask_init();
36561775
MD
3007 if (ret)
3008 return ret;
3009 ret = wrapper_get_pageblock_flags_mask_init();
114667d5
MD
3010 if (ret)
3011 return ret;
3012 ret = lttng_probes_init();
389d7070
MD
3013 if (ret)
3014 return ret;
07dfc1d0 3015 ret = lttng_context_init();
20591cf7
MD
3016 if (ret)
3017 return ret;
07dfc1d0
MD
3018 ret = lttng_tracepoint_init();
3019 if (ret)
3020 goto error_tp;
a90917c3 3021 event_cache = KMEM_CACHE(lttng_event, 0);
20591cf7
MD
3022 if (!event_cache) {
3023 ret = -ENOMEM;
3024 goto error_kmem;
3025 }
80996790 3026 ret = lttng_abi_init();
02119ee5
MD
3027 if (ret)
3028 goto error_abi;
0c956676
MD
3029 ret = lttng_logger_init();
3030 if (ret)
3031 goto error_logger;
1e367326
MD
3032 ret = lttng_init_cpu_hotplug();
3033 if (ret)
3034 goto error_hotplug;
101215b7 3035 printk(KERN_NOTICE "LTTng: Loaded modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
3036 __stringify(LTTNG_MODULES_MAJOR_VERSION),
3037 __stringify(LTTNG_MODULES_MINOR_VERSION),
3038 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
3039 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
3040 LTTNG_VERSION_NAME,
3041#ifdef LTTNG_EXTRA_VERSION_GIT
3042 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
3043#else
3044 "",
3045#endif
3046#ifdef LTTNG_EXTRA_VERSION_NAME
3047 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
3048#else
3049 "");
3050#endif
4e3c1b9b 3051 return 0;
0c956676 3052
1e367326
MD
3053error_hotplug:
3054 lttng_logger_exit();
0c956676
MD
3055error_logger:
3056 lttng_abi_exit();
02119ee5 3057error_abi:
1c25284c 3058 kmem_cache_destroy(event_cache);
20591cf7
MD
3059error_kmem:
3060 lttng_tracepoint_exit();
07dfc1d0
MD
3061error_tp:
3062 lttng_context_exit();
101215b7 3063 printk(KERN_NOTICE "LTTng: Failed to load modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
3064 __stringify(LTTNG_MODULES_MAJOR_VERSION),
3065 __stringify(LTTNG_MODULES_MINOR_VERSION),
3066 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
3067 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
3068 LTTNG_VERSION_NAME,
3069#ifdef LTTNG_EXTRA_VERSION_GIT
3070 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
3071#else
3072 "",
3073#endif
3074#ifdef LTTNG_EXTRA_VERSION_NAME
3075 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
3076#else
3077 "");
3078#endif
1c25284c 3079 return ret;
4e3c1b9b
MD
3080}
3081
a90917c3 3082module_init(lttng_events_init);
11b5a3c2 3083
a90917c3 3084static void __exit lttng_events_exit(void)
4e3c1b9b 3085{
a90917c3 3086 struct lttng_session *session, *tmpsession;
92e94819 3087
1e367326 3088 lttng_exit_cpu_hotplug();
0c956676 3089 lttng_logger_exit();
80996790 3090 lttng_abi_exit();
92e94819 3091 list_for_each_entry_safe(session, tmpsession, &sessions, list)
a90917c3 3092 lttng_session_destroy(session);
11b5a3c2 3093 kmem_cache_destroy(event_cache);
20591cf7 3094 lttng_tracepoint_exit();
07dfc1d0 3095 lttng_context_exit();
101215b7 3096 printk(KERN_NOTICE "LTTng: Unloaded modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
3097 __stringify(LTTNG_MODULES_MAJOR_VERSION),
3098 __stringify(LTTNG_MODULES_MINOR_VERSION),
3099 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
3100 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
3101 LTTNG_VERSION_NAME,
3102#ifdef LTTNG_EXTRA_VERSION_GIT
3103 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
3104#else
3105 "",
3106#endif
3107#ifdef LTTNG_EXTRA_VERSION_NAME
3108 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
3109#else
3110 "");
3111#endif
4e3c1b9b 3112}
92e94819 3113
a90917c3 3114module_exit(lttng_events_exit);
11b5a3c2 3115
101215b7
MJ
3116#include "extra_version/patches.i"
3117#ifdef LTTNG_EXTRA_VERSION_GIT
3118MODULE_INFO(extra_version_git, LTTNG_EXTRA_VERSION_GIT);
3119#endif
3120#ifdef LTTNG_EXTRA_VERSION_NAME
3121MODULE_INFO(extra_version_name, LTTNG_EXTRA_VERSION_NAME);
3122#endif
92e94819
MD
3123MODULE_LICENSE("GPL and additional rights");
3124MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
1c124020 3125MODULE_DESCRIPTION("LTTng tracer");
9a9973ef
MD
3126MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
3127 __stringify(LTTNG_MODULES_MINOR_VERSION) "."
309370e2
MD
3128 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
3129 LTTNG_MODULES_EXTRAVERSION);
This page took 0.209559 seconds and 4 git commands to generate.