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