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