Make kernel tracer version global to the session daemon
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
1 /*
2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2 only,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18 #define _LGPL_SOURCE
19 #include <fcntl.h>
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <inttypes.h>
25
26 #include <common/common.h>
27 #include <common/kernel-ctl/kernel-ctl.h>
28 #include <common/kernel-ctl/kernel-ioctl.h>
29 #include <common/sessiond-comm/sessiond-comm.h>
30
31 #include "consumer.h"
32 #include "kernel.h"
33 #include "kernel-consumer.h"
34 #include "kern-modules.h"
35 #include "utils.h"
36
37 /*
38 * Key used to reference a channel between the sessiond and the consumer. This
39 * is only read and updated with the session_list lock held.
40 */
41 static uint64_t next_kernel_channel_key;
42
43 /*
44 * Add context on a kernel channel.
45 *
46 * Assumes the ownership of ctx.
47 */
48 int kernel_add_channel_context(struct ltt_kernel_channel *chan,
49 struct ltt_kernel_context *ctx)
50 {
51 int ret;
52
53 assert(chan);
54 assert(ctx);
55
56 DBG("Adding context to channel %s", chan->channel->name);
57 ret = kernctl_add_context(chan->fd, &ctx->ctx);
58 if (ret < 0) {
59 switch (-ret) {
60 case ENOSYS:
61 /* Exists but not available for this kernel */
62 ret = LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE;
63 goto error;
64 case EEXIST:
65 /* If EEXIST, we just ignore the error */
66 ret = 0;
67 goto end;
68 default:
69 PERROR("add context ioctl");
70 ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
71 goto error;
72 }
73 }
74 ret = 0;
75
76 end:
77 cds_list_add_tail(&ctx->list, &chan->ctx_list);
78 ctx->in_list = true;
79 ctx = NULL;
80 error:
81 if (ctx) {
82 trace_kernel_destroy_context(ctx);
83 }
84 return ret;
85 }
86
87 /*
88 * Create a new kernel session, register it to the kernel tracer and add it to
89 * the session daemon session.
90 */
91 int kernel_create_session(struct ltt_session *session, int tracer_fd)
92 {
93 int ret;
94 struct ltt_kernel_session *lks;
95
96 assert(session);
97
98 /* Allocate data structure */
99 lks = trace_kernel_create_session();
100 if (lks == NULL) {
101 ret = -1;
102 goto error;
103 }
104
105 /* Kernel tracer session creation */
106 ret = kernctl_create_session(tracer_fd);
107 if (ret < 0) {
108 PERROR("ioctl kernel create session");
109 goto error;
110 }
111
112 lks->fd = ret;
113 /* Prevent fd duplication after execlp() */
114 ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
115 if (ret < 0) {
116 PERROR("fcntl session fd");
117 }
118
119 lks->id = session->id;
120 lks->consumer_fds_sent = 0;
121 session->kernel_session = lks;
122
123 DBG("Kernel session created (fd: %d)", lks->fd);
124
125 return 0;
126
127 error:
128 if (lks) {
129 trace_kernel_destroy_session(lks);
130 }
131 return ret;
132 }
133
134 /*
135 * Create a kernel channel, register it to the kernel tracer and add it to the
136 * kernel session.
137 */
138 int kernel_create_channel(struct ltt_kernel_session *session,
139 struct lttng_channel *chan)
140 {
141 int ret;
142 struct ltt_kernel_channel *lkc;
143
144 assert(session);
145 assert(chan);
146
147 /* Allocate kernel channel */
148 lkc = trace_kernel_create_channel(chan);
149 if (lkc == NULL) {
150 goto error;
151 }
152
153 DBG3("Kernel create channel %s with attr: %d, %" PRIu64 ", %" PRIu64 ", %u, %u, %d, %d",
154 chan->name, lkc->channel->attr.overwrite,
155 lkc->channel->attr.subbuf_size, lkc->channel->attr.num_subbuf,
156 lkc->channel->attr.switch_timer_interval, lkc->channel->attr.read_timer_interval,
157 lkc->channel->attr.live_timer_interval, lkc->channel->attr.output);
158
159 /* Kernel tracer channel creation */
160 ret = kernctl_create_channel(session->fd, &lkc->channel->attr);
161 if (ret < 0) {
162 PERROR("ioctl kernel create channel");
163 goto error;
164 }
165
166 /* Setup the channel fd */
167 lkc->fd = ret;
168 /* Prevent fd duplication after execlp() */
169 ret = fcntl(lkc->fd, F_SETFD, FD_CLOEXEC);
170 if (ret < 0) {
171 PERROR("fcntl session fd");
172 }
173
174 /* Add channel to session */
175 cds_list_add(&lkc->list, &session->channel_list.head);
176 session->channel_count++;
177 lkc->session = session;
178 lkc->key = ++next_kernel_channel_key;
179
180 DBG("Kernel channel %s created (fd: %d, key: %" PRIu64 ")",
181 lkc->channel->name, lkc->fd, lkc->key);
182
183 return 0;
184
185 error:
186 if (lkc) {
187 free(lkc->channel);
188 free(lkc);
189 }
190 return -1;
191 }
192
193 /*
194 * Create a kernel event, enable it to the kernel tracer and add it to the
195 * channel event list of the kernel session.
196 * We own filter_expression and filter.
197 */
198 int kernel_create_event(struct lttng_event *ev,
199 struct ltt_kernel_channel *channel,
200 char *filter_expression,
201 struct lttng_filter_bytecode *filter)
202 {
203 int ret;
204 struct ltt_kernel_event *event;
205
206 assert(ev);
207 assert(channel);
208
209 /* We pass ownership of filter_expression and filter */
210 event = trace_kernel_create_event(ev, filter_expression,
211 filter);
212 if (event == NULL) {
213 ret = -1;
214 goto error;
215 }
216
217 ret = kernctl_create_event(channel->fd, event->event);
218 if (ret < 0) {
219 switch (-ret) {
220 case EEXIST:
221 break;
222 case ENOSYS:
223 WARN("Event type not implemented");
224 break;
225 case ENOENT:
226 WARN("Event %s not found!", ev->name);
227 break;
228 default:
229 PERROR("create event ioctl");
230 }
231 goto free_event;
232 }
233
234 event->type = ev->type;
235 event->fd = ret;
236 /* Prevent fd duplication after execlp() */
237 ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC);
238 if (ret < 0) {
239 PERROR("fcntl session fd");
240 }
241
242 if (filter) {
243 ret = kernctl_filter(event->fd, filter);
244 if (ret) {
245 goto filter_error;
246 }
247 }
248
249 ret = kernctl_enable(event->fd);
250 if (ret < 0) {
251 switch (-ret) {
252 case EEXIST:
253 ret = LTTNG_ERR_KERN_EVENT_EXIST;
254 break;
255 default:
256 PERROR("enable kernel event");
257 break;
258 }
259 goto enable_error;
260 }
261
262 /* Add event to event list */
263 cds_list_add(&event->list, &channel->events_list.head);
264 channel->event_count++;
265
266 DBG("Event %s created (fd: %d)", ev->name, event->fd);
267
268 return 0;
269
270 enable_error:
271 filter_error:
272 {
273 int closeret;
274
275 closeret = close(event->fd);
276 if (closeret) {
277 PERROR("close event fd");
278 }
279 }
280 free_event:
281 free(event);
282 error:
283 return ret;
284 }
285
286 /*
287 * Disable a kernel channel.
288 */
289 int kernel_disable_channel(struct ltt_kernel_channel *chan)
290 {
291 int ret;
292
293 assert(chan);
294
295 ret = kernctl_disable(chan->fd);
296 if (ret < 0) {
297 PERROR("disable chan ioctl");
298 goto error;
299 }
300
301 chan->enabled = 0;
302 DBG("Kernel channel %s disabled (fd: %d, key: %" PRIu64 ")",
303 chan->channel->name, chan->fd, chan->key);
304
305 return 0;
306
307 error:
308 return ret;
309 }
310
311 /*
312 * Enable a kernel channel.
313 */
314 int kernel_enable_channel(struct ltt_kernel_channel *chan)
315 {
316 int ret;
317
318 assert(chan);
319
320 ret = kernctl_enable(chan->fd);
321 if (ret < 0 && ret != -EEXIST) {
322 PERROR("Enable kernel chan");
323 goto error;
324 }
325
326 chan->enabled = 1;
327 DBG("Kernel channel %s enabled (fd: %d, key: %" PRIu64 ")",
328 chan->channel->name, chan->fd, chan->key);
329
330 return 0;
331
332 error:
333 return ret;
334 }
335
336 /*
337 * Enable a kernel event.
338 */
339 int kernel_enable_event(struct ltt_kernel_event *event)
340 {
341 int ret;
342
343 assert(event);
344
345 ret = kernctl_enable(event->fd);
346 if (ret < 0) {
347 switch (-ret) {
348 case EEXIST:
349 ret = LTTNG_ERR_KERN_EVENT_EXIST;
350 break;
351 default:
352 PERROR("enable kernel event");
353 break;
354 }
355 goto error;
356 }
357
358 event->enabled = 1;
359 DBG("Kernel event %s enabled (fd: %d)", event->event->name, event->fd);
360
361 return 0;
362
363 error:
364 return ret;
365 }
366
367 /*
368 * Disable a kernel event.
369 */
370 int kernel_disable_event(struct ltt_kernel_event *event)
371 {
372 int ret;
373
374 assert(event);
375
376 ret = kernctl_disable(event->fd);
377 if (ret < 0) {
378 switch (-ret) {
379 case EEXIST:
380 ret = LTTNG_ERR_KERN_EVENT_EXIST;
381 break;
382 default:
383 PERROR("disable kernel event");
384 break;
385 }
386 goto error;
387 }
388
389 event->enabled = 0;
390 DBG("Kernel event %s disabled (fd: %d)", event->event->name, event->fd);
391
392 return 0;
393
394 error:
395 return ret;
396 }
397
398
399 int kernel_track_pid(struct ltt_kernel_session *session, int pid)
400 {
401 int ret;
402
403 DBG("Kernel track PID %d for session id %" PRIu64 ".",
404 pid, session->id);
405 ret = kernctl_track_pid(session->fd, pid);
406 if (!ret) {
407 return LTTNG_OK;
408 }
409 switch (-ret) {
410 case EINVAL:
411 return LTTNG_ERR_INVALID;
412 case ENOMEM:
413 return LTTNG_ERR_NOMEM;
414 case EEXIST:
415 return LTTNG_ERR_PID_TRACKED;
416 default:
417 return LTTNG_ERR_UNK;
418 }
419 }
420
421 int kernel_untrack_pid(struct ltt_kernel_session *session, int pid)
422 {
423 int ret;
424
425 DBG("Kernel untrack PID %d for session id %" PRIu64 ".",
426 pid, session->id);
427 ret = kernctl_untrack_pid(session->fd, pid);
428 if (!ret) {
429 return LTTNG_OK;
430 }
431 switch (-ret) {
432 case EINVAL:
433 return LTTNG_ERR_INVALID;
434 case ENOMEM:
435 return LTTNG_ERR_NOMEM;
436 case ENOENT:
437 return LTTNG_ERR_PID_NOT_TRACKED;
438 default:
439 return LTTNG_ERR_UNK;
440 }
441 }
442
443 ssize_t kernel_list_tracker_pids(struct ltt_kernel_session *session,
444 int **_pids)
445 {
446 int fd, ret;
447 int pid;
448 ssize_t nbmem, count = 0;
449 FILE *fp;
450 int *pids;
451
452 fd = kernctl_list_tracker_pids(session->fd);
453 if (fd < 0) {
454 PERROR("kernel tracker pids list");
455 goto error;
456 }
457
458 fp = fdopen(fd, "r");
459 if (fp == NULL) {
460 PERROR("kernel tracker pids list fdopen");
461 goto error_fp;
462 }
463
464 nbmem = KERNEL_TRACKER_PIDS_INIT_LIST_SIZE;
465 pids = zmalloc(sizeof(*pids) * nbmem);
466 if (pids == NULL) {
467 PERROR("alloc list pids");
468 count = -ENOMEM;
469 goto end;
470 }
471
472 while (fscanf(fp, "process { pid = %u; };\n", &pid) == 1) {
473 if (count >= nbmem) {
474 int *new_pids;
475 size_t new_nbmem;
476
477 new_nbmem = nbmem << 1;
478 DBG("Reallocating pids list from %zu to %zu entries",
479 nbmem, new_nbmem);
480 new_pids = realloc(pids, new_nbmem * sizeof(*new_pids));
481 if (new_pids == NULL) {
482 PERROR("realloc list events");
483 free(pids);
484 count = -ENOMEM;
485 goto end;
486 }
487 /* Zero the new memory */
488 memset(new_pids + nbmem, 0,
489 (new_nbmem - nbmem) * sizeof(*new_pids));
490 nbmem = new_nbmem;
491 pids = new_pids;
492 }
493 pids[count++] = pid;
494 }
495
496 *_pids = pids;
497 DBG("Kernel list tracker pids done (%zd pids)", count);
498 end:
499 ret = fclose(fp); /* closes both fp and fd */
500 if (ret) {
501 PERROR("fclose");
502 }
503 return count;
504
505 error_fp:
506 ret = close(fd);
507 if (ret) {
508 PERROR("close");
509 }
510 error:
511 return -1;
512 }
513
514 /*
515 * Create kernel metadata, open from the kernel tracer and add it to the
516 * kernel session.
517 */
518 int kernel_open_metadata(struct ltt_kernel_session *session)
519 {
520 int ret;
521 struct ltt_kernel_metadata *lkm = NULL;
522
523 assert(session);
524
525 /* Allocate kernel metadata */
526 lkm = trace_kernel_create_metadata();
527 if (lkm == NULL) {
528 goto error;
529 }
530
531 /* Kernel tracer metadata creation */
532 ret = kernctl_open_metadata(session->fd, &lkm->conf->attr);
533 if (ret < 0) {
534 goto error_open;
535 }
536
537 lkm->fd = ret;
538 /* Prevent fd duplication after execlp() */
539 ret = fcntl(lkm->fd, F_SETFD, FD_CLOEXEC);
540 if (ret < 0) {
541 PERROR("fcntl session fd");
542 }
543
544 session->metadata = lkm;
545
546 DBG("Kernel metadata opened (fd: %d)", lkm->fd);
547
548 return 0;
549
550 error_open:
551 trace_kernel_destroy_metadata(lkm);
552 error:
553 return -1;
554 }
555
556 /*
557 * Start tracing session.
558 */
559 int kernel_start_session(struct ltt_kernel_session *session)
560 {
561 int ret;
562
563 assert(session);
564
565 ret = kernctl_start_session(session->fd);
566 if (ret < 0) {
567 PERROR("ioctl start session");
568 goto error;
569 }
570
571 DBG("Kernel session started");
572
573 return 0;
574
575 error:
576 return ret;
577 }
578
579 /*
580 * Make a kernel wait to make sure in-flight probe have completed.
581 */
582 void kernel_wait_quiescent(int fd)
583 {
584 int ret;
585
586 DBG("Kernel quiescent wait on %d", fd);
587
588 ret = kernctl_wait_quiescent(fd);
589 if (ret < 0) {
590 PERROR("wait quiescent ioctl");
591 ERR("Kernel quiescent wait failed");
592 }
593 }
594
595 /*
596 * Force flush buffer of metadata.
597 */
598 int kernel_metadata_flush_buffer(int fd)
599 {
600 int ret;
601
602 DBG("Kernel flushing metadata buffer on fd %d", fd);
603
604 ret = kernctl_buffer_flush(fd);
605 if (ret < 0) {
606 ERR("Fail to flush metadata buffers %d (ret: %d)", fd, ret);
607 }
608
609 return 0;
610 }
611
612 /*
613 * Force flush buffer for channel.
614 */
615 int kernel_flush_buffer(struct ltt_kernel_channel *channel)
616 {
617 int ret;
618 struct ltt_kernel_stream *stream;
619
620 assert(channel);
621
622 DBG("Flush buffer for channel %s", channel->channel->name);
623
624 cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
625 DBG("Flushing channel stream %d", stream->fd);
626 ret = kernctl_buffer_flush(stream->fd);
627 if (ret < 0) {
628 PERROR("ioctl");
629 ERR("Fail to flush buffer for stream %d (ret: %d)",
630 stream->fd, ret);
631 }
632 }
633
634 return 0;
635 }
636
637 /*
638 * Stop tracing session.
639 */
640 int kernel_stop_session(struct ltt_kernel_session *session)
641 {
642 int ret;
643
644 assert(session);
645
646 ret = kernctl_stop_session(session->fd);
647 if (ret < 0) {
648 goto error;
649 }
650
651 DBG("Kernel session stopped");
652
653 return 0;
654
655 error:
656 return ret;
657 }
658
659 /*
660 * Open stream of channel, register it to the kernel tracer and add it
661 * to the stream list of the channel.
662 *
663 * Note: given that the streams may appear in random order wrt CPU
664 * number (e.g. cpu hotplug), the index value of the stream number in
665 * the stream name is not necessarily linked to the CPU number.
666 *
667 * Return the number of created stream. Else, a negative value.
668 */
669 int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
670 {
671 int ret;
672 struct ltt_kernel_stream *lks;
673
674 assert(channel);
675
676 while ((ret = kernctl_create_stream(channel->fd)) >= 0) {
677 lks = trace_kernel_create_stream(channel->channel->name,
678 channel->stream_count);
679 if (lks == NULL) {
680 ret = close(ret);
681 if (ret) {
682 PERROR("close");
683 }
684 goto error;
685 }
686
687 lks->fd = ret;
688 /* Prevent fd duplication after execlp() */
689 ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
690 if (ret < 0) {
691 PERROR("fcntl session fd");
692 }
693
694 lks->tracefile_size = channel->channel->attr.tracefile_size;
695 lks->tracefile_count = channel->channel->attr.tracefile_count;
696
697 /* Add stream to channel stream list */
698 cds_list_add(&lks->list, &channel->stream_list.head);
699 channel->stream_count++;
700
701 DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd,
702 lks->state);
703 }
704
705 return channel->stream_count;
706
707 error:
708 return -1;
709 }
710
711 /*
712 * Open the metadata stream and set it to the kernel session.
713 */
714 int kernel_open_metadata_stream(struct ltt_kernel_session *session)
715 {
716 int ret;
717
718 assert(session);
719
720 ret = kernctl_create_stream(session->metadata->fd);
721 if (ret < 0) {
722 PERROR("kernel create metadata stream");
723 goto error;
724 }
725
726 DBG("Kernel metadata stream created (fd: %d)", ret);
727 session->metadata_stream_fd = ret;
728 /* Prevent fd duplication after execlp() */
729 ret = fcntl(session->metadata_stream_fd, F_SETFD, FD_CLOEXEC);
730 if (ret < 0) {
731 PERROR("fcntl session fd");
732 }
733
734 return 0;
735
736 error:
737 return -1;
738 }
739
740 /*
741 * Get the event list from the kernel tracer and return the number of elements.
742 */
743 ssize_t kernel_list_events(int tracer_fd, struct lttng_event **events)
744 {
745 int fd, ret;
746 char *event;
747 size_t nbmem, count = 0;
748 FILE *fp;
749 struct lttng_event *elist;
750
751 assert(events);
752
753 fd = kernctl_tracepoint_list(tracer_fd);
754 if (fd < 0) {
755 PERROR("kernel tracepoint list");
756 goto error;
757 }
758
759 fp = fdopen(fd, "r");
760 if (fp == NULL) {
761 PERROR("kernel tracepoint list fdopen");
762 goto error_fp;
763 }
764
765 /*
766 * Init memory size counter
767 * See kernel-ctl.h for explanation of this value
768 */
769 nbmem = KERNEL_EVENT_INIT_LIST_SIZE;
770 elist = zmalloc(sizeof(struct lttng_event) * nbmem);
771 if (elist == NULL) {
772 PERROR("alloc list events");
773 count = -ENOMEM;
774 goto end;
775 }
776
777 while (fscanf(fp, "event { name = %m[^;]; };\n", &event) == 1) {
778 if (count >= nbmem) {
779 struct lttng_event *new_elist;
780 size_t new_nbmem;
781
782 new_nbmem = nbmem << 1;
783 DBG("Reallocating event list from %zu to %zu bytes",
784 nbmem, new_nbmem);
785 new_elist = realloc(elist, new_nbmem * sizeof(struct lttng_event));
786 if (new_elist == NULL) {
787 PERROR("realloc list events");
788 free(event);
789 free(elist);
790 count = -ENOMEM;
791 goto end;
792 }
793 /* Zero the new memory */
794 memset(new_elist + nbmem, 0,
795 (new_nbmem - nbmem) * sizeof(struct lttng_event));
796 nbmem = new_nbmem;
797 elist = new_elist;
798 }
799 strncpy(elist[count].name, event, LTTNG_SYMBOL_NAME_LEN);
800 elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
801 elist[count].enabled = -1;
802 count++;
803 free(event);
804 }
805
806 *events = elist;
807 DBG("Kernel list events done (%zu events)", count);
808 end:
809 ret = fclose(fp); /* closes both fp and fd */
810 if (ret) {
811 PERROR("fclose");
812 }
813 return count;
814
815 error_fp:
816 ret = close(fd);
817 if (ret) {
818 PERROR("close");
819 }
820 error:
821 return -1;
822 }
823
824 /*
825 * Get kernel version and validate it.
826 */
827 int kernel_validate_version(int tracer_fd,
828 struct lttng_kernel_tracer_version *version,
829 struct lttng_kernel_tracer_abi_version *abi_version)
830 {
831 int ret;
832
833 ret = kernctl_tracer_version(tracer_fd, version);
834 if (ret < 0) {
835 ERR("Failed to retrieve the lttng-modules version");
836 goto error;
837 }
838
839 /* Validate version */
840 if (version->major != VERSION_MAJOR) {
841 ERR("Kernel tracer major version (%d) is not compatible with lttng-tools major version (%d)",
842 version->major, VERSION_MAJOR);
843 goto error_version;
844 }
845 ret = kernctl_tracer_abi_version(tracer_fd, abi_version);
846 if (ret < 0) {
847 ERR("Failed to retrieve lttng-modules ABI version");
848 goto error;
849 }
850 if (abi_version->major != LTTNG_MODULES_ABI_MAJOR_VERSION) {
851 ERR("Kernel tracer ABI version (%d.%d) does not match the expected ABI major version (%d.*)",
852 abi_version->major, abi_version->minor,
853 LTTNG_MODULES_ABI_MAJOR_VERSION);
854 goto error;
855 }
856 DBG2("Kernel tracer version validated (%d.%d, ABI %d.%d)",
857 version->major, version->minor,
858 abi_version->major, abi_version->minor);
859 return 0;
860
861 error_version:
862 ret = -1;
863
864 error:
865 ERR("Kernel tracer version check failed; kernel tracing will not be available");
866 return ret;
867 }
868
869 /*
870 * Kernel work-arounds called at the start of sessiond main().
871 */
872 int init_kernel_workarounds(void)
873 {
874 int ret;
875 FILE *fp;
876
877 /*
878 * boot_id needs to be read once before being used concurrently
879 * to deal with a Linux kernel race. A fix is proposed for
880 * upstream, but the work-around is needed for older kernels.
881 */
882 fp = fopen("/proc/sys/kernel/random/boot_id", "r");
883 if (!fp) {
884 goto end_boot_id;
885 }
886 while (!feof(fp)) {
887 char buf[37] = "";
888
889 ret = fread(buf, 1, sizeof(buf), fp);
890 if (ret < 0) {
891 /* Ignore error, we don't really care */
892 }
893 }
894 ret = fclose(fp);
895 if (ret) {
896 PERROR("fclose");
897 }
898 end_boot_id:
899 return 0;
900 }
901
902 /*
903 * Complete teardown of a kernel session.
904 */
905 void kernel_destroy_session(struct ltt_kernel_session *ksess)
906 {
907 if (ksess == NULL) {
908 DBG3("No kernel session when tearing down session");
909 return;
910 }
911
912 DBG("Tearing down kernel session");
913
914 /*
915 * Destroy channels on the consumer if at least one FD has been sent and we
916 * are in no output mode because the streams are in *no* monitor mode so we
917 * have to send a command to clean them up or else they leaked.
918 */
919 if (!ksess->output_traces && ksess->consumer_fds_sent) {
920 int ret;
921 struct consumer_socket *socket;
922 struct lttng_ht_iter iter;
923
924 /* For each consumer socket. */
925 rcu_read_lock();
926 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
927 socket, node.node) {
928 struct ltt_kernel_channel *chan;
929
930 /* For each channel, ask the consumer to destroy it. */
931 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
932 ret = kernel_consumer_destroy_channel(socket, chan);
933 if (ret < 0) {
934 /* Consumer is probably dead. Use next socket. */
935 continue;
936 }
937 }
938 }
939 rcu_read_unlock();
940 }
941
942 /* Close any relayd session */
943 consumer_output_send_destroy_relayd(ksess->consumer);
944
945 trace_kernel_destroy_session(ksess);
946 }
947
948 /*
949 * Destroy a kernel channel object. It does not do anything on the tracer side.
950 */
951 void kernel_destroy_channel(struct ltt_kernel_channel *kchan)
952 {
953 struct ltt_kernel_session *ksess = NULL;
954
955 assert(kchan);
956 assert(kchan->channel);
957
958 DBG3("Kernel destroy channel %s", kchan->channel->name);
959
960 /* Update channel count of associated session. */
961 if (kchan->session) {
962 /* Keep pointer reference so we can update it after the destroy. */
963 ksess = kchan->session;
964 }
965
966 trace_kernel_destroy_channel(kchan);
967
968 /*
969 * At this point the kernel channel is not visible anymore. This is safe
970 * since in order to work on a visible kernel session, the tracing session
971 * lock (ltt_session.lock) MUST be acquired.
972 */
973 if (ksess) {
974 ksess->channel_count--;
975 }
976 }
977
978 /*
979 * Take a snapshot for a given kernel session.
980 *
981 * Return 0 on success or else return a LTTNG_ERR code.
982 */
983 int kernel_snapshot_record(struct ltt_kernel_session *ksess,
984 struct snapshot_output *output, int wait,
985 uint64_t nb_packets_per_stream)
986 {
987 int err, ret, saved_metadata_fd;
988 struct consumer_socket *socket;
989 struct lttng_ht_iter iter;
990 struct ltt_kernel_metadata *saved_metadata;
991
992 assert(ksess);
993 assert(ksess->consumer);
994 assert(output);
995
996 DBG("Kernel snapshot record started");
997
998 /* Save current metadata since the following calls will change it. */
999 saved_metadata = ksess->metadata;
1000 saved_metadata_fd = ksess->metadata_stream_fd;
1001
1002 rcu_read_lock();
1003
1004 ret = kernel_open_metadata(ksess);
1005 if (ret < 0) {
1006 ret = LTTNG_ERR_KERN_META_FAIL;
1007 goto error;
1008 }
1009
1010 ret = kernel_open_metadata_stream(ksess);
1011 if (ret < 0) {
1012 ret = LTTNG_ERR_KERN_META_FAIL;
1013 goto error_open_stream;
1014 }
1015
1016 /* Send metadata to consumer and snapshot everything. */
1017 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
1018 socket, node.node) {
1019 struct consumer_output *saved_output;
1020 struct ltt_kernel_channel *chan;
1021
1022 /*
1023 * Temporarly switch consumer output for our snapshot output. As long
1024 * as the session lock is taken, this is safe.
1025 */
1026 saved_output = ksess->consumer;
1027 ksess->consumer = output->consumer;
1028
1029 pthread_mutex_lock(socket->lock);
1030 /* This stream must not be monitored by the consumer. */
1031 ret = kernel_consumer_add_metadata(socket, ksess, 0);
1032 pthread_mutex_unlock(socket->lock);
1033 /* Put back the saved consumer output into the session. */
1034 ksess->consumer = saved_output;
1035 if (ret < 0) {
1036 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
1037 goto error_consumer;
1038 }
1039
1040 /* For each channel, ask the consumer to snapshot it. */
1041 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
1042 ret = consumer_snapshot_channel(socket, chan->fd, output, 0,
1043 ksess->uid, ksess->gid,
1044 DEFAULT_KERNEL_TRACE_DIR, wait,
1045 nb_packets_per_stream);
1046 if (ret < 0) {
1047 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
1048 (void) kernel_consumer_destroy_metadata(socket,
1049 ksess->metadata);
1050 goto error_consumer;
1051 }
1052 }
1053
1054 /* Snapshot metadata, */
1055 ret = consumer_snapshot_channel(socket, ksess->metadata->fd, output,
1056 1, ksess->uid, ksess->gid,
1057 DEFAULT_KERNEL_TRACE_DIR, wait, 0);
1058 if (ret < 0) {
1059 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
1060 goto error_consumer;
1061 }
1062
1063 /*
1064 * The metadata snapshot is done, ask the consumer to destroy it since
1065 * it's not monitored on the consumer side.
1066 */
1067 (void) kernel_consumer_destroy_metadata(socket, ksess->metadata);
1068 }
1069
1070 ret = LTTNG_OK;
1071
1072 error_consumer:
1073 /* Close newly opened metadata stream. It's now on the consumer side. */
1074 err = close(ksess->metadata_stream_fd);
1075 if (err < 0) {
1076 PERROR("close snapshot kernel");
1077 }
1078
1079 error_open_stream:
1080 trace_kernel_destroy_metadata(ksess->metadata);
1081 error:
1082 /* Restore metadata state.*/
1083 ksess->metadata = saved_metadata;
1084 ksess->metadata_stream_fd = saved_metadata_fd;
1085
1086 rcu_read_unlock();
1087 return ret;
1088 }
1089
1090 /*
1091 * Get the syscall mask array from the kernel tracer.
1092 *
1093 * Return 0 on success else a negative value. In both case, syscall_mask should
1094 * be freed.
1095 */
1096 int kernel_syscall_mask(int chan_fd, char **syscall_mask, uint32_t *nr_bits)
1097 {
1098 assert(syscall_mask);
1099 assert(nr_bits);
1100
1101 return kernctl_syscall_mask(chan_fd, syscall_mask, nr_bits);
1102 }
1103
1104 /*
1105 * Check for the support of the RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS via abi
1106 * version number.
1107 *
1108 * Return 1 on success, 0 when feature is not supported, negative value in case
1109 * of errors.
1110 */
1111 int kernel_supports_ring_buffer_snapshot_sample_positions(int tracer_fd)
1112 {
1113 int ret = 0; // Not supported by default
1114 struct lttng_kernel_tracer_abi_version abi;
1115
1116 ret = kernctl_tracer_abi_version(tracer_fd, &abi);
1117 if (ret < 0) {
1118 ERR("Failed to retrieve lttng-modules ABI version");
1119 goto error;
1120 }
1121
1122 /*
1123 * RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS was introduced in 2.3
1124 */
1125 if (abi.major >= 2 && abi.minor >= 3) {
1126 /* Supported */
1127 ret = 1;
1128 } else {
1129 /* Not supported */
1130 ret = 0;
1131 }
1132 error:
1133 return ret;
1134 }
This page took 0.083051 seconds and 6 git commands to generate.