Fix: compat layer only on supported architectures
[lttng-modules.git] / lttng-events.c
CommitLineData
4e3c1b9b 1/*
a90917c3 2 * lttng-events.c
4e3c1b9b 3 *
4e3c1b9b 4 * Holds LTTng per-session event registry.
17baffe2 5 *
886d51a3
MD
6 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; only
11 * version 2.1 of the License.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4e3c1b9b
MD
21 */
22
23#include <linux/module.h>
c0e31d2e
MD
24#include <linux/list.h>
25#include <linux/mutex.h>
26#include <linux/sched.h>
11b5a3c2 27#include <linux/slab.h>
c099397a 28#include <linux/jiffies.h>
99dc9597 29#include <linux/utsname.h>
a864fb02 30#include "wrapper/uuid.h"
b13f3ebe 31#include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
a82c63f1 32#include "wrapper/random.h"
3a523f5b 33#include "wrapper/tracepoint.h"
a90917c3
MD
34#include "lttng-events.h"
35#include "lttng-tracer.h"
4e3c1b9b
MD
36
37static LIST_HEAD(sessions);
a90917c3 38static LIST_HEAD(lttng_transport_list);
4e3c1b9b
MD
39static DEFINE_MUTEX(sessions_mutex);
40static struct kmem_cache *event_cache;
41
a90917c3
MD
42static void _lttng_event_destroy(struct lttng_event *event);
43static void _lttng_channel_destroy(struct lttng_channel *chan);
44static int _lttng_event_unregister(struct lttng_event *event);
c099397a 45static
a90917c3
MD
46int _lttng_event_metadata_statedump(struct lttng_session *session,
47 struct lttng_channel *chan,
48 struct lttng_event *event);
c099397a 49static
a90917c3 50int _lttng_session_metadata_statedump(struct lttng_session *session);
c099397a 51
c099397a 52void synchronize_trace(void)
abcca994
MD
53{
54 synchronize_sched();
55#ifdef CONFIG_PREEMPT_RT
56 synchronize_rcu();
57#endif
58}
59
a90917c3 60struct lttng_session *lttng_session_create(void)
4e3c1b9b 61{
a90917c3 62 struct lttng_session *session;
4e3c1b9b
MD
63
64 mutex_lock(&sessions_mutex);
a90917c3 65 session = kzalloc(sizeof(struct lttng_session), GFP_KERNEL);
4e3c1b9b
MD
66 if (!session)
67 return NULL;
4e3c1b9b 68 INIT_LIST_HEAD(&session->chan);
f3d01b96 69 INIT_LIST_HEAD(&session->events);
d793d5e1 70 uuid_le_gen(&session->uuid);
4e3c1b9b
MD
71 list_add(&session->list, &sessions);
72 mutex_unlock(&sessions_mutex);
73 return session;
4e3c1b9b
MD
74}
75
a90917c3 76void lttng_session_destroy(struct lttng_session *session)
4e3c1b9b 77{
a90917c3
MD
78 struct lttng_channel *chan, *tmpchan;
79 struct lttng_event *event, *tmpevent;
dda6a249 80 int ret;
4e3c1b9b
MD
81
82 mutex_lock(&sessions_mutex);
52fc2e1f 83 ACCESS_ONCE(session->active) = 0;
1ec65de1
MD
84 list_for_each_entry(chan, &session->chan, list) {
85 ret = lttng_syscalls_unregister(chan);
86 WARN_ON(ret);
87 }
dda6a249 88 list_for_each_entry(event, &session->events, list) {
a90917c3 89 ret = _lttng_event_unregister(event);
dda6a249
MD
90 WARN_ON(ret);
91 }
abcca994 92 synchronize_trace(); /* Wait for in-flight events to complete */
4e3c1b9b 93 list_for_each_entry_safe(event, tmpevent, &session->events, list)
a90917c3 94 _lttng_event_destroy(event);
4e3c1b9b 95 list_for_each_entry_safe(chan, tmpchan, &session->chan, list)
a90917c3 96 _lttng_channel_destroy(chan);
4e3c1b9b
MD
97 list_del(&session->list);
98 mutex_unlock(&sessions_mutex);
99 kfree(session);
100}
101
a90917c3 102int lttng_session_enable(struct lttng_session *session)
c0e31d2e
MD
103{
104 int ret = 0;
a90917c3 105 struct lttng_channel *chan;
c0e31d2e
MD
106
107 mutex_lock(&sessions_mutex);
108 if (session->active) {
109 ret = -EBUSY;
110 goto end;
111 }
c099397a
MD
112
113 /*
114 * Snapshot the number of events per channel to know the type of header
115 * we need to use.
116 */
117 list_for_each_entry(chan, &session->chan, list) {
118 if (chan->header_type)
119 continue; /* don't change it if session stop/restart */
120 if (chan->free_event_id < 31)
121 chan->header_type = 1; /* compact */
122 else
123 chan->header_type = 2; /* large */
124 }
125
52fc2e1f 126 ACCESS_ONCE(session->active) = 1;
8070f5c0 127 ACCESS_ONCE(session->been_active) = 1;
a90917c3 128 ret = _lttng_session_metadata_statedump(session);
c337ddc2
MD
129 if (ret) {
130 ACCESS_ONCE(session->active) = 0;
131 goto end;
132 }
133 ret = lttng_statedump_start(session);
360f38ea 134 if (ret)
c099397a 135 ACCESS_ONCE(session->active) = 0;
c0e31d2e
MD
136end:
137 mutex_unlock(&sessions_mutex);
11b5a3c2 138 return ret;
c0e31d2e
MD
139}
140
a90917c3 141int lttng_session_disable(struct lttng_session *session)
c0e31d2e
MD
142{
143 int ret = 0;
144
145 mutex_lock(&sessions_mutex);
146 if (!session->active) {
147 ret = -EBUSY;
148 goto end;
149 }
52fc2e1f 150 ACCESS_ONCE(session->active) = 0;
c0e31d2e
MD
151end:
152 mutex_unlock(&sessions_mutex);
11b5a3c2 153 return ret;
c0e31d2e
MD
154}
155
a90917c3 156int lttng_channel_enable(struct lttng_channel *channel)
e64957da
MD
157{
158 int old;
159
c6485006
MD
160 if (channel == channel->session->metadata)
161 return -EPERM;
e64957da
MD
162 old = xchg(&channel->enabled, 1);
163 if (old)
164 return -EEXIST;
165 return 0;
166}
167
a90917c3 168int lttng_channel_disable(struct lttng_channel *channel)
e64957da
MD
169{
170 int old;
171
c6485006
MD
172 if (channel == channel->session->metadata)
173 return -EPERM;
e64957da
MD
174 old = xchg(&channel->enabled, 0);
175 if (!old)
176 return -EEXIST;
177 return 0;
178}
179
a90917c3 180int lttng_event_enable(struct lttng_event *event)
e64957da
MD
181{
182 int old;
183
c6485006
MD
184 if (event->chan == event->chan->session->metadata)
185 return -EPERM;
e64957da
MD
186 old = xchg(&event->enabled, 1);
187 if (old)
188 return -EEXIST;
189 return 0;
190}
191
a90917c3 192int lttng_event_disable(struct lttng_event *event)
e64957da
MD
193{
194 int old;
195
c6485006
MD
196 if (event->chan == event->chan->session->metadata)
197 return -EPERM;
e64957da
MD
198 old = xchg(&event->enabled, 0);
199 if (!old)
200 return -EEXIST;
201 return 0;
202}
203
a90917c3 204static struct lttng_transport *lttng_transport_find(const char *name)
f3d01b96 205{
a90917c3 206 struct lttng_transport *transport;
f3d01b96 207
a90917c3 208 list_for_each_entry(transport, &lttng_transport_list, node) {
f3d01b96
MD
209 if (!strcmp(transport->name, name))
210 return transport;
211 }
212 return NULL;
213}
214
a90917c3 215struct lttng_channel *lttng_channel_create(struct lttng_session *session,
5dbbdb43
MD
216 const char *transport_name,
217 void *buf_addr,
4e3c1b9b
MD
218 size_t subbuf_size, size_t num_subbuf,
219 unsigned int switch_timer_interval,
220 unsigned int read_timer_interval)
221{
a90917c3
MD
222 struct lttng_channel *chan;
223 struct lttng_transport *transport = NULL;
4e3c1b9b
MD
224
225 mutex_lock(&sessions_mutex);
8070f5c0 226 if (session->been_active)
e5382b6d 227 goto active; /* Refuse to add channel to active session */
a90917c3 228 transport = lttng_transport_find(transport_name);
f3d01b96
MD
229 if (!transport) {
230 printk(KERN_WARNING "LTTng transport %s not found\n",
231 transport_name);
c0e31d2e 232 goto notransport;
f3d01b96 233 }
a33c9927
MD
234 if (!try_module_get(transport->owner)) {
235 printk(KERN_WARNING "LTT : Can't lock transport module.\n");
236 goto notransport;
237 }
a90917c3 238 chan = kzalloc(sizeof(struct lttng_channel), GFP_KERNEL);
4e3c1b9b 239 if (!chan)
c0e31d2e 240 goto nomem;
4e3c1b9b 241 chan->session = session;
05d32c64 242 chan->id = session->free_chan_id++;
125b4df4
MD
243 /*
244 * Note: the channel creation op already writes into the packet
245 * headers. Therefore the "chan" information used as input
246 * should be already accessible.
247 */
5f5ddf01
MD
248 chan->chan = transport->ops.channel_create(transport_name,
249 chan, buf_addr, subbuf_size, num_subbuf,
250 switch_timer_interval, read_timer_interval);
f3d01b96
MD
251 if (!chan->chan)
252 goto create_error;
e64957da 253 chan->enabled = 1;
11b5a3c2 254 chan->ops = &transport->ops;
a33c9927 255 chan->transport = transport;
4e3c1b9b
MD
256 list_add(&chan->list, &session->chan);
257 mutex_unlock(&sessions_mutex);
258 return chan;
259
f3d01b96
MD
260create_error:
261 kfree(chan);
c0e31d2e 262nomem:
a33c9927
MD
263 if (transport)
264 module_put(transport->owner);
c0e31d2e 265notransport:
e5382b6d 266active:
4e3c1b9b
MD
267 mutex_unlock(&sessions_mutex);
268 return NULL;
269}
270
271/*
272 * Only used internally at session destruction.
273 */
aa7c23a9 274static
a90917c3 275void _lttng_channel_destroy(struct lttng_channel *chan)
4e3c1b9b 276{
11b5a3c2 277 chan->ops->channel_destroy(chan->chan);
a33c9927 278 module_put(chan->transport->owner);
4e3c1b9b 279 list_del(&chan->list);
8070f5c0 280 lttng_destroy_context(chan->ctx);
4e3c1b9b
MD
281 kfree(chan);
282}
283
e5382b6d
MD
284/*
285 * Supports event creation while tracing session is active.
286 */
a90917c3 287struct lttng_event *lttng_event_create(struct lttng_channel *chan,
d6d808f3 288 struct lttng_kernel_event *event_param,
259b6cb3
MD
289 void *filter,
290 const struct lttng_event_desc *internal_desc)
4e3c1b9b 291{
a90917c3 292 struct lttng_event *event;
3d084699 293 int ret;
4e3c1b9b
MD
294
295 mutex_lock(&sessions_mutex);
37303c75 296 if (chan->free_event_id == -1U)
e5382b6d 297 goto full;
4e3c1b9b 298 /*
dda6a249
MD
299 * This is O(n^2) (for each event, the loop is called at event
300 * creation). Might require a hash if we have lots of events.
4e3c1b9b
MD
301 */
302 list_for_each_entry(event, &chan->session->events, list)
30bdb6e4 303 if (!strcmp(event->desc->name, event_param->name))
4e3c1b9b 304 goto exist;
11b5a3c2 305 event = kmem_cache_zalloc(event_cache, GFP_KERNEL);
4e3c1b9b
MD
306 if (!event)
307 goto cache_error;
4e3c1b9b
MD
308 event->chan = chan;
309 event->filter = filter;
e5382b6d 310 event->id = chan->free_event_id++;
e64957da 311 event->enabled = 1;
d6d808f3 312 event->instrumentation = event_param->instrumentation;
a90917c3 313 /* Populate lttng_event structure before tracepoint registration. */
e5382b6d 314 smp_wmb();
d6d808f3 315 switch (event_param->instrumentation) {
ab2277d6 316 case LTTNG_KERNEL_TRACEPOINT:
a90917c3 317 event->desc = lttng_event_get(event_param->name);
d3dbe23c
MD
318 if (!event->desc)
319 goto register_error;
3a523f5b 320 ret = kabi_2635_tracepoint_probe_register(event_param->name,
d3dbe23c
MD
321 event->desc->probe_callback,
322 event);
11b5a3c2
MD
323 if (ret)
324 goto register_error;
baf20995 325 break;
ab2277d6 326 case LTTNG_KERNEL_KPROBE:
30bdb6e4 327 ret = lttng_kprobes_register(event_param->name,
f17701fb
MD
328 event_param->u.kprobe.symbol_name,
329 event_param->u.kprobe.offset,
330 event_param->u.kprobe.addr,
331 event);
332 if (ret)
d6d808f3 333 goto register_error;
edeb3137
MD
334 ret = try_module_get(event->desc->owner);
335 WARN_ON_ONCE(!ret);
d6d808f3 336 break;
7371f44c
MD
337 case LTTNG_KERNEL_KRETPROBE:
338 {
a90917c3 339 struct lttng_event *event_return;
7371f44c
MD
340
341 /* kretprobe defines 2 events */
342 event_return =
343 kmem_cache_zalloc(event_cache, GFP_KERNEL);
344 if (!event_return)
345 goto register_error;
346 event_return->chan = chan;
347 event_return->filter = filter;
348 event_return->id = chan->free_event_id++;
349 event_return->enabled = 1;
350 event_return->instrumentation = event_param->instrumentation;
351 /*
a90917c3 352 * Populate lttng_event structure before kretprobe registration.
7371f44c
MD
353 */
354 smp_wmb();
355 ret = lttng_kretprobes_register(event_param->name,
356 event_param->u.kretprobe.symbol_name,
357 event_param->u.kretprobe.offset,
358 event_param->u.kretprobe.addr,
359 event, event_return);
360 if (ret) {
361 kmem_cache_free(event_cache, event_return);
362 goto register_error;
363 }
364 /* Take 2 refs on the module: one per event. */
365 ret = try_module_get(event->desc->owner);
366 WARN_ON_ONCE(!ret);
367 ret = try_module_get(event->desc->owner);
368 WARN_ON_ONCE(!ret);
a90917c3 369 ret = _lttng_event_metadata_statedump(chan->session, chan,
7371f44c
MD
370 event_return);
371 if (ret) {
372 kmem_cache_free(event_cache, event_return);
373 module_put(event->desc->owner);
374 module_put(event->desc->owner);
375 goto statedump_error;
376 }
377 list_add(&event_return->list, &chan->session->events);
378 break;
379 }
ab2277d6 380 case LTTNG_KERNEL_FUNCTION:
30bdb6e4 381 ret = lttng_ftrace_register(event_param->name,
e0a7a7c4
MD
382 event_param->u.ftrace.symbol_name,
383 event);
384 if (ret)
385 goto register_error;
edeb3137
MD
386 ret = try_module_get(event->desc->owner);
387 WARN_ON_ONCE(!ret);
e0a7a7c4 388 break;
1ec65de1 389 case LTTNG_KERNEL_NOOP:
259b6cb3
MD
390 event->desc = internal_desc;
391 if (!event->desc)
392 goto register_error;
1ec65de1 393 break;
baf20995
MD
394 default:
395 WARN_ON_ONCE(1);
396 }
a90917c3 397 ret = _lttng_event_metadata_statedump(chan->session, chan, event);
c099397a
MD
398 if (ret)
399 goto statedump_error;
dda6a249 400 list_add(&event->list, &chan->session->events);
11b5a3c2 401 mutex_unlock(&sessions_mutex);
4e3c1b9b
MD
402 return event;
403
c099397a 404statedump_error:
259b6cb3 405 /* If a statedump error occurs, events will not be readable. */
11b5a3c2 406register_error:
11b5a3c2 407 kmem_cache_free(event_cache, event);
4e3c1b9b
MD
408cache_error:
409exist:
e5382b6d 410full:
4e3c1b9b
MD
411 mutex_unlock(&sessions_mutex);
412 return NULL;
413}
414
415/*
416 * Only used internally at session destruction.
417 */
a90917c3 418int _lttng_event_unregister(struct lttng_event *event)
4e3c1b9b 419{
11b5a3c2
MD
420 int ret = -EINVAL;
421
38d024ae 422 switch (event->instrumentation) {
ab2277d6 423 case LTTNG_KERNEL_TRACEPOINT:
3a523f5b 424 ret = kabi_2635_tracepoint_probe_unregister(event->desc->name,
85a9ca7f 425 event->desc->probe_callback,
11b5a3c2
MD
426 event);
427 if (ret)
428 return ret;
baf20995 429 break;
ab2277d6 430 case LTTNG_KERNEL_KPROBE:
f17701fb 431 lttng_kprobes_unregister(event);
d6d808f3
MD
432 ret = 0;
433 break;
7371f44c
MD
434 case LTTNG_KERNEL_KRETPROBE:
435 lttng_kretprobes_unregister(event);
436 ret = 0;
437 break;
ab2277d6 438 case LTTNG_KERNEL_FUNCTION:
e0a7a7c4
MD
439 lttng_ftrace_unregister(event);
440 ret = 0;
441 break;
259b6cb3
MD
442 case LTTNG_KERNEL_NOOP:
443 ret = 0;
444 break;
baf20995
MD
445 default:
446 WARN_ON_ONCE(1);
447 }
dda6a249
MD
448 return ret;
449}
450
451/*
452 * Only used internally at session destruction.
453 */
be066e6c 454static
a90917c3 455void _lttng_event_destroy(struct lttng_event *event)
dda6a249 456{
edeb3137
MD
457 switch (event->instrumentation) {
458 case LTTNG_KERNEL_TRACEPOINT:
a90917c3 459 lttng_event_put(event->desc);
edeb3137
MD
460 break;
461 case LTTNG_KERNEL_KPROBE:
462 module_put(event->desc->owner);
463 lttng_kprobes_destroy_private(event);
464 break;
7371f44c
MD
465 case LTTNG_KERNEL_KRETPROBE:
466 module_put(event->desc->owner);
467 lttng_kretprobes_destroy_private(event);
468 break;
edeb3137
MD
469 case LTTNG_KERNEL_FUNCTION:
470 module_put(event->desc->owner);
471 lttng_ftrace_destroy_private(event);
472 break;
259b6cb3
MD
473 case LTTNG_KERNEL_NOOP:
474 break;
edeb3137
MD
475 default:
476 WARN_ON_ONCE(1);
477 }
dda6a249 478 list_del(&event->list);
8070f5c0 479 lttng_destroy_context(event->ctx);
11b5a3c2 480 kmem_cache_free(event_cache, event);
4e3c1b9b
MD
481}
482
1ec3f75a
MD
483/*
484 * We have exclusive access to our metadata buffer (protected by the
485 * sessions_mutex), so we can do racy operations such as looking for
486 * remaining space left in packet and write, since mutual exclusion
487 * protects us from concurrent writes.
488 */
a90917c3 489int lttng_metadata_printf(struct lttng_session *session,
c099397a
MD
490 const char *fmt, ...)
491{
492 struct lib_ring_buffer_ctx ctx;
a90917c3 493 struct lttng_channel *chan = session->metadata;
c099397a
MD
494 char *str;
495 int ret = 0, waitret;
1ec3f75a 496 size_t len, reserve_len, pos;
c099397a
MD
497 va_list ap;
498
499 WARN_ON_ONCE(!ACCESS_ONCE(session->active));
500
501 va_start(ap, fmt);
502 str = kvasprintf(GFP_KERNEL, fmt, ap);
503 va_end(ap);
504 if (!str)
505 return -ENOMEM;
506
1ec3f75a
MD
507 len = strlen(str);
508 pos = 0;
509
510 for (pos = 0; pos < len; pos += reserve_len) {
511 reserve_len = min_t(size_t,
512 chan->ops->packet_avail_size(chan->chan),
513 len - pos);
514 lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len,
515 sizeof(char), -1);
516 /*
517 * We don't care about metadata buffer's records lost
518 * count, because we always retry here. Report error if
519 * we need to bail out after timeout or being
520 * interrupted.
521 */
71c1d843 522 waitret = wait_event_interruptible_timeout(*chan->ops->get_writer_buf_wait_queue(chan->chan, -1),
1ec3f75a 523 ({
4e1f08f4 524 ret = chan->ops->event_reserve(&ctx, 0);
1ec3f75a
MD
525 ret != -ENOBUFS || !ret;
526 }),
527 msecs_to_jiffies(LTTNG_METADATA_TIMEOUT_MSEC));
528 if (!waitret || waitret == -ERESTARTSYS || ret) {
529 printk(KERN_WARNING "LTTng: Failure to write metadata to buffers (%s)\n",
530 waitret == -ERESTARTSYS ? "interrupted" :
531 (ret == -ENOBUFS ? "timeout" : "I/O error"));
532 if (waitret == -ERESTARTSYS)
533 ret = waitret;
534 goto end;
535 }
f5cf8eff 536 chan->ops->event_write(&ctx, &str[pos], reserve_len);
1ec3f75a 537 chan->ops->event_commit(&ctx);
c099397a 538 }
c099397a
MD
539end:
540 kfree(str);
541 return ret;
542}
543
544static
a90917c3 545int _lttng_field_statedump(struct lttng_session *session,
8070f5c0 546 const struct lttng_event_field *field)
c099397a 547{
c099397a 548 int ret = 0;
c099397a 549
8070f5c0
MD
550 switch (field->type.atype) {
551 case atype_integer:
552 ret = lttng_metadata_printf(session,
244465ab 553 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s;\n",
8070f5c0
MD
554 field->type.u.basic.integer.size,
555 field->type.u.basic.integer.alignment,
556 field->type.u.basic.integer.signedness,
557 (field->type.u.basic.integer.encoding == lttng_encode_none)
558 ? "none"
559 : (field->type.u.basic.integer.encoding == lttng_encode_UTF8)
560 ? "UTF8"
561 : "ASCII",
562 field->type.u.basic.integer.base,
c099397a 563#ifdef __BIG_ENDIAN
8070f5c0 564 field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
c099397a 565#else
8070f5c0 566 field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
c099397a 567#endif
8070f5c0
MD
568 field->name);
569 break;
570 case atype_enum:
571 ret = lttng_metadata_printf(session,
244465ab 572 " %s _%s;\n",
8070f5c0
MD
573 field->type.u.basic.enumeration.name,
574 field->name);
575 break;
576 case atype_array:
577 {
578 const struct lttng_basic_type *elem_type;
579
580 elem_type = &field->type.u.array.elem_type;
581 ret = lttng_metadata_printf(session,
244465ab 582 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
8070f5c0
MD
583 elem_type->u.basic.integer.size,
584 elem_type->u.basic.integer.alignment,
585 elem_type->u.basic.integer.signedness,
586 (elem_type->u.basic.integer.encoding == lttng_encode_none)
587 ? "none"
588 : (elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
589 ? "UTF8"
590 : "ASCII",
591 elem_type->u.basic.integer.base,
8fa75f34 592#ifdef __BIG_ENDIAN
8070f5c0 593 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
8fa75f34 594#else
8070f5c0 595 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
8fa75f34 596#endif
8070f5c0
MD
597 field->name, field->type.u.array.length);
598 break;
599 }
600 case atype_sequence:
601 {
602 const struct lttng_basic_type *elem_type;
603 const struct lttng_basic_type *length_type;
604
605 elem_type = &field->type.u.sequence.elem_type;
606 length_type = &field->type.u.sequence.length_type;
607 ret = lttng_metadata_printf(session,
608 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } __%s_length;\n",
8070f5c0 609 length_type->u.basic.integer.size,
32257272 610 (unsigned int) length_type->u.basic.integer.alignment,
8070f5c0
MD
611 length_type->u.basic.integer.signedness,
612 (length_type->u.basic.integer.encoding == lttng_encode_none)
613 ? "none"
0635cdd4 614 : ((length_type->u.basic.integer.encoding == lttng_encode_UTF8)
8070f5c0 615 ? "UTF8"
0635cdd4 616 : "ASCII"),
8070f5c0 617 length_type->u.basic.integer.base,
e0a7a7c4 618#ifdef __BIG_ENDIAN
8070f5c0 619 length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
e0a7a7c4 620#else
0635cdd4 621 length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
e0a7a7c4 622#endif
27d2368e
MD
623 field->name);
624 if (ret)
625 return ret;
626
627 ret = lttng_metadata_printf(session,
244465ab 628 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
8070f5c0 629 elem_type->u.basic.integer.size,
32257272 630 (unsigned int) elem_type->u.basic.integer.alignment,
8070f5c0
MD
631 elem_type->u.basic.integer.signedness,
632 (elem_type->u.basic.integer.encoding == lttng_encode_none)
633 ? "none"
0635cdd4 634 : ((elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
8070f5c0 635 ? "UTF8"
0635cdd4 636 : "ASCII"),
8070f5c0 637 elem_type->u.basic.integer.base,
8fa75f34 638#ifdef __BIG_ENDIAN
8070f5c0 639 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
8fa75f34 640#else
8070f5c0 641 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
8fa75f34 642#endif
8070f5c0 643 field->name,
27d2368e 644 field->name);
8070f5c0
MD
645 break;
646 }
c099397a 647
8070f5c0
MD
648 case atype_string:
649 /* Default encoding is UTF8 */
650 ret = lttng_metadata_printf(session,
244465ab 651 " string%s _%s;\n",
8070f5c0
MD
652 field->type.u.basic.string.encoding == lttng_encode_ASCII ?
653 " { encoding = ASCII; }" : "",
654 field->name);
655 break;
656 default:
657 WARN_ON_ONCE(1);
658 return -EINVAL;
659 }
660 return ret;
661}
662
663static
a90917c3 664int _lttng_context_metadata_statedump(struct lttng_session *session,
8070f5c0
MD
665 struct lttng_ctx *ctx)
666{
667 int ret = 0;
668 int i;
669
670 if (!ctx)
671 return 0;
672 for (i = 0; i < ctx->nr_fields; i++) {
673 const struct lttng_ctx_field *field = &ctx->fields[i];
674
a90917c3 675 ret = _lttng_field_statedump(session, &field->event_field);
8070f5c0
MD
676 if (ret)
677 return ret;
678 }
679 return ret;
680}
681
682static
a90917c3
MD
683int _lttng_fields_metadata_statedump(struct lttng_session *session,
684 struct lttng_event *event)
8070f5c0
MD
685{
686 const struct lttng_event_desc *desc = event->desc;
687 int ret = 0;
688 int i;
689
690 for (i = 0; i < desc->nr_fields; i++) {
691 const struct lttng_event_field *field = &desc->fields[i];
692
a90917c3 693 ret = _lttng_field_statedump(session, field);
8070f5c0
MD
694 if (ret)
695 return ret;
c099397a
MD
696 }
697 return ret;
698}
699
700static
a90917c3
MD
701int _lttng_event_metadata_statedump(struct lttng_session *session,
702 struct lttng_channel *chan,
703 struct lttng_event *event)
c099397a
MD
704{
705 int ret = 0;
706
707 if (event->metadata_dumped || !ACCESS_ONCE(session->active))
708 return 0;
709 if (chan == session->metadata)
710 return 0;
711
712 ret = lttng_metadata_printf(session,
713 "event {\n"
714 " name = %s;\n"
715 " id = %u;\n"
b9074a1b 716 " stream_id = %u;\n",
c099397a
MD
717 event->desc->name,
718 event->id,
719 event->chan->id);
720 if (ret)
721 goto end;
722
b9074a1b
MD
723 if (event->ctx) {
724 ret = lttng_metadata_printf(session,
725 " context := struct {\n");
726 if (ret)
727 goto end;
728 }
a90917c3 729 ret = _lttng_context_metadata_statedump(session, event->ctx);
8070f5c0
MD
730 if (ret)
731 goto end;
b9074a1b
MD
732 if (event->ctx) {
733 ret = lttng_metadata_printf(session,
734 " };\n");
735 if (ret)
736 goto end;
737 }
8070f5c0
MD
738
739 ret = lttng_metadata_printf(session,
8070f5c0
MD
740 " fields := struct {\n"
741 );
742 if (ret)
743 goto end;
744
a90917c3 745 ret = _lttng_fields_metadata_statedump(session, event);
c099397a
MD
746 if (ret)
747 goto end;
748
749 /*
750 * LTTng space reservation can only reserve multiples of the
751 * byte size.
752 */
753 ret = lttng_metadata_printf(session,
9115fbdc
MD
754 " };\n"
755 "};\n\n");
c099397a
MD
756 if (ret)
757 goto end;
758
c099397a
MD
759 event->metadata_dumped = 1;
760end:
761 return ret;
762
763}
764
765static
a90917c3
MD
766int _lttng_channel_metadata_statedump(struct lttng_session *session,
767 struct lttng_channel *chan)
c099397a
MD
768{
769 int ret = 0;
770
771 if (chan->metadata_dumped || !ACCESS_ONCE(session->active))
772 return 0;
773 if (chan == session->metadata)
774 return 0;
775
776 WARN_ON_ONCE(!chan->header_type);
777 ret = lttng_metadata_printf(session,
778 "stream {\n"
779 " id = %u;\n"
9115fbdc 780 " event.header := %s;\n"
b9074a1b 781 " packet.context := struct packet_context;\n",
c099397a
MD
782 chan->id,
783 chan->header_type == 1 ? "struct event_header_compact" :
784 "struct event_header_large");
785 if (ret)
786 goto end;
787
b9074a1b
MD
788 if (chan->ctx) {
789 ret = lttng_metadata_printf(session,
790 " event.context := struct {\n");
791 if (ret)
792 goto end;
793 }
a90917c3 794 ret = _lttng_context_metadata_statedump(session, chan->ctx);
8070f5c0
MD
795 if (ret)
796 goto end;
b9074a1b
MD
797 if (chan->ctx) {
798 ret = lttng_metadata_printf(session,
799 " };\n");
800 if (ret)
801 goto end;
802 }
8070f5c0
MD
803
804 ret = lttng_metadata_printf(session,
b9074a1b 805 "};\n\n");
8070f5c0 806
c099397a
MD
807 chan->metadata_dumped = 1;
808end:
809 return ret;
810}
811
9115fbdc 812static
a90917c3 813int _lttng_stream_packet_context_declare(struct lttng_session *session)
9115fbdc
MD
814{
815 return lttng_metadata_printf(session,
816 "struct packet_context {\n"
a3ccff4f
MD
817 " uint64_clock_monotonic_t timestamp_begin;\n"
818 " uint64_clock_monotonic_t timestamp_end;\n"
a9afe705 819 " unsigned long events_discarded;\n"
9115fbdc
MD
820 " uint32_t content_size;\n"
821 " uint32_t packet_size;\n"
822 " uint32_t cpu_id;\n"
c6dfdf6f 823 "};\n\n"
9115fbdc
MD
824 );
825}
826
827/*
828 * Compact header:
829 * id: range: 0 - 30.
830 * id 31 is reserved to indicate an extended header.
831 *
832 * Large header:
833 * id: range: 0 - 65534.
834 * id 65535 is reserved to indicate an extended header.
835 */
836static
a90917c3 837int _lttng_event_header_declare(struct lttng_session *session)
9115fbdc
MD
838{
839 return lttng_metadata_printf(session,
840 "struct event_header_compact {\n"
841 " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
842 " variant <id> {\n"
843 " struct {\n"
a3ccff4f 844 " uint27_clock_monotonic_t timestamp;\n"
9115fbdc
MD
845 " } compact;\n"
846 " struct {\n"
847 " uint32_t id;\n"
a3ccff4f 848 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
849 " } extended;\n"
850 " } v;\n"
851 "} align(%u);\n"
852 "\n"
853 "struct event_header_large {\n"
854 " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
855 " variant <id> {\n"
856 " struct {\n"
a3ccff4f 857 " uint32_clock_monotonic_t timestamp;\n"
9115fbdc
MD
858 " } compact;\n"
859 " struct {\n"
860 " uint32_t id;\n"
a3ccff4f 861 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
862 " } extended;\n"
863 " } v;\n"
864 "} align(%u);\n\n",
a90917c3
MD
865 lttng_alignof(uint32_t) * CHAR_BIT,
866 lttng_alignof(uint16_t) * CHAR_BIT
9115fbdc
MD
867 );
868}
869
a3ccff4f
MD
870 /*
871 * Approximation of NTP time of day to clock monotonic correlation,
872 * taken at start of trace.
873 * Yes, this is only an approximation. Yes, we can (and will) do better
874 * in future versions.
875 */
876static
877uint64_t measure_clock_offset(void)
878{
879 uint64_t offset, monotonic[2], realtime;
880 struct timespec rts = { 0, 0 };
881 unsigned long flags;
882
883 /* Disable interrupts to increase correlation precision. */
884 local_irq_save(flags);
885 monotonic[0] = trace_clock_read64();
886 getnstimeofday(&rts);
887 monotonic[1] = trace_clock_read64();
888 local_irq_restore(flags);
889
890 offset = (monotonic[0] + monotonic[1]) >> 1;
57be518d 891 realtime = (uint64_t) rts.tv_sec * NSEC_PER_SEC;
a3ccff4f
MD
892 realtime += rts.tv_nsec;
893 offset = realtime - offset;
894 return offset;
895}
896
c099397a
MD
897/*
898 * Output metadata into this session's metadata buffers.
899 */
900static
a90917c3 901int _lttng_session_metadata_statedump(struct lttng_session *session)
c099397a 902{
30bdb6e4 903 unsigned char *uuid_c = session->uuid.b;
a82c63f1 904 unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN];
a90917c3
MD
905 struct lttng_channel *chan;
906 struct lttng_event *event;
c099397a
MD
907 int ret = 0;
908
909 if (!ACCESS_ONCE(session->active))
910 return 0;
911 if (session->metadata_dumped)
912 goto skip_session;
f40270ad 913 if (!session->metadata) {
cd4bd11f 914 printk(KERN_WARNING "LTTng: attempt to start tracing, but metadata channel is not found. Operation abort.\n");
f40270ad
MD
915 return -EPERM;
916 }
c099397a 917
d793d5e1 918 snprintf(uuid_s, sizeof(uuid_s),
30bdb6e4
MD
919 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
920 uuid_c[0], uuid_c[1], uuid_c[2], uuid_c[3],
921 uuid_c[4], uuid_c[5], uuid_c[6], uuid_c[7],
922 uuid_c[8], uuid_c[9], uuid_c[10], uuid_c[11],
923 uuid_c[12], uuid_c[13], uuid_c[14], uuid_c[15]);
d793d5e1
MD
924
925 ret = lttng_metadata_printf(session,
9115fbdc
MD
926 "typealias integer { size = 8; align = %u; signed = false; } := uint8_t;\n"
927 "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n"
928 "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n"
929 "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n"
a9afe705 930 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
9115fbdc
MD
931 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
932 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
d793d5e1
MD
933 "\n"
934 "trace {\n"
935 " major = %u;\n"
936 " minor = %u;\n"
30bdb6e4 937 " uuid = \"%s\";\n"
d793d5e1
MD
938 " byte_order = %s;\n"
939 " packet.header := struct {\n"
940 " uint32_t magic;\n"
1ec3f75a 941 " uint8_t uuid[16];\n"
d793d5e1 942 " uint32_t stream_id;\n"
0eb25f58 943 " };\n"
d793d5e1 944 "};\n\n",
a90917c3
MD
945 lttng_alignof(uint8_t) * CHAR_BIT,
946 lttng_alignof(uint16_t) * CHAR_BIT,
947 lttng_alignof(uint32_t) * CHAR_BIT,
948 lttng_alignof(uint64_t) * CHAR_BIT,
a9afe705
MD
949 sizeof(unsigned long) * CHAR_BIT,
950 lttng_alignof(unsigned long) * CHAR_BIT,
c6c9e10f
MD
951 CTF_SPEC_MAJOR,
952 CTF_SPEC_MINOR,
d793d5e1
MD
953 uuid_s,
954#ifdef __BIG_ENDIAN
955 "be"
956#else
957 "le"
958#endif
959 );
960 if (ret)
961 goto end;
962
99dc9597
MD
963 ret = lttng_metadata_printf(session,
964 "env {\n"
a6058143 965 " hostname = \"%s\";\n"
c6c9e10f 966 " domain = \"kernel\";\n"
99dc9597 967 " sysname = \"%s\";\n"
c6c9e10f
MD
968 " kernel_release = \"%s\";\n"
969 " kernel_version = \"%s\";\n"
970 " tracer_name = \"lttng-modules\";\n"
971 " tracer_major = %d;\n"
972 " tracer_minor = %d;\n"
973 " tracer_patchlevel = %d;\n"
99dc9597 974 "};\n\n",
3d0d43db 975 current->nsproxy->uts_ns->name.nodename,
99dc9597
MD
976 utsname()->sysname,
977 utsname()->release,
c6c9e10f
MD
978 utsname()->version,
979 LTTNG_MODULES_MAJOR_VERSION,
980 LTTNG_MODULES_MINOR_VERSION,
981 LTTNG_MODULES_PATCHLEVEL_VERSION
99dc9597
MD
982 );
983 if (ret)
984 goto end;
985
a3ccff4f
MD
986 ret = lttng_metadata_printf(session,
987 "clock {\n"
a82c63f1
MD
988 " name = %s;\n",
989 "monotonic"
990 );
991 if (ret)
992 goto end;
993
994 if (!trace_clock_uuid(clock_uuid_s)) {
995 ret = lttng_metadata_printf(session,
7c27cb17 996 " uuid = \"%s\";\n",
a82c63f1
MD
997 clock_uuid_s
998 );
999 if (ret)
1000 goto end;
1001 }
1002
1003 ret = lttng_metadata_printf(session,
a3ccff4f
MD
1004 " description = \"Monotonic Clock\";\n"
1005 " freq = %llu; /* Frequency, in Hz */\n"
1006 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
1007 " offset = %llu;\n"
1008 "};\n\n",
a3ccff4f
MD
1009 (unsigned long long) trace_clock_freq(),
1010 (unsigned long long) measure_clock_offset()
1011 );
1012 if (ret)
1013 goto end;
1014
1015 ret = lttng_metadata_printf(session,
1016 "typealias integer {\n"
1017 " size = 27; align = 1; signed = false;\n"
1018 " map = clock.monotonic.value;\n"
1019 "} := uint27_clock_monotonic_t;\n"
1020 "\n"
1021 "typealias integer {\n"
1022 " size = 32; align = %u; signed = false;\n"
1023 " map = clock.monotonic.value;\n"
1024 "} := uint32_clock_monotonic_t;\n"
1025 "\n"
1026 "typealias integer {\n"
1027 " size = 64; align = %u; signed = false;\n"
1028 " map = clock.monotonic.value;\n"
1029 "} := uint64_clock_monotonic_t;\n\n",
1030 lttng_alignof(uint32_t) * CHAR_BIT,
1031 lttng_alignof(uint64_t) * CHAR_BIT
1032 );
1033 if (ret)
1034 goto end;
1035
a90917c3 1036 ret = _lttng_stream_packet_context_declare(session);
9115fbdc
MD
1037 if (ret)
1038 goto end;
1039
a90917c3 1040 ret = _lttng_event_header_declare(session);
9115fbdc
MD
1041 if (ret)
1042 goto end;
1043
c099397a
MD
1044skip_session:
1045 list_for_each_entry(chan, &session->chan, list) {
a90917c3 1046 ret = _lttng_channel_metadata_statedump(session, chan);
c099397a
MD
1047 if (ret)
1048 goto end;
1049 }
1050
1051 list_for_each_entry(event, &session->events, list) {
a90917c3 1052 ret = _lttng_event_metadata_statedump(session, event->chan, event);
c099397a
MD
1053 if (ret)
1054 goto end;
1055 }
1056 session->metadata_dumped = 1;
1057end:
1058 return ret;
1059}
1060
c0e31d2e 1061/**
a90917c3 1062 * lttng_transport_register - LTT transport registration
c0e31d2e
MD
1063 * @transport: transport structure
1064 *
1065 * Registers a transport which can be used as output to extract the data out of
1066 * LTTng. The module calling this registration function must ensure that no
1067 * trap-inducing code will be executed by the transport functions. E.g.
1068 * vmalloc_sync_all() must be called between a vmalloc and the moment the memory
1069 * is made visible to the transport function. This registration acts as a
1070 * vmalloc_sync_all. Therefore, only if the module allocates virtual memory
1071 * after its registration must it synchronize the TLBs.
1072 */
a90917c3 1073void lttng_transport_register(struct lttng_transport *transport)
c0e31d2e
MD
1074{
1075 /*
1076 * Make sure no page fault can be triggered by the module about to be
1077 * registered. We deal with this here so we don't have to call
1078 * vmalloc_sync_all() in each module's init.
1079 */
6d2a620c 1080 wrapper_vmalloc_sync_all();
c0e31d2e
MD
1081
1082 mutex_lock(&sessions_mutex);
a90917c3 1083 list_add_tail(&transport->node, &lttng_transport_list);
c0e31d2e
MD
1084 mutex_unlock(&sessions_mutex);
1085}
a90917c3 1086EXPORT_SYMBOL_GPL(lttng_transport_register);
c0e31d2e
MD
1087
1088/**
a90917c3 1089 * lttng_transport_unregister - LTT transport unregistration
c0e31d2e
MD
1090 * @transport: transport structure
1091 */
a90917c3 1092void lttng_transport_unregister(struct lttng_transport *transport)
c0e31d2e
MD
1093{
1094 mutex_lock(&sessions_mutex);
1095 list_del(&transport->node);
1096 mutex_unlock(&sessions_mutex);
1097}
a90917c3 1098EXPORT_SYMBOL_GPL(lttng_transport_unregister);
c0e31d2e 1099
a90917c3 1100static int __init lttng_events_init(void)
4e3c1b9b 1101{
1c25284c
MD
1102 int ret;
1103
a90917c3 1104 event_cache = KMEM_CACHE(lttng_event, 0);
11b5a3c2 1105 if (!event_cache)
4e3c1b9b 1106 return -ENOMEM;
80996790 1107 ret = lttng_abi_init();
02119ee5
MD
1108 if (ret)
1109 goto error_abi;
4e3c1b9b 1110 return 0;
02119ee5 1111error_abi:
1c25284c
MD
1112 kmem_cache_destroy(event_cache);
1113 return ret;
4e3c1b9b
MD
1114}
1115
a90917c3 1116module_init(lttng_events_init);
11b5a3c2 1117
a90917c3 1118static void __exit lttng_events_exit(void)
4e3c1b9b 1119{
a90917c3 1120 struct lttng_session *session, *tmpsession;
92e94819 1121
80996790 1122 lttng_abi_exit();
92e94819 1123 list_for_each_entry_safe(session, tmpsession, &sessions, list)
a90917c3 1124 lttng_session_destroy(session);
11b5a3c2 1125 kmem_cache_destroy(event_cache);
4e3c1b9b 1126}
92e94819 1127
a90917c3 1128module_exit(lttng_events_exit);
11b5a3c2 1129
92e94819
MD
1130MODULE_LICENSE("GPL and additional rights");
1131MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
1132MODULE_DESCRIPTION("LTTng Events");
This page took 0.084825 seconds and 4 git commands to generate.