Support for linux kernels 2.6.32 through 2.6.37
[lttng-modules.git] / lttng-events.c
1 /*
2 * lttng-events.c
3 *
4 * Holds LTTng per-session event registry.
5 *
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
21 */
22
23 #include <linux/module.h>
24 #include <linux/list.h>
25 #include <linux/mutex.h>
26 #include <linux/sched.h>
27 #include <linux/slab.h>
28 #include <linux/jiffies.h>
29 #include <linux/utsname.h>
30 #include "wrapper/uuid.h"
31 #include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
32 #include "wrapper/random.h"
33 #include "wrapper/tracepoint.h"
34 #include "lttng-events.h"
35 #include "lttng-tracer.h"
36
37 static LIST_HEAD(sessions);
38 static LIST_HEAD(lttng_transport_list);
39 static DEFINE_MUTEX(sessions_mutex);
40 static struct kmem_cache *event_cache;
41
42 static void _lttng_event_destroy(struct lttng_event *event);
43 static void _lttng_channel_destroy(struct lttng_channel *chan);
44 static int _lttng_event_unregister(struct lttng_event *event);
45 static
46 int _lttng_event_metadata_statedump(struct lttng_session *session,
47 struct lttng_channel *chan,
48 struct lttng_event *event);
49 static
50 int _lttng_session_metadata_statedump(struct lttng_session *session);
51
52 void synchronize_trace(void)
53 {
54 synchronize_sched();
55 #ifdef CONFIG_PREEMPT_RT
56 synchronize_rcu();
57 #endif
58 }
59
60 struct lttng_session *lttng_session_create(void)
61 {
62 struct lttng_session *session;
63
64 mutex_lock(&sessions_mutex);
65 session = kzalloc(sizeof(struct lttng_session), GFP_KERNEL);
66 if (!session)
67 return NULL;
68 INIT_LIST_HEAD(&session->chan);
69 INIT_LIST_HEAD(&session->events);
70 uuid_le_gen(&session->uuid);
71 list_add(&session->list, &sessions);
72 mutex_unlock(&sessions_mutex);
73 return session;
74 }
75
76 void lttng_session_destroy(struct lttng_session *session)
77 {
78 struct lttng_channel *chan, *tmpchan;
79 struct lttng_event *event, *tmpevent;
80 int ret;
81
82 mutex_lock(&sessions_mutex);
83 ACCESS_ONCE(session->active) = 0;
84 list_for_each_entry(chan, &session->chan, list) {
85 ret = lttng_syscalls_unregister(chan);
86 WARN_ON(ret);
87 }
88 list_for_each_entry(event, &session->events, list) {
89 ret = _lttng_event_unregister(event);
90 WARN_ON(ret);
91 }
92 synchronize_trace(); /* Wait for in-flight events to complete */
93 list_for_each_entry_safe(event, tmpevent, &session->events, list)
94 _lttng_event_destroy(event);
95 list_for_each_entry_safe(chan, tmpchan, &session->chan, list)
96 _lttng_channel_destroy(chan);
97 list_del(&session->list);
98 mutex_unlock(&sessions_mutex);
99 kfree(session);
100 }
101
102 int lttng_session_enable(struct lttng_session *session)
103 {
104 int ret = 0;
105 struct lttng_channel *chan;
106
107 mutex_lock(&sessions_mutex);
108 if (session->active) {
109 ret = -EBUSY;
110 goto end;
111 }
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
126 ACCESS_ONCE(session->active) = 1;
127 ACCESS_ONCE(session->been_active) = 1;
128 ret = _lttng_session_metadata_statedump(session);
129 if (ret) {
130 ACCESS_ONCE(session->active) = 0;
131 goto end;
132 }
133 ret = lttng_statedump_start(session);
134 if (ret)
135 ACCESS_ONCE(session->active) = 0;
136 end:
137 mutex_unlock(&sessions_mutex);
138 return ret;
139 }
140
141 int lttng_session_disable(struct lttng_session *session)
142 {
143 int ret = 0;
144
145 mutex_lock(&sessions_mutex);
146 if (!session->active) {
147 ret = -EBUSY;
148 goto end;
149 }
150 ACCESS_ONCE(session->active) = 0;
151 end:
152 mutex_unlock(&sessions_mutex);
153 return ret;
154 }
155
156 int lttng_channel_enable(struct lttng_channel *channel)
157 {
158 int old;
159
160 if (channel == channel->session->metadata)
161 return -EPERM;
162 old = xchg(&channel->enabled, 1);
163 if (old)
164 return -EEXIST;
165 return 0;
166 }
167
168 int lttng_channel_disable(struct lttng_channel *channel)
169 {
170 int old;
171
172 if (channel == channel->session->metadata)
173 return -EPERM;
174 old = xchg(&channel->enabled, 0);
175 if (!old)
176 return -EEXIST;
177 return 0;
178 }
179
180 int lttng_event_enable(struct lttng_event *event)
181 {
182 int old;
183
184 if (event->chan == event->chan->session->metadata)
185 return -EPERM;
186 old = xchg(&event->enabled, 1);
187 if (old)
188 return -EEXIST;
189 return 0;
190 }
191
192 int lttng_event_disable(struct lttng_event *event)
193 {
194 int old;
195
196 if (event->chan == event->chan->session->metadata)
197 return -EPERM;
198 old = xchg(&event->enabled, 0);
199 if (!old)
200 return -EEXIST;
201 return 0;
202 }
203
204 static struct lttng_transport *lttng_transport_find(const char *name)
205 {
206 struct lttng_transport *transport;
207
208 list_for_each_entry(transport, &lttng_transport_list, node) {
209 if (!strcmp(transport->name, name))
210 return transport;
211 }
212 return NULL;
213 }
214
215 struct lttng_channel *lttng_channel_create(struct lttng_session *session,
216 const char *transport_name,
217 void *buf_addr,
218 size_t subbuf_size, size_t num_subbuf,
219 unsigned int switch_timer_interval,
220 unsigned int read_timer_interval)
221 {
222 struct lttng_channel *chan;
223 struct lttng_transport *transport = NULL;
224
225 mutex_lock(&sessions_mutex);
226 if (session->been_active)
227 goto active; /* Refuse to add channel to active session */
228 transport = lttng_transport_find(transport_name);
229 if (!transport) {
230 printk(KERN_WARNING "LTTng transport %s not found\n",
231 transport_name);
232 goto notransport;
233 }
234 if (!try_module_get(transport->owner)) {
235 printk(KERN_WARNING "LTT : Can't lock transport module.\n");
236 goto notransport;
237 }
238 chan = kzalloc(sizeof(struct lttng_channel), GFP_KERNEL);
239 if (!chan)
240 goto nomem;
241 chan->session = session;
242 chan->id = session->free_chan_id++;
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 */
248 chan->chan = transport->ops.channel_create(transport_name,
249 chan, buf_addr, subbuf_size, num_subbuf,
250 switch_timer_interval, read_timer_interval);
251 if (!chan->chan)
252 goto create_error;
253 chan->enabled = 1;
254 chan->ops = &transport->ops;
255 chan->transport = transport;
256 list_add(&chan->list, &session->chan);
257 mutex_unlock(&sessions_mutex);
258 return chan;
259
260 create_error:
261 kfree(chan);
262 nomem:
263 if (transport)
264 module_put(transport->owner);
265 notransport:
266 active:
267 mutex_unlock(&sessions_mutex);
268 return NULL;
269 }
270
271 /*
272 * Only used internally at session destruction.
273 */
274 static
275 void _lttng_channel_destroy(struct lttng_channel *chan)
276 {
277 chan->ops->channel_destroy(chan->chan);
278 module_put(chan->transport->owner);
279 list_del(&chan->list);
280 lttng_destroy_context(chan->ctx);
281 kfree(chan);
282 }
283
284 /*
285 * Supports event creation while tracing session is active.
286 */
287 struct lttng_event *lttng_event_create(struct lttng_channel *chan,
288 struct lttng_kernel_event *event_param,
289 void *filter,
290 const struct lttng_event_desc *internal_desc)
291 {
292 struct lttng_event *event;
293 int ret;
294
295 mutex_lock(&sessions_mutex);
296 if (chan->free_event_id == -1U)
297 goto full;
298 /*
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.
301 */
302 list_for_each_entry(event, &chan->session->events, list)
303 if (!strcmp(event->desc->name, event_param->name))
304 goto exist;
305 event = kmem_cache_zalloc(event_cache, GFP_KERNEL);
306 if (!event)
307 goto cache_error;
308 event->chan = chan;
309 event->filter = filter;
310 event->id = chan->free_event_id++;
311 event->enabled = 1;
312 event->instrumentation = event_param->instrumentation;
313 /* Populate lttng_event structure before tracepoint registration. */
314 smp_wmb();
315 switch (event_param->instrumentation) {
316 case LTTNG_KERNEL_TRACEPOINT:
317 event->desc = lttng_event_get(event_param->name);
318 if (!event->desc)
319 goto register_error;
320 ret = kabi_2635_tracepoint_probe_register(event_param->name,
321 event->desc->probe_callback,
322 event);
323 if (ret)
324 goto register_error;
325 break;
326 case LTTNG_KERNEL_KPROBE:
327 ret = lttng_kprobes_register(event_param->name,
328 event_param->u.kprobe.symbol_name,
329 event_param->u.kprobe.offset,
330 event_param->u.kprobe.addr,
331 event);
332 if (ret)
333 goto register_error;
334 ret = try_module_get(event->desc->owner);
335 WARN_ON_ONCE(!ret);
336 break;
337 case LTTNG_KERNEL_KRETPROBE:
338 {
339 struct lttng_event *event_return;
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 /*
352 * Populate lttng_event structure before kretprobe registration.
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);
369 ret = _lttng_event_metadata_statedump(chan->session, chan,
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 }
380 case LTTNG_KERNEL_FUNCTION:
381 ret = lttng_ftrace_register(event_param->name,
382 event_param->u.ftrace.symbol_name,
383 event);
384 if (ret)
385 goto register_error;
386 ret = try_module_get(event->desc->owner);
387 WARN_ON_ONCE(!ret);
388 break;
389 case LTTNG_KERNEL_NOOP:
390 event->desc = internal_desc;
391 if (!event->desc)
392 goto register_error;
393 break;
394 default:
395 WARN_ON_ONCE(1);
396 }
397 ret = _lttng_event_metadata_statedump(chan->session, chan, event);
398 if (ret)
399 goto statedump_error;
400 list_add(&event->list, &chan->session->events);
401 mutex_unlock(&sessions_mutex);
402 return event;
403
404 statedump_error:
405 /* If a statedump error occurs, events will not be readable. */
406 register_error:
407 kmem_cache_free(event_cache, event);
408 cache_error:
409 exist:
410 full:
411 mutex_unlock(&sessions_mutex);
412 return NULL;
413 }
414
415 /*
416 * Only used internally at session destruction.
417 */
418 int _lttng_event_unregister(struct lttng_event *event)
419 {
420 int ret = -EINVAL;
421
422 switch (event->instrumentation) {
423 case LTTNG_KERNEL_TRACEPOINT:
424 ret = kabi_2635_tracepoint_probe_unregister(event->desc->name,
425 event->desc->probe_callback,
426 event);
427 if (ret)
428 return ret;
429 break;
430 case LTTNG_KERNEL_KPROBE:
431 lttng_kprobes_unregister(event);
432 ret = 0;
433 break;
434 case LTTNG_KERNEL_KRETPROBE:
435 lttng_kretprobes_unregister(event);
436 ret = 0;
437 break;
438 case LTTNG_KERNEL_FUNCTION:
439 lttng_ftrace_unregister(event);
440 ret = 0;
441 break;
442 case LTTNG_KERNEL_NOOP:
443 ret = 0;
444 break;
445 default:
446 WARN_ON_ONCE(1);
447 }
448 return ret;
449 }
450
451 /*
452 * Only used internally at session destruction.
453 */
454 static
455 void _lttng_event_destroy(struct lttng_event *event)
456 {
457 switch (event->instrumentation) {
458 case LTTNG_KERNEL_TRACEPOINT:
459 lttng_event_put(event->desc);
460 break;
461 case LTTNG_KERNEL_KPROBE:
462 module_put(event->desc->owner);
463 lttng_kprobes_destroy_private(event);
464 break;
465 case LTTNG_KERNEL_KRETPROBE:
466 module_put(event->desc->owner);
467 lttng_kretprobes_destroy_private(event);
468 break;
469 case LTTNG_KERNEL_FUNCTION:
470 module_put(event->desc->owner);
471 lttng_ftrace_destroy_private(event);
472 break;
473 case LTTNG_KERNEL_NOOP:
474 break;
475 default:
476 WARN_ON_ONCE(1);
477 }
478 list_del(&event->list);
479 lttng_destroy_context(event->ctx);
480 kmem_cache_free(event_cache, event);
481 }
482
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 */
489 int lttng_metadata_printf(struct lttng_session *session,
490 const char *fmt, ...)
491 {
492 struct lib_ring_buffer_ctx ctx;
493 struct lttng_channel *chan = session->metadata;
494 char *str;
495 int ret = 0, waitret;
496 size_t len, reserve_len, pos;
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
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 */
522 waitret = wait_event_interruptible_timeout(*chan->ops->get_writer_buf_wait_queue(chan->chan, -1),
523 ({
524 ret = chan->ops->event_reserve(&ctx, 0);
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 }
536 chan->ops->event_write(&ctx, &str[pos], reserve_len);
537 chan->ops->event_commit(&ctx);
538 }
539 end:
540 kfree(str);
541 return ret;
542 }
543
544 static
545 int _lttng_field_statedump(struct lttng_session *session,
546 const struct lttng_event_field *field)
547 {
548 int ret = 0;
549
550 switch (field->type.atype) {
551 case atype_integer:
552 ret = lttng_metadata_printf(session,
553 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s;\n",
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,
563 #ifdef __BIG_ENDIAN
564 field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
565 #else
566 field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
567 #endif
568 field->name);
569 break;
570 case atype_enum:
571 ret = lttng_metadata_printf(session,
572 " %s _%s;\n",
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,
582 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
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,
592 #ifdef __BIG_ENDIAN
593 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
594 #else
595 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
596 #endif
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",
609 length_type->u.basic.integer.size,
610 (unsigned int) length_type->u.basic.integer.alignment,
611 length_type->u.basic.integer.signedness,
612 (length_type->u.basic.integer.encoding == lttng_encode_none)
613 ? "none"
614 : ((length_type->u.basic.integer.encoding == lttng_encode_UTF8)
615 ? "UTF8"
616 : "ASCII"),
617 length_type->u.basic.integer.base,
618 #ifdef __BIG_ENDIAN
619 length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
620 #else
621 length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
622 #endif
623 field->name);
624 if (ret)
625 return ret;
626
627 ret = lttng_metadata_printf(session,
628 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
629 elem_type->u.basic.integer.size,
630 (unsigned int) elem_type->u.basic.integer.alignment,
631 elem_type->u.basic.integer.signedness,
632 (elem_type->u.basic.integer.encoding == lttng_encode_none)
633 ? "none"
634 : ((elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
635 ? "UTF8"
636 : "ASCII"),
637 elem_type->u.basic.integer.base,
638 #ifdef __BIG_ENDIAN
639 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
640 #else
641 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
642 #endif
643 field->name,
644 field->name);
645 break;
646 }
647
648 case atype_string:
649 /* Default encoding is UTF8 */
650 ret = lttng_metadata_printf(session,
651 " string%s _%s;\n",
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
663 static
664 int _lttng_context_metadata_statedump(struct lttng_session *session,
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
675 ret = _lttng_field_statedump(session, &field->event_field);
676 if (ret)
677 return ret;
678 }
679 return ret;
680 }
681
682 static
683 int _lttng_fields_metadata_statedump(struct lttng_session *session,
684 struct lttng_event *event)
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
693 ret = _lttng_field_statedump(session, field);
694 if (ret)
695 return ret;
696 }
697 return ret;
698 }
699
700 static
701 int _lttng_event_metadata_statedump(struct lttng_session *session,
702 struct lttng_channel *chan,
703 struct lttng_event *event)
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"
716 " stream_id = %u;\n",
717 event->desc->name,
718 event->id,
719 event->chan->id);
720 if (ret)
721 goto end;
722
723 if (event->ctx) {
724 ret = lttng_metadata_printf(session,
725 " context := struct {\n");
726 if (ret)
727 goto end;
728 }
729 ret = _lttng_context_metadata_statedump(session, event->ctx);
730 if (ret)
731 goto end;
732 if (event->ctx) {
733 ret = lttng_metadata_printf(session,
734 " };\n");
735 if (ret)
736 goto end;
737 }
738
739 ret = lttng_metadata_printf(session,
740 " fields := struct {\n"
741 );
742 if (ret)
743 goto end;
744
745 ret = _lttng_fields_metadata_statedump(session, event);
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,
754 " };\n"
755 "};\n\n");
756 if (ret)
757 goto end;
758
759 event->metadata_dumped = 1;
760 end:
761 return ret;
762
763 }
764
765 static
766 int _lttng_channel_metadata_statedump(struct lttng_session *session,
767 struct lttng_channel *chan)
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"
780 " event.header := %s;\n"
781 " packet.context := struct packet_context;\n",
782 chan->id,
783 chan->header_type == 1 ? "struct event_header_compact" :
784 "struct event_header_large");
785 if (ret)
786 goto end;
787
788 if (chan->ctx) {
789 ret = lttng_metadata_printf(session,
790 " event.context := struct {\n");
791 if (ret)
792 goto end;
793 }
794 ret = _lttng_context_metadata_statedump(session, chan->ctx);
795 if (ret)
796 goto end;
797 if (chan->ctx) {
798 ret = lttng_metadata_printf(session,
799 " };\n");
800 if (ret)
801 goto end;
802 }
803
804 ret = lttng_metadata_printf(session,
805 "};\n\n");
806
807 chan->metadata_dumped = 1;
808 end:
809 return ret;
810 }
811
812 static
813 int _lttng_stream_packet_context_declare(struct lttng_session *session)
814 {
815 return lttng_metadata_printf(session,
816 "struct packet_context {\n"
817 " uint64_clock_monotonic_t timestamp_begin;\n"
818 " uint64_clock_monotonic_t timestamp_end;\n"
819 " unsigned long events_discarded;\n"
820 " uint32_t content_size;\n"
821 " uint32_t packet_size;\n"
822 " uint32_t cpu_id;\n"
823 "};\n\n"
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 */
836 static
837 int _lttng_event_header_declare(struct lttng_session *session)
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"
844 " uint27_clock_monotonic_t timestamp;\n"
845 " } compact;\n"
846 " struct {\n"
847 " uint32_t id;\n"
848 " uint64_clock_monotonic_t timestamp;\n"
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"
857 " uint32_clock_monotonic_t timestamp;\n"
858 " } compact;\n"
859 " struct {\n"
860 " uint32_t id;\n"
861 " uint64_clock_monotonic_t timestamp;\n"
862 " } extended;\n"
863 " } v;\n"
864 "} align(%u);\n\n",
865 lttng_alignof(uint32_t) * CHAR_BIT,
866 lttng_alignof(uint16_t) * CHAR_BIT
867 );
868 }
869
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 */
876 static
877 uint64_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;
891 realtime = (uint64_t) rts.tv_sec * NSEC_PER_SEC;
892 realtime += rts.tv_nsec;
893 offset = realtime - offset;
894 return offset;
895 }
896
897 /*
898 * Output metadata into this session's metadata buffers.
899 */
900 static
901 int _lttng_session_metadata_statedump(struct lttng_session *session)
902 {
903 unsigned char *uuid_c = session->uuid.b;
904 unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN];
905 struct lttng_channel *chan;
906 struct lttng_event *event;
907 int ret = 0;
908
909 if (!ACCESS_ONCE(session->active))
910 return 0;
911 if (session->metadata_dumped)
912 goto skip_session;
913 if (!session->metadata) {
914 printk(KERN_WARNING "LTTng: attempt to start tracing, but metadata channel is not found. Operation abort.\n");
915 return -EPERM;
916 }
917
918 snprintf(uuid_s, sizeof(uuid_s),
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]);
924
925 ret = lttng_metadata_printf(session,
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"
930 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
931 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
932 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
933 "\n"
934 "trace {\n"
935 " major = %u;\n"
936 " minor = %u;\n"
937 " uuid = \"%s\";\n"
938 " byte_order = %s;\n"
939 " packet.header := struct {\n"
940 " uint32_t magic;\n"
941 " uint8_t uuid[16];\n"
942 " uint32_t stream_id;\n"
943 " };\n"
944 "};\n\n",
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,
949 sizeof(unsigned long) * CHAR_BIT,
950 lttng_alignof(unsigned long) * CHAR_BIT,
951 CTF_SPEC_MAJOR,
952 CTF_SPEC_MINOR,
953 uuid_s,
954 #ifdef __BIG_ENDIAN
955 "be"
956 #else
957 "le"
958 #endif
959 );
960 if (ret)
961 goto end;
962
963 ret = lttng_metadata_printf(session,
964 "env {\n"
965 " hostname = \"%s\";\n"
966 " domain = \"kernel\";\n"
967 " sysname = \"%s\";\n"
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"
974 "};\n\n",
975 current->nsproxy->uts_ns->name.nodename,
976 utsname()->sysname,
977 utsname()->release,
978 utsname()->version,
979 LTTNG_MODULES_MAJOR_VERSION,
980 LTTNG_MODULES_MINOR_VERSION,
981 LTTNG_MODULES_PATCHLEVEL_VERSION
982 );
983 if (ret)
984 goto end;
985
986 ret = lttng_metadata_printf(session,
987 "clock {\n"
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,
996 " uuid = \"%s\";\n",
997 clock_uuid_s
998 );
999 if (ret)
1000 goto end;
1001 }
1002
1003 ret = lttng_metadata_printf(session,
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",
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
1036 ret = _lttng_stream_packet_context_declare(session);
1037 if (ret)
1038 goto end;
1039
1040 ret = _lttng_event_header_declare(session);
1041 if (ret)
1042 goto end;
1043
1044 skip_session:
1045 list_for_each_entry(chan, &session->chan, list) {
1046 ret = _lttng_channel_metadata_statedump(session, chan);
1047 if (ret)
1048 goto end;
1049 }
1050
1051 list_for_each_entry(event, &session->events, list) {
1052 ret = _lttng_event_metadata_statedump(session, event->chan, event);
1053 if (ret)
1054 goto end;
1055 }
1056 session->metadata_dumped = 1;
1057 end:
1058 return ret;
1059 }
1060
1061 /**
1062 * lttng_transport_register - LTT transport registration
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 */
1073 void lttng_transport_register(struct lttng_transport *transport)
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 */
1080 wrapper_vmalloc_sync_all();
1081
1082 mutex_lock(&sessions_mutex);
1083 list_add_tail(&transport->node, &lttng_transport_list);
1084 mutex_unlock(&sessions_mutex);
1085 }
1086 EXPORT_SYMBOL_GPL(lttng_transport_register);
1087
1088 /**
1089 * lttng_transport_unregister - LTT transport unregistration
1090 * @transport: transport structure
1091 */
1092 void lttng_transport_unregister(struct lttng_transport *transport)
1093 {
1094 mutex_lock(&sessions_mutex);
1095 list_del(&transport->node);
1096 mutex_unlock(&sessions_mutex);
1097 }
1098 EXPORT_SYMBOL_GPL(lttng_transport_unregister);
1099
1100 static int __init lttng_events_init(void)
1101 {
1102 int ret;
1103
1104 event_cache = KMEM_CACHE(lttng_event, 0);
1105 if (!event_cache)
1106 return -ENOMEM;
1107 ret = lttng_abi_init();
1108 if (ret)
1109 goto error_abi;
1110 return 0;
1111 error_abi:
1112 kmem_cache_destroy(event_cache);
1113 return ret;
1114 }
1115
1116 module_init(lttng_events_init);
1117
1118 static void __exit lttng_events_exit(void)
1119 {
1120 struct lttng_session *session, *tmpsession;
1121
1122 lttng_abi_exit();
1123 list_for_each_entry_safe(session, tmpsession, &sessions, list)
1124 lttng_session_destroy(session);
1125 kmem_cache_destroy(event_cache);
1126 }
1127
1128 module_exit(lttng_events_exit);
1129
1130 MODULE_LICENSE("GPL and additional rights");
1131 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
1132 MODULE_DESCRIPTION("LTTng Events");
This page took 0.051222 seconds and 5 git commands to generate.