Propagate trace format to ltt_kernel_session object
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.cpp
CommitLineData
20fe2104 1/*
21cf9b6b 2 * Copyright (C) 2011 EfficiOS Inc.
20fe2104 3 *
ab5be9fa 4 * SPDX-License-Identifier: GPL-2.0-only
20fe2104 5 *
20fe2104
DG
6 */
7
6c1c0768 8#define _LGPL_SOURCE
7b395890 9#include <fcntl.h>
20fe2104
DG
10#include <stdlib.h>
11#include <stdio.h>
f34daff7 12#include <string.h>
8c0faa1d 13#include <unistd.h>
77c7c900 14#include <inttypes.h>
7d268848 15#include <sys/types.h>
20fe2104 16
c9e313bc
SM
17#include <common/common.hpp>
18#include <common/hashtable/utils.hpp>
19#include <common/trace-chunk.hpp>
20#include <common/kernel-ctl/kernel-ctl.hpp>
21#include <common/kernel-ctl/kernel-ioctl.hpp>
22#include <common/sessiond-comm/sessiond-comm.hpp>
23#include <common/tracker.hpp>
24#include <common/utils.hpp>
c5bf436c
JG
25#include <lttng/event.h>
26#include <lttng/lttng-error.h>
27#include <lttng/tracker.h>
1e307fab 28
352b58f5 29#include <lttng/userspace-probe.h>
c9e313bc 30#include <lttng/userspace-probe-internal.hpp>
670a26e4 31#include <lttng/condition/event-rule-matches.h>
c9e313bc 32#include <lttng/condition/event-rule-matches-internal.hpp>
352b58f5 33#include <lttng/event-rule/event-rule.h>
c9e313bc
SM
34#include <lttng/event-rule/event-rule-internal.hpp>
35#include <lttng/event-rule/kernel-uprobe-internal.hpp>
352b58f5 36
c9e313bc
SM
37#include "event-notifier-error-accounting.hpp"
38#include "lttng-sessiond.hpp"
39#include "lttng-syscall.hpp"
40#include "condition-internal.hpp"
41#include "consumer.hpp"
42#include "kernel.hpp"
43#include "kernel-consumer.hpp"
44#include "kern-modules.hpp"
45#include "sessiond-config.hpp"
46#include "utils.hpp"
47#include "rotate.hpp"
48#include "modprobe.hpp"
49#include "tracker.hpp"
50#include "notification-thread-commands.hpp"
20fe2104 51
e1f3997a
JD
52/*
53 * Key used to reference a channel between the sessiond and the consumer. This
54 * is only read and updated with the session_list lock held.
55 */
56static uint64_t next_kernel_channel_key;
57
7d268848
MD
58static const char *module_proc_lttng = "/proc/lttng";
59
60static int kernel_tracer_fd = -1;
352b58f5
JR
61static int kernel_tracer_event_notifier_group_fd = -1;
62static int kernel_tracer_event_notifier_group_notification_fd = -1;
63static struct cds_lfht *kernel_token_to_event_notifier_rule_ht;
7d268848 64
d65106b1 65/*
050349bb 66 * Add context on a kernel channel.
df3c77c8
JG
67 *
68 * Assumes the ownership of ctx.
d65106b1
DG
69 */
70int kernel_add_channel_context(struct ltt_kernel_channel *chan,
645328ae 71 struct ltt_kernel_context *ctx)
d65106b1
DG
72{
73 int ret;
74
a0377dfe
FD
75 LTTNG_ASSERT(chan);
76 LTTNG_ASSERT(ctx);
0525e9ae 77
d65106b1 78 DBG("Adding context to channel %s", chan->channel->name);
645328ae 79 ret = kernctl_add_context(chan->fd, &ctx->ctx);
d65106b1 80 if (ret < 0) {
32af2c95 81 switch (-ret) {
1ae5e83e
JD
82 case ENOSYS:
83 /* Exists but not available for this kernel */
84 ret = LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE;
85 goto error;
86 case EEXIST:
b579acd9
DG
87 /* If EEXIST, we just ignore the error */
88 ret = 0;
1ae5e83e
JD
89 goto end;
90 default:
91 PERROR("add context ioctl");
92 ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
93 goto error;
b579acd9 94 }
d65106b1 95 }
21ed98c1 96 ret = 0;
d65106b1 97
1ae5e83e 98end:
645328ae 99 cds_list_add_tail(&ctx->list, &chan->ctx_list);
ba985c3a 100 ctx->in_list = true;
df3c77c8 101 ctx = NULL;
d65106b1 102error:
df3c77c8
JG
103 if (ctx) {
104 trace_kernel_destroy_context(ctx);
105 }
d65106b1
DG
106 return ret;
107}
108
20fe2104 109/*
050349bb
DG
110 * Create a new kernel session, register it to the kernel tracer and add it to
111 * the session daemon session.
20fe2104 112 */
7d268848 113int kernel_create_session(struct ltt_session *session)
20fe2104
DG
114{
115 int ret;
116 struct ltt_kernel_session *lks;
117
a0377dfe 118 LTTNG_ASSERT(session);
0525e9ae 119
54012638 120 /* Allocate data structure */
0e1fd1e8
JR
121 lks = trace_kernel_create_session(
122 std::const_pointer_cast<const lttng::trace_format_descriptor>(
123 session->trace_format));
20fe2104 124 if (lks == NULL) {
54012638 125 ret = -1;
20fe2104
DG
126 goto error;
127 }
128
54012638 129 /* Kernel tracer session creation */
7d268848 130 ret = kernctl_create_session(kernel_tracer_fd);
20fe2104 131 if (ret < 0) {
df0f840b 132 PERROR("ioctl kernel create session");
20fe2104
DG
133 goto error;
134 }
135
20fe2104 136 lks->fd = ret;
7b395890
DG
137 /* Prevent fd duplication after execlp() */
138 ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
139 if (ret < 0) {
df0f840b 140 PERROR("fcntl session fd");
7b395890
DG
141 }
142
53632229 143 lks->id = session->id;
3bd1e081 144 lks->consumer_fds_sent = 0;
8c0faa1d 145 session->kernel_session = lks;
8c0faa1d
DG
146
147 DBG("Kernel session created (fd: %d)", lks->fd);
20fe2104 148
8ff4109e
JR
149 /*
150 * This is necessary since the creation time is present in the session
151 * name when it is generated.
152 */
153 if (session->has_auto_generated_name) {
154 ret = kernctl_session_set_name(lks->fd, DEFAULT_SESSION_NAME);
155 } else {
156 ret = kernctl_session_set_name(lks->fd, session->name);
157 }
158 if (ret) {
159 WARN("Could not set kernel session name for session %" PRIu64 " name: %s",
160 session->id, session->name);
161 }
162
e04b2181
JR
163 ret = kernctl_session_set_creation_time(lks->fd, session->creation_time);
164 if (ret) {
165 WARN("Could not set kernel session creation time for session %" PRIu64 " name: %s",
166 session->id, session->name);
167 }
168
121b0d1a
JR
169 ret = kernctl_session_set_trace_format(lks->fd, *session->trace_format);
170 if (ret) {
171 WARN("Could not set kernel session trace format %" PRIu64 " name: %s", session->id,
172 session->name);
173 }
20fe2104
DG
174 return 0;
175
176error:
5f62c685
DG
177 if (lks) {
178 trace_kernel_destroy_session(lks);
d070c424 179 trace_kernel_free_session(lks);
5f62c685 180 }
20fe2104
DG
181 return ret;
182}
183
184/*
050349bb
DG
185 * Create a kernel channel, register it to the kernel tracer and add it to the
186 * kernel session.
20fe2104 187 */
050349bb 188int kernel_create_channel(struct ltt_kernel_session *session,
fdd9eb17 189 struct lttng_channel *chan)
20fe2104
DG
190{
191 int ret;
192 struct ltt_kernel_channel *lkc;
20fe2104 193
a0377dfe
FD
194 LTTNG_ASSERT(session);
195 LTTNG_ASSERT(chan);
0525e9ae 196
54012638 197 /* Allocate kernel channel */
fdd9eb17 198 lkc = trace_kernel_create_channel(chan);
54012638 199 if (lkc == NULL) {
20fe2104
DG
200 goto error;
201 }
202
ecc48a90 203 DBG3("Kernel create channel %s with attr: %d, %" PRIu64 ", %" PRIu64 ", %u, %u, %d, %d",
fdd9eb17 204 chan->name, lkc->channel->attr.overwrite,
173af62f
DG
205 lkc->channel->attr.subbuf_size, lkc->channel->attr.num_subbuf,
206 lkc->channel->attr.switch_timer_interval, lkc->channel->attr.read_timer_interval,
ecc48a90 207 lkc->channel->attr.live_timer_interval, lkc->channel->attr.output);
173af62f 208
54012638 209 /* Kernel tracer channel creation */
f3ed775e 210 ret = kernctl_create_channel(session->fd, &lkc->channel->attr);
20fe2104 211 if (ret < 0) {
df0f840b 212 PERROR("ioctl kernel create channel");
20fe2104
DG
213 goto error;
214 }
215
54012638 216 /* Setup the channel fd */
20fe2104 217 lkc->fd = ret;
7b395890
DG
218 /* Prevent fd duplication after execlp() */
219 ret = fcntl(lkc->fd, F_SETFD, FD_CLOEXEC);
220 if (ret < 0) {
df0f840b 221 PERROR("fcntl session fd");
7b395890
DG
222 }
223
54012638 224 /* Add channel to session */
8c0faa1d
DG
225 cds_list_add(&lkc->list, &session->channel_list.head);
226 session->channel_count++;
fb5f35b6 227 lkc->session = session;
e1f3997a 228 lkc->key = ++next_kernel_channel_key;
20fe2104 229
e1f3997a
JD
230 DBG("Kernel channel %s created (fd: %d, key: %" PRIu64 ")",
231 lkc->channel->name, lkc->fd, lkc->key);
20fe2104
DG
232
233 return 0;
234
235error:
5f62c685
DG
236 if (lkc) {
237 free(lkc->channel);
238 free(lkc);
239 }
54012638 240 return -1;
20fe2104 241}
f34daff7 242
352b58f5
JR
243/*
244 * Create a kernel event notifier group, register it to the kernel tracer and
245 * add it to the kernel session.
246 */
247static int kernel_create_event_notifier_group(int *event_notifier_group_fd)
248{
249 int ret;
250 int local_fd = -1;
251
a0377dfe 252 LTTNG_ASSERT(event_notifier_group_fd);
352b58f5
JR
253
254 /* Kernel event notifier group creation. */
255 ret = kernctl_create_event_notifier_group(kernel_tracer_fd);
256 if (ret < 0) {
257 PERROR("Failed to create kernel event notifier group");
258 ret = -1;
259 goto error;
260 }
261
262 local_fd = ret;
263
264 /* Prevent fd duplication after execlp(). */
265 ret = fcntl(local_fd, F_SETFD, FD_CLOEXEC);
266 if (ret < 0) {
267 PERROR("Failed to set FD_CLOEXEC on kernel event notifier group file descriptor: fd = %d",
268 local_fd);
269 goto error;
270 }
271
272 DBG("Created kernel event notifier group: fd = %d", local_fd);
273 *event_notifier_group_fd = local_fd;
274 local_fd = -1;
275 ret = 0;
276error:
277 if (local_fd >= 0) {
278 ret = close(local_fd);
279 if (ret) {
280 PERROR("Failed to close kernel event notifier group file descriptor: fd = %d",
281 local_fd);
282 }
283 }
284
285 return ret;
286}
287
410b78a0
FD
288/*
289 * Compute the offset of the instrumentation byte in the binary based on the
290 * function probe location using the ELF lookup method.
291 *
292 * Returns 0 on success and set the offset out parameter to the offset of the
293 * elf symbol
294 * Returns -1 on error
295 */
296static
297int extract_userspace_probe_offset_function_elf(
87597c2c 298 const struct lttng_userspace_probe_location *probe_location,
0a398bc4 299 uid_t uid, gid_t gid, uint64_t *offset)
410b78a0
FD
300{
301 int fd;
302 int ret = 0;
303 const char *symbol = NULL;
87597c2c 304 const struct lttng_userspace_probe_location_lookup_method *lookup = NULL;
410b78a0
FD
305 enum lttng_userspace_probe_location_lookup_method_type lookup_method_type;
306
a0377dfe 307 LTTNG_ASSERT(lttng_userspace_probe_location_get_type(probe_location) ==
410b78a0
FD
308 LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION);
309
310 lookup = lttng_userspace_probe_location_get_lookup_method(
311 probe_location);
312 if (!lookup) {
313 ret = -1;
314 goto end;
315 }
316
317 lookup_method_type =
318 lttng_userspace_probe_location_lookup_method_get_type(lookup);
319
a0377dfe 320 LTTNG_ASSERT(lookup_method_type ==
410b78a0
FD
321 LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF);
322
323 symbol = lttng_userspace_probe_location_function_get_function_name(
324 probe_location);
325 if (!symbol) {
326 ret = -1;
327 goto end;
328 }
329
330 fd = lttng_userspace_probe_location_function_get_binary_fd(probe_location);
331 if (fd < 0) {
332 ret = -1;
333 goto end;
334 }
335
0a398bc4 336 ret = run_as_extract_elf_symbol_offset(fd, symbol, uid, gid, offset);
410b78a0
FD
337 if (ret < 0) {
338 DBG("userspace probe offset calculation failed for "
339 "function %s", symbol);
340 goto end;
341 }
342
343 DBG("userspace probe elf offset for %s is 0x%jd", symbol, (intmax_t)(*offset));
344end:
345 return ret;
346}
347
348/*
349 * Compute the offsets of the instrumentation bytes in the binary based on the
350 * tracepoint probe location using the SDT lookup method. This function
351 * allocates the offsets buffer, the caller must free it.
352 *
353 * Returns 0 on success and set the offset out parameter to the offsets of the
354 * SDT tracepoint.
355 * Returns -1 on error.
356 */
357static
358int extract_userspace_probe_offset_tracepoint_sdt(
87597c2c 359 const struct lttng_userspace_probe_location *probe_location,
0a398bc4 360 uid_t uid, gid_t gid, uint64_t **offsets,
410b78a0
FD
361 uint32_t *offsets_count)
362{
363 enum lttng_userspace_probe_location_lookup_method_type lookup_method_type;
87597c2c 364 const struct lttng_userspace_probe_location_lookup_method *lookup = NULL;
410b78a0
FD
365 const char *probe_name = NULL, *provider_name = NULL;
366 int ret = 0;
367 int fd, i;
368
a0377dfe 369 LTTNG_ASSERT(lttng_userspace_probe_location_get_type(probe_location) ==
410b78a0
FD
370 LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT);
371
372 lookup = lttng_userspace_probe_location_get_lookup_method(probe_location);
373 if (!lookup) {
374 ret = -1;
375 goto end;
376 }
377
378 lookup_method_type =
379 lttng_userspace_probe_location_lookup_method_get_type(lookup);
380
a0377dfe 381 LTTNG_ASSERT(lookup_method_type ==
410b78a0
FD
382 LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT);
383
384
385 probe_name = lttng_userspace_probe_location_tracepoint_get_probe_name(
386 probe_location);
387 if (!probe_name) {
388 ret = -1;
389 goto end;
390 }
391
392 provider_name = lttng_userspace_probe_location_tracepoint_get_provider_name(
393 probe_location);
394 if (!provider_name) {
395 ret = -1;
396 goto end;
397 }
398
399 fd = lttng_userspace_probe_location_tracepoint_get_binary_fd(probe_location);
400 if (fd < 0) {
401 ret = -1;
402 goto end;
403 }
404
405 ret = run_as_extract_sdt_probe_offsets(fd, provider_name, probe_name,
0a398bc4 406 uid, gid, offsets, offsets_count);
410b78a0
FD
407 if (ret < 0) {
408 DBG("userspace probe offset calculation failed for sdt "
409 "probe %s:%s", provider_name, probe_name);
410 goto end;
411 }
412
413 if (*offsets_count == 0) {
414 DBG("no userspace probe offset found");
415 goto end;
416 }
417
418 DBG("%u userspace probe SDT offsets found for %s:%s at:",
419 *offsets_count, provider_name, probe_name);
420 for (i = 0; i < *offsets_count; i++) {
421 DBG("\t0x%jd", (intmax_t)((*offsets)[i]));
422 }
423end:
424 return ret;
425}
426
410b78a0 427static
0a398bc4
FD
428int userspace_probe_add_callsite(
429 const struct lttng_userspace_probe_location *location,
430 uid_t uid, gid_t gid, int fd)
410b78a0 431{
87597c2c 432 const struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL;
410b78a0 433 enum lttng_userspace_probe_location_lookup_method_type type;
410b78a0
FD
434 int ret;
435
0a398bc4 436 lookup_method = lttng_userspace_probe_location_get_lookup_method(location);
410b78a0
FD
437 if (!lookup_method) {
438 ret = -1;
439 goto end;
440 }
441
442 type = lttng_userspace_probe_location_lookup_method_get_type(lookup_method);
443 switch (type) {
444 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF:
445 {
b8e2fb80 446 struct lttng_kernel_abi_event_callsite callsite;
410b78a0
FD
447 uint64_t offset;
448
0a398bc4
FD
449 ret = extract_userspace_probe_offset_function_elf(location,
450 uid, gid, &offset);
410b78a0
FD
451 if (ret) {
452 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
453 goto end;
454 }
455
456 callsite.u.uprobe.offset = offset;
457 ret = kernctl_add_callsite(fd, &callsite);
458 if (ret) {
0a398bc4 459 WARN("Failed to add callsite to ELF userspace probe.");
410b78a0
FD
460 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
461 goto end;
462 }
463 break;
464 }
465 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
466 {
467 int i;
468 uint64_t *offsets = NULL;
469 uint32_t offsets_count;
b8e2fb80 470 struct lttng_kernel_abi_event_callsite callsite;
410b78a0
FD
471
472 /*
473 * This call allocates the offsets buffer. This buffer must be freed
474 * by the caller
475 */
0a398bc4
FD
476 ret = extract_userspace_probe_offset_tracepoint_sdt(location,
477 uid, gid, &offsets, &offsets_count);
410b78a0
FD
478 if (ret) {
479 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
480 goto end;
481 }
482 for (i = 0; i < offsets_count; i++) {
483 callsite.u.uprobe.offset = offsets[i];
484 ret = kernctl_add_callsite(fd, &callsite);
485 if (ret) {
0a398bc4 486 WARN("Failed to add callsite to SDT userspace probe");
410b78a0
FD
487 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
488 free(offsets);
489 goto end;
490 }
491 }
492 free(offsets);
493 break;
494 }
495 default:
496 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
497 goto end;
498 }
499end:
500 return ret;
501}
502
0a398bc4
FD
503/*
504 * Extract the offsets of the instrumentation point for the different lookup
505 * methods.
506 */
507static
508int userspace_probe_event_add_callsites(struct lttng_event *ev,
509 struct ltt_kernel_session *session, int fd)
510{
511 int ret;
512 const struct lttng_userspace_probe_location *location = NULL;
513
a0377dfe
FD
514 LTTNG_ASSERT(ev);
515 LTTNG_ASSERT(ev->type == LTTNG_EVENT_USERSPACE_PROBE);
0a398bc4
FD
516
517 location = lttng_event_get_userspace_probe_location(ev);
518 if (!location) {
519 ret = -1;
520 goto end;
521 }
522
523 ret = userspace_probe_add_callsite(location, session->uid, session->gid,
524 fd);
525 if (ret) {
526 WARN("Failed to add callsite to userspace probe event '%s'",
527 ev->name);
528 }
529
530end:
531 return ret;
532}
533
352b58f5
JR
534/*
535 * Extract the offsets of the instrumentation point for the different look-up
536 * methods.
537 */
538static int userspace_probe_event_rule_add_callsites(
539 const struct lttng_event_rule *rule,
540 const struct lttng_credentials *creds,
541 int fd)
542{
543 int ret;
544 enum lttng_event_rule_status status;
545 enum lttng_event_rule_type event_rule_type;
546 const struct lttng_userspace_probe_location *location = NULL;
547
a0377dfe
FD
548 LTTNG_ASSERT(rule);
549 LTTNG_ASSERT(creds);
352b58f5
JR
550
551 event_rule_type = lttng_event_rule_get_type(rule);
a0377dfe 552 LTTNG_ASSERT(event_rule_type == LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE);
352b58f5 553
46fd07ac 554 status = lttng_event_rule_kernel_uprobe_get_location(rule, &location);
352b58f5
JR
555 if (status != LTTNG_EVENT_RULE_STATUS_OK || !location) {
556 ret = -1;
557 goto end;
558 }
559
560 ret = userspace_probe_add_callsite(location,
561 lttng_credentials_get_uid(creds),
562 lttng_credentials_get_gid(creds), fd);
563 if (ret) {
564 WARN("Failed to add callsite to user space probe object: fd = %d",
565 fd);
566 }
567
568end:
569 return ret;
570}
571
f34daff7 572/*
050349bb
DG
573 * Create a kernel event, enable it to the kernel tracer and add it to the
574 * channel event list of the kernel session.
49d21f93 575 * We own filter_expression and filter.
f34daff7 576 */
050349bb 577int kernel_create_event(struct lttng_event *ev,
00a62084
MD
578 struct ltt_kernel_channel *channel,
579 char *filter_expression,
2b00d462 580 struct lttng_bytecode *filter)
f34daff7 581{
71a3bb01
FD
582 int err, fd;
583 enum lttng_error_code ret;
f34daff7 584 struct ltt_kernel_event *event;
f34daff7 585
a0377dfe
FD
586 LTTNG_ASSERT(ev);
587 LTTNG_ASSERT(channel);
0525e9ae 588
a969e101 589 /* We pass ownership of filter_expression and filter */
71a3bb01
FD
590 ret = trace_kernel_create_event(ev, filter_expression,
591 filter, &event);
592 if (ret != LTTNG_OK) {
f34daff7
DG
593 goto error;
594 }
595
71a3bb01
FD
596 fd = kernctl_create_event(channel->fd, event->event);
597 if (fd < 0) {
598 switch (-fd) {
bd29c13d 599 case EEXIST:
71a3bb01 600 ret = LTTNG_ERR_KERN_EVENT_EXIST;
bd29c13d
DG
601 break;
602 case ENOSYS:
603 WARN("Event type not implemented");
71a3bb01 604 ret = LTTNG_ERR_KERN_EVENT_ENOSYS;
bd29c13d 605 break;
8197a339
DG
606 case ENOENT:
607 WARN("Event %s not found!", ev->name);
71a3bb01 608 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
8197a339 609 break;
bd29c13d 610 default:
71a3bb01 611 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
d87bfb32
DG
612 PERROR("create event ioctl");
613 }
e953ef25 614 goto free_event;
8c0faa1d 615 }
f34daff7 616
d0ae4ea8 617 event->type = ev->type;
71a3bb01 618 event->fd = fd;
7b395890 619 /* Prevent fd duplication after execlp() */
71a3bb01
FD
620 err = fcntl(event->fd, F_SETFD, FD_CLOEXEC);
621 if (err < 0) {
df0f840b 622 PERROR("fcntl session fd");
7b395890
DG
623 }
624
00a62084 625 if (filter) {
71a3bb01
FD
626 err = kernctl_filter(event->fd, filter);
627 if (err < 0) {
628 switch (-err) {
629 case ENOMEM:
630 ret = LTTNG_ERR_FILTER_NOMEM;
631 break;
632 default:
633 ret = LTTNG_ERR_FILTER_INVAL;
634 break;
635 }
00a62084
MD
636 goto filter_error;
637 }
638 }
639
dcabc190 640 if (ev->type == LTTNG_EVENT_USERSPACE_PROBE) {
7966af57 641 ret = (lttng_error_code) userspace_probe_event_add_callsites(ev, channel->session,
0a398bc4 642 event->fd);
dcabc190
FD
643 if (ret) {
644 goto add_callsite_error;
645 }
646 }
647
71a3bb01
FD
648 err = kernctl_enable(event->fd);
649 if (err < 0) {
650 switch (-err) {
00a62084
MD
651 case EEXIST:
652 ret = LTTNG_ERR_KERN_EVENT_EXIST;
653 break;
654 default:
655 PERROR("enable kernel event");
71a3bb01 656 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
00a62084
MD
657 break;
658 }
659 goto enable_error;
660 }
661
f3ed775e
DG
662 /* Add event to event list */
663 cds_list_add(&event->list, &channel->events_list.head);
cbbbb275
DG
664 channel->event_count++;
665
e953ef25
DG
666 DBG("Event %s created (fd: %d)", ev->name, event->fd);
667
668 return 0;
669
dcabc190 670add_callsite_error:
00a62084
MD
671enable_error:
672filter_error:
673 {
674 int closeret;
675
676 closeret = close(event->fd);
677 if (closeret) {
678 PERROR("close event fd");
679 }
680 }
e953ef25
DG
681free_event:
682 free(event);
683error:
d87bfb32 684 return ret;
e953ef25
DG
685}
686
26cc6b4e 687/*
050349bb 688 * Disable a kernel channel.
26cc6b4e
DG
689 */
690int kernel_disable_channel(struct ltt_kernel_channel *chan)
691{
692 int ret;
693
a0377dfe 694 LTTNG_ASSERT(chan);
0525e9ae 695
26cc6b4e
DG
696 ret = kernctl_disable(chan->fd);
697 if (ret < 0) {
df0f840b 698 PERROR("disable chan ioctl");
26cc6b4e
DG
699 goto error;
700 }
701
702 chan->enabled = 0;
e1f3997a
JD
703 DBG("Kernel channel %s disabled (fd: %d, key: %" PRIu64 ")",
704 chan->channel->name, chan->fd, chan->key);
26cc6b4e
DG
705
706 return 0;
707
708error:
709 return ret;
710}
711
d36b8583 712/*
050349bb 713 * Enable a kernel channel.
d36b8583
DG
714 */
715int kernel_enable_channel(struct ltt_kernel_channel *chan)
716{
717 int ret;
718
a0377dfe 719 LTTNG_ASSERT(chan);
0525e9ae 720
d36b8583 721 ret = kernctl_enable(chan->fd);
32af2c95 722 if (ret < 0 && ret != -EEXIST) {
df0f840b 723 PERROR("Enable kernel chan");
d36b8583
DG
724 goto error;
725 }
726
727 chan->enabled = 1;
e1f3997a
JD
728 DBG("Kernel channel %s enabled (fd: %d, key: %" PRIu64 ")",
729 chan->channel->name, chan->fd, chan->key);
d36b8583
DG
730
731 return 0;
732
733error:
734 return ret;
735}
736
19e70852 737/*
050349bb 738 * Enable a kernel event.
19e70852
DG
739 */
740int kernel_enable_event(struct ltt_kernel_event *event)
741{
742 int ret;
743
a0377dfe 744 LTTNG_ASSERT(event);
0525e9ae 745
19e70852 746 ret = kernctl_enable(event->fd);
42224349 747 if (ret < 0) {
32af2c95 748 switch (-ret) {
42224349 749 case EEXIST:
f73fabfd 750 ret = LTTNG_ERR_KERN_EVENT_EXIST;
42224349
DG
751 break;
752 default:
753 PERROR("enable kernel event");
754 break;
755 }
19e70852
DG
756 goto error;
757 }
758
759 event->enabled = 1;
760 DBG("Kernel event %s enabled (fd: %d)", event->event->name, event->fd);
761
762 return 0;
763
764error:
d36b8583 765 return ret;
19e70852
DG
766}
767
e953ef25 768/*
050349bb 769 * Disable a kernel event.
e953ef25 770 */
19e70852 771int kernel_disable_event(struct ltt_kernel_event *event)
e953ef25
DG
772{
773 int ret;
19e70852 774
a0377dfe 775 LTTNG_ASSERT(event);
0525e9ae 776
19e70852 777 ret = kernctl_disable(event->fd);
42224349 778 if (ret < 0) {
d79bd829
JG
779 PERROR("Failed to disable kernel event: name = '%s', fd = %d",
780 event->event->name, event->fd);
19e70852 781 goto error;
e953ef25 782 }
f3ed775e 783
19e70852
DG
784 event->enabled = 0;
785 DBG("Kernel event %s disabled (fd: %d)", event->event->name, event->fd);
786
f34daff7
DG
787 return 0;
788
789error:
d36b8583 790 return ret;
f34daff7 791}
aaf26714 792
352b58f5
JR
793/*
794 * Disable a kernel event notifier.
795 */
796static
797int kernel_disable_event_notifier_rule(struct ltt_kernel_event_notifier_rule *event)
798{
799 int ret;
800
a0377dfe 801 LTTNG_ASSERT(event);
352b58f5
JR
802
803 rcu_read_lock();
804 cds_lfht_del(kernel_token_to_event_notifier_rule_ht, &event->ht_node);
805 rcu_read_unlock();
806
807 ret = kernctl_disable(event->fd);
808 if (ret < 0) {
d79bd829
JG
809 PERROR("Failed to disable kernel event notifier: fd = %d, token = %" PRIu64,
810 event->fd, event->token);
352b58f5
JR
811 goto error;
812 }
813
814 event->enabled = 0;
815 DBG("Disabled kernel event notifier: fd = %d, token = %" PRIu64,
816 event->fd, event->token);
817
818error:
819 return ret;
820}
821
159b042f
JG
822static
823struct process_attr_tracker *_kernel_get_process_attr_tracker(
55c9e7ca 824 struct ltt_kernel_session *session,
159b042f 825 enum lttng_process_attr process_attr)
55c9e7ca 826{
159b042f
JG
827 switch (process_attr) {
828 case LTTNG_PROCESS_ATTR_PROCESS_ID:
829 return session->tracker_pid;
830 case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
831 return session->tracker_vpid;
832 case LTTNG_PROCESS_ATTR_USER_ID:
833 return session->tracker_uid;
834 case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
835 return session->tracker_vuid;
836 case LTTNG_PROCESS_ATTR_GROUP_ID:
837 return session->tracker_gid;
838 case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
839 return session->tracker_vgid;
55c9e7ca
JR
840 default:
841 return NULL;
842 }
843}
6e911cad 844
159b042f 845const struct process_attr_tracker *kernel_get_process_attr_tracker(
55c9e7ca 846 struct ltt_kernel_session *session,
159b042f 847 enum lttng_process_attr process_attr)
ccf10263 848{
159b042f
JG
849 return (const struct process_attr_tracker *)
850 _kernel_get_process_attr_tracker(session, process_attr);
851}
7c493d31 852
159b042f
JG
853enum lttng_error_code kernel_process_attr_tracker_set_tracking_policy(
854 struct ltt_kernel_session *session,
855 enum lttng_process_attr process_attr,
856 enum lttng_tracking_policy policy)
857{
858 int ret;
859 enum lttng_error_code ret_code = LTTNG_OK;
860 struct process_attr_tracker *tracker =
861 _kernel_get_process_attr_tracker(session, process_attr);
862 enum lttng_tracking_policy previous_policy;
55c9e7ca 863
159b042f
JG
864 if (!tracker) {
865 ret_code = LTTNG_ERR_INVALID;
866 goto end;
7c493d31 867 }
ccf10263 868
159b042f
JG
869 previous_policy = process_attr_tracker_get_tracking_policy(tracker);
870 ret = process_attr_tracker_set_tracking_policy(tracker, policy);
871 if (ret) {
872 ret_code = LTTNG_ERR_UNK;
873 goto end;
55c9e7ca 874 }
7c493d31 875
159b042f 876 if (previous_policy == policy) {
55c9e7ca 877 goto end;
7c493d31 878 }
55c9e7ca 879
159b042f
JG
880 switch (policy) {
881 case LTTNG_TRACKING_POLICY_INCLUDE_ALL:
882 if (process_attr == LTTNG_PROCESS_ATTR_PROCESS_ID) {
883 /*
884 * Maintain a special case for the process ID process
885 * attribute tracker as it was the only supported
886 * attribute prior to 2.12.
887 */
888 ret = kernctl_track_pid(session->fd, -1);
889 } else {
890 ret = kernctl_track_id(session->fd, process_attr, -1);
55c9e7ca
JR
891 }
892 break;
159b042f
JG
893 case LTTNG_TRACKING_POLICY_EXCLUDE_ALL:
894 case LTTNG_TRACKING_POLICY_INCLUDE_SET:
895 /* fall-through. */
896 if (process_attr == LTTNG_PROCESS_ATTR_PROCESS_ID) {
897 /*
898 * Maintain a special case for the process ID process
899 * attribute tracker as it was the only supported
900 * attribute prior to 2.12.
901 */
902 ret = kernctl_untrack_pid(session->fd, -1);
903 } else {
904 ret = kernctl_untrack_id(session->fd, process_attr, -1);
55c9e7ca
JR
905 }
906 break;
907 default:
159b042f 908 abort();
55c9e7ca 909 }
159b042f 910 /* kern-ctl error handling */
32af2c95 911 switch (-ret) {
159b042f
JG
912 case 0:
913 ret_code = LTTNG_OK;
914 break;
7c493d31 915 case EINVAL:
159b042f 916 ret_code = LTTNG_ERR_INVALID;
55c9e7ca 917 break;
7c493d31 918 case ENOMEM:
159b042f 919 ret_code = LTTNG_ERR_NOMEM;
55c9e7ca
JR
920 break;
921 case EEXIST:
159b042f 922 ret_code = LTTNG_ERR_PROCESS_ATTR_EXISTS;
55c9e7ca 923 break;
7c493d31 924 default:
159b042f 925 ret_code = LTTNG_ERR_UNK;
55c9e7ca
JR
926 break;
927 }
55c9e7ca 928end:
159b042f 929 return ret_code;
ccf10263
MD
930}
931
159b042f 932enum lttng_error_code kernel_process_attr_tracker_inclusion_set_add_value(
55c9e7ca 933 struct ltt_kernel_session *session,
159b042f
JG
934 enum lttng_process_attr process_attr,
935 const struct process_attr_value *value)
a5dfbb9d 936{
159b042f
JG
937 int ret, integral_value;
938 enum lttng_error_code ret_code;
939 struct process_attr_tracker *tracker;
940 enum process_attr_tracker_status status;
a5dfbb9d 941
159b042f
JG
942 /*
943 * Convert process attribute tracker value to the integral
944 * representation required by the kern-ctl API.
945 */
946 switch (process_attr) {
947 case LTTNG_PROCESS_ATTR_PROCESS_ID:
948 case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
949 integral_value = (int) value->value.pid;
55c9e7ca 950 break;
159b042f
JG
951 case LTTNG_PROCESS_ATTR_USER_ID:
952 case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
953 if (value->type == LTTNG_PROCESS_ATTR_VALUE_TYPE_USER_NAME) {
954 uid_t uid;
955
956 ret_code = utils_user_id_from_name(
957 value->value.user_name, &uid);
958 if (ret_code != LTTNG_OK) {
959 goto end;
960 }
961 integral_value = (int) uid;
962 } else {
963 integral_value = (int) value->value.uid;
55c9e7ca
JR
964 }
965 break;
159b042f
JG
966 case LTTNG_PROCESS_ATTR_GROUP_ID:
967 case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
968 if (value->type == LTTNG_PROCESS_ATTR_VALUE_TYPE_GROUP_NAME) {
969 gid_t gid;
970
971 ret_code = utils_group_id_from_name(
972 value->value.group_name, &gid);
973 if (ret_code != LTTNG_OK) {
974 goto end;
975 }
976 integral_value = (int) gid;
977 } else {
978 integral_value = (int) value->value.gid;
a5dfbb9d 979 }
55c9e7ca
JR
980 break;
981 default:
159b042f
JG
982 ret_code = LTTNG_ERR_INVALID;
983 goto end;
55c9e7ca
JR
984 }
985
159b042f
JG
986 tracker = _kernel_get_process_attr_tracker(session, process_attr);
987 if (!tracker) {
988 ret_code = LTTNG_ERR_INVALID;
989 goto end;
990 }
991
992 status = process_attr_tracker_inclusion_set_add_value(tracker, value);
993 if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
994 switch (status) {
995 case PROCESS_ATTR_TRACKER_STATUS_EXISTS:
996 ret_code = LTTNG_ERR_PROCESS_ATTR_EXISTS;
997 break;
998 case PROCESS_ATTR_TRACKER_STATUS_INVALID_TRACKING_POLICY:
999 ret_code = LTTNG_ERR_PROCESS_ATTR_TRACKER_INVALID_TRACKING_POLICY;
1000 break;
1001 case PROCESS_ATTR_TRACKER_STATUS_ERROR:
1002 default:
1003 ret_code = LTTNG_ERR_UNK;
1004 break;
1005 }
1006 goto end;
1007 }
1008
1009 DBG("Kernel track %s %d for session id %" PRIu64,
1010 lttng_process_attr_to_string(process_attr),
1011 integral_value, session->id);
1012 if (process_attr == LTTNG_PROCESS_ATTR_PROCESS_ID) {
1013 /*
1014 * Maintain a special case for the process ID process attribute
1015 * tracker as it was the only supported attribute prior to 2.12.
1016 */
1017 ret = kernctl_track_pid(session->fd, integral_value);
1018 } else {
1019 ret = kernctl_track_id(
1020 session->fd, process_attr, integral_value);
1021 }
1022 if (ret == 0) {
1023 ret_code = LTTNG_OK;
1024 goto end;
1025 }
1026
1027 kernel_wait_quiescent();
1028
1029 /* kern-ctl error handling */
55c9e7ca 1030 switch (-ret) {
159b042f
JG
1031 case 0:
1032 ret_code = LTTNG_OK;
1033 break;
55c9e7ca 1034 case EINVAL:
159b042f 1035 ret_code = LTTNG_ERR_INVALID;
55c9e7ca
JR
1036 break;
1037 case ENOMEM:
159b042f 1038 ret_code = LTTNG_ERR_NOMEM;
55c9e7ca
JR
1039 break;
1040 case EEXIST:
159b042f 1041 ret_code = LTTNG_ERR_PROCESS_ATTR_EXISTS;
55c9e7ca
JR
1042 break;
1043 default:
159b042f 1044 ret_code = LTTNG_ERR_UNK;
55c9e7ca 1045 break;
a5dfbb9d
MD
1046 }
1047
159b042f
JG
1048 /* Attempt to remove the value from the tracker. */
1049 status = process_attr_tracker_inclusion_set_remove_value(
1050 tracker, value);
1051 if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
1052 ERR("Failed to roll-back the tracking of kernel %s process attribute %d while handling a kern-ctl error",
1053 lttng_process_attr_to_string(process_attr),
1054 integral_value);
55c9e7ca 1055 }
a5dfbb9d 1056end:
159b042f 1057 return ret_code;
55c9e7ca 1058}
a5dfbb9d 1059
159b042f 1060enum lttng_error_code kernel_process_attr_tracker_inclusion_set_remove_value(
55c9e7ca 1061 struct ltt_kernel_session *session,
159b042f
JG
1062 enum lttng_process_attr process_attr,
1063 const struct process_attr_value *value)
55c9e7ca 1064{
159b042f
JG
1065 int ret, integral_value;
1066 enum lttng_error_code ret_code;
1067 struct process_attr_tracker *tracker;
1068 enum process_attr_tracker_status status;
1069
1070 /*
1071 * Convert process attribute tracker value to the integral
1072 * representation required by the kern-ctl API.
1073 */
1074 switch (process_attr) {
1075 case LTTNG_PROCESS_ATTR_PROCESS_ID:
1076 case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
1077 integral_value = (int) value->value.pid;
1078 break;
1079 case LTTNG_PROCESS_ATTR_USER_ID:
1080 case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
1081 if (value->type == LTTNG_PROCESS_ATTR_VALUE_TYPE_USER_NAME) {
1082 uid_t uid;
1083
1084 ret_code = utils_user_id_from_name(
1085 value->value.user_name, &uid);
1086 if (ret_code != LTTNG_OK) {
1087 goto end;
1088 }
1089 integral_value = (int) uid;
1090 } else {
1091 integral_value = (int) value->value.uid;
1092 }
1093 break;
1094 case LTTNG_PROCESS_ATTR_GROUP_ID:
1095 case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
1096 if (value->type == LTTNG_PROCESS_ATTR_VALUE_TYPE_GROUP_NAME) {
1097 gid_t gid;
1098
1099 ret_code = utils_group_id_from_name(
1100 value->value.group_name, &gid);
1101 if (ret_code != LTTNG_OK) {
1102 goto end;
1103 }
1104 integral_value = (int) gid;
1105 } else {
1106 integral_value = (int) value->value.gid;
1107 }
1108 break;
1109 default:
1110 ret_code = LTTNG_ERR_INVALID;
1111 goto end;
1112 }
55c9e7ca 1113
159b042f
JG
1114 tracker = _kernel_get_process_attr_tracker(session, process_attr);
1115 if (!tracker) {
1116 ret_code = LTTNG_ERR_INVALID;
a7a533cd 1117 goto end;
a5dfbb9d 1118 }
a7a533cd 1119
159b042f
JG
1120 status = process_attr_tracker_inclusion_set_remove_value(
1121 tracker, value);
1122 if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
1123 switch (status) {
1124 case PROCESS_ATTR_TRACKER_STATUS_MISSING:
1125 ret_code = LTTNG_ERR_PROCESS_ATTR_MISSING;
1126 break;
1127 case PROCESS_ATTR_TRACKER_STATUS_INVALID_TRACKING_POLICY:
1128 ret_code = LTTNG_ERR_PROCESS_ATTR_TRACKER_INVALID_TRACKING_POLICY;
1129 break;
1130 case PROCESS_ATTR_TRACKER_STATUS_ERROR:
1131 default:
1132 ret_code = LTTNG_ERR_UNK;
1133 break;
1134 }
a7a533cd
JR
1135 goto end;
1136 }
1137
159b042f
JG
1138 DBG("Kernel track %s %d for session id %" PRIu64,
1139 lttng_process_attr_to_string(process_attr),
1140 integral_value, session->id);
1141 if (process_attr == LTTNG_PROCESS_ATTR_PROCESS_ID) {
1142 /*
1143 * Maintain a special case for the process ID process attribute
1144 * tracker as it was the only supported attribute prior to 2.12.
1145 */
1146 ret = kernctl_untrack_pid(session->fd, integral_value);
1147 } else {
1148 ret = kernctl_untrack_id(
1149 session->fd, process_attr, integral_value);
1150 }
1151 if (ret == 0) {
1152 ret_code = LTTNG_OK;
1153 goto end;
1154 }
1155 kernel_wait_quiescent();
1156
1157 /* kern-ctl error handling */
1158 switch (-ret) {
1159 case 0:
1160 ret_code = LTTNG_OK;
1161 break;
1162 case EINVAL:
1163 ret_code = LTTNG_ERR_INVALID;
1164 break;
1165 case ENOMEM:
1166 ret_code = LTTNG_ERR_NOMEM;
1167 break;
1168 case ENOENT:
1169 ret_code = LTTNG_ERR_PROCESS_ATTR_MISSING;
1170 break;
1171 default:
1172 ret_code = LTTNG_ERR_UNK;
1173 break;
1174 }
1175
1176 /* Attempt to add the value to the tracker. */
1177 status = process_attr_tracker_inclusion_set_add_value(
1178 tracker, value);
1179 if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
1180 ERR("Failed to roll-back the tracking of kernel %s process attribute %d while handling a kern-ctl error",
1181 lttng_process_attr_to_string(process_attr),
1182 integral_value);
1183 }
a7a533cd 1184end:
159b042f 1185 return ret_code;
a5dfbb9d
MD
1186}
1187
aaf26714 1188/*
050349bb
DG
1189 * Create kernel metadata, open from the kernel tracer and add it to the
1190 * kernel session.
aaf26714 1191 */
a4b92340 1192int kernel_open_metadata(struct ltt_kernel_session *session)
aaf26714
DG
1193{
1194 int ret;
74024a21 1195 struct ltt_kernel_metadata *lkm = NULL;
aaf26714 1196
a0377dfe 1197 LTTNG_ASSERT(session);
0525e9ae 1198
54012638 1199 /* Allocate kernel metadata */
a4b92340 1200 lkm = trace_kernel_create_metadata();
54012638 1201 if (lkm == NULL) {
aaf26714
DG
1202 goto error;
1203 }
1204
54012638 1205 /* Kernel tracer metadata creation */
f3ed775e 1206 ret = kernctl_open_metadata(session->fd, &lkm->conf->attr);
aaf26714 1207 if (ret < 0) {
74024a21 1208 goto error_open;
aaf26714
DG
1209 }
1210
8c0faa1d 1211 lkm->fd = ret;
d40f0359 1212 lkm->key = ++next_kernel_channel_key;
7b395890
DG
1213 /* Prevent fd duplication after execlp() */
1214 ret = fcntl(lkm->fd, F_SETFD, FD_CLOEXEC);
1215 if (ret < 0) {
df0f840b 1216 PERROR("fcntl session fd");
7b395890
DG
1217 }
1218
aaf26714 1219 session->metadata = lkm;
8c0faa1d 1220
00e2e675 1221 DBG("Kernel metadata opened (fd: %d)", lkm->fd);
8c0faa1d
DG
1222
1223 return 0;
1224
74024a21
DG
1225error_open:
1226 trace_kernel_destroy_metadata(lkm);
8c0faa1d 1227error:
54012638 1228 return -1;
8c0faa1d
DG
1229}
1230
1231/*
050349bb 1232 * Start tracing session.
8c0faa1d
DG
1233 */
1234int kernel_start_session(struct ltt_kernel_session *session)
1235{
1236 int ret;
1237
a0377dfe 1238 LTTNG_ASSERT(session);
0525e9ae 1239
8c0faa1d
DG
1240 ret = kernctl_start_session(session->fd);
1241 if (ret < 0) {
df0f840b 1242 PERROR("ioctl start session");
8c0faa1d
DG
1243 goto error;
1244 }
1245
1246 DBG("Kernel session started");
1247
1248 return 0;
1249
1250error:
1251 return ret;
1252}
1253
f3ed775e 1254/*
050349bb 1255 * Make a kernel wait to make sure in-flight probe have completed.
f3ed775e 1256 */
7d268848 1257void kernel_wait_quiescent(void)
f3ed775e
DG
1258{
1259 int ret;
7d268848 1260 int fd = kernel_tracer_fd;
f3ed775e
DG
1261
1262 DBG("Kernel quiescent wait on %d", fd);
1263
1264 ret = kernctl_wait_quiescent(fd);
1265 if (ret < 0) {
df0f840b 1266 PERROR("wait quiescent ioctl");
f3ed775e
DG
1267 ERR("Kernel quiescent wait failed");
1268 }
1269}
1270
1271/*
f3ed775e
DG
1272 * Force flush buffer of metadata.
1273 */
1274int kernel_metadata_flush_buffer(int fd)
1275{
1276 int ret;
1277
169d2cb7
DG
1278 DBG("Kernel flushing metadata buffer on fd %d", fd);
1279
f3ed775e
DG
1280 ret = kernctl_buffer_flush(fd);
1281 if (ret < 0) {
00e2e675 1282 ERR("Fail to flush metadata buffers %d (ret: %d)", fd, ret);
f3ed775e
DG
1283 }
1284
1285 return 0;
1286}
1287
1288/*
050349bb 1289 * Force flush buffer for channel.
f3ed775e
DG
1290 */
1291int kernel_flush_buffer(struct ltt_kernel_channel *channel)
1292{
1293 int ret;
1294 struct ltt_kernel_stream *stream;
1295
a0377dfe 1296 LTTNG_ASSERT(channel);
0525e9ae 1297
f3ed775e
DG
1298 DBG("Flush buffer for channel %s", channel->channel->name);
1299
1300 cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
1301 DBG("Flushing channel stream %d", stream->fd);
1302 ret = kernctl_buffer_flush(stream->fd);
1303 if (ret < 0) {
df0f840b 1304 PERROR("ioctl");
f3ed775e
DG
1305 ERR("Fail to flush buffer for stream %d (ret: %d)",
1306 stream->fd, ret);
1307 }
1308 }
1309
1310 return 0;
1311}
1312
8c0faa1d 1313/*
050349bb 1314 * Stop tracing session.
8c0faa1d
DG
1315 */
1316int kernel_stop_session(struct ltt_kernel_session *session)
1317{
1318 int ret;
1319
a0377dfe 1320 LTTNG_ASSERT(session);
0525e9ae 1321
8c0faa1d
DG
1322 ret = kernctl_stop_session(session->fd);
1323 if (ret < 0) {
1324 goto error;
1325 }
1326
1327 DBG("Kernel session stopped");
1328
1329 return 0;
1330
1331error:
1332 return ret;
1333}
1334
1335/*
050349bb
DG
1336 * Open stream of channel, register it to the kernel tracer and add it
1337 * to the stream list of the channel.
8c0faa1d 1338 *
1cfb4b98
MD
1339 * Note: given that the streams may appear in random order wrt CPU
1340 * number (e.g. cpu hotplug), the index value of the stream number in
1341 * the stream name is not necessarily linked to the CPU number.
1342 *
050349bb 1343 * Return the number of created stream. Else, a negative value.
8c0faa1d 1344 */
f3ed775e 1345int kernel_open_channel_stream(struct ltt_kernel_channel *channel)
8c0faa1d 1346{
1cfb4b98 1347 int ret;
8c0faa1d
DG
1348 struct ltt_kernel_stream *lks;
1349
a0377dfe 1350 LTTNG_ASSERT(channel);
0525e9ae 1351
5a47c6a2 1352 while ((ret = kernctl_create_stream(channel->fd)) >= 0) {
1cfb4b98
MD
1353 lks = trace_kernel_create_stream(channel->channel->name,
1354 channel->stream_count);
8c0faa1d 1355 if (lks == NULL) {
799e2c4f
MD
1356 ret = close(ret);
1357 if (ret) {
1358 PERROR("close");
1359 }
8c0faa1d
DG
1360 goto error;
1361 }
1362
1363 lks->fd = ret;
7b395890
DG
1364 /* Prevent fd duplication after execlp() */
1365 ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
1366 if (ret < 0) {
df0f840b 1367 PERROR("fcntl session fd");
7b395890
DG
1368 }
1369
1624d5b7
JD
1370 lks->tracefile_size = channel->channel->attr.tracefile_size;
1371 lks->tracefile_count = channel->channel->attr.tracefile_count;
1372
1cfb4b98 1373 /* Add stream to channel stream list */
8c0faa1d
DG
1374 cds_list_add(&lks->list, &channel->stream_list.head);
1375 channel->stream_count++;
8c0faa1d 1376
00e2e675
DG
1377 DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd,
1378 lks->state);
54012638 1379 }
8c0faa1d
DG
1380
1381 return channel->stream_count;
1382
1383error:
54012638 1384 return -1;
8c0faa1d
DG
1385}
1386
1387/*
050349bb 1388 * Open the metadata stream and set it to the kernel session.
8c0faa1d 1389 */
f3ed775e 1390int kernel_open_metadata_stream(struct ltt_kernel_session *session)
8c0faa1d
DG
1391{
1392 int ret;
1393
a0377dfe 1394 LTTNG_ASSERT(session);
0525e9ae 1395
8c0faa1d
DG
1396 ret = kernctl_create_stream(session->metadata->fd);
1397 if (ret < 0) {
df0f840b 1398 PERROR("kernel create metadata stream");
8c0faa1d
DG
1399 goto error;
1400 }
1401
1402 DBG("Kernel metadata stream created (fd: %d)", ret);
1403 session->metadata_stream_fd = ret;
7b395890
DG
1404 /* Prevent fd duplication after execlp() */
1405 ret = fcntl(session->metadata_stream_fd, F_SETFD, FD_CLOEXEC);
1406 if (ret < 0) {
df0f840b 1407 PERROR("fcntl session fd");
7b395890 1408 }
aaf26714
DG
1409
1410 return 0;
1411
1412error:
54012638 1413 return -1;
aaf26714 1414}
2ef84c95
DG
1415
1416/*
9f19cc17 1417 * Get the event list from the kernel tracer and return the number of elements.
2ef84c95 1418 */
7d268848 1419ssize_t kernel_list_events(struct lttng_event **events)
2ef84c95 1420{
53efb85a 1421 int fd, ret;
9f19cc17
DG
1422 char *event;
1423 size_t nbmem, count = 0;
2ef84c95 1424 FILE *fp;
9f19cc17 1425 struct lttng_event *elist;
2ef84c95 1426
a0377dfe 1427 LTTNG_ASSERT(events);
0525e9ae 1428
7d268848 1429 fd = kernctl_tracepoint_list(kernel_tracer_fd);
2ef84c95 1430 if (fd < 0) {
df0f840b 1431 PERROR("kernel tracepoint list");
2ef84c95
DG
1432 goto error;
1433 }
1434
1435 fp = fdopen(fd, "r");
1436 if (fp == NULL) {
df0f840b 1437 PERROR("kernel tracepoint list fdopen");
61b73b12 1438 goto error_fp;
2ef84c95
DG
1439 }
1440
1441 /*
1442 * Init memory size counter
1443 * See kernel-ctl.h for explanation of this value
1444 */
6725fe19 1445 nbmem = KERNEL_EVENT_INIT_LIST_SIZE;
64803277 1446 elist = calloc<lttng_event>(nbmem);
3b870559
MD
1447 if (elist == NULL) {
1448 PERROR("alloc list events");
1449 count = -ENOMEM;
1450 goto end;
1451 }
2ef84c95 1452
53efb85a 1453 while (fscanf(fp, "event { name = %m[^;]; };\n", &event) == 1) {
6725fe19 1454 if (count >= nbmem) {
3b870559 1455 struct lttng_event *new_elist;
53efb85a 1456 size_t new_nbmem;
3b870559 1457
53efb85a
MD
1458 new_nbmem = nbmem << 1;
1459 DBG("Reallocating event list from %zu to %zu bytes",
1460 nbmem, new_nbmem);
7966af57 1461 new_elist = (lttng_event *) realloc(elist, new_nbmem * sizeof(struct lttng_event));
3b870559 1462 if (new_elist == NULL) {
df0f840b 1463 PERROR("realloc list events");
3b870559
MD
1464 free(event);
1465 free(elist);
61b73b12
MD
1466 count = -ENOMEM;
1467 goto end;
2ef84c95 1468 }
53efb85a
MD
1469 /* Zero the new memory */
1470 memset(new_elist + nbmem, 0,
1471 (new_nbmem - nbmem) * sizeof(struct lttng_event));
1472 nbmem = new_nbmem;
3b870559 1473 elist = new_elist;
2ef84c95 1474 }
99497cd0
MD
1475 strncpy(elist[count].name, event, LTTNG_SYMBOL_NAME_LEN);
1476 elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
67b9d018 1477 elist[count].enabled = -1;
9f19cc17 1478 count++;
3b870559 1479 free(event);
2ef84c95
DG
1480 }
1481
9f19cc17 1482 *events = elist;
ced2f820 1483 DBG("Kernel list events done (%zu events)", count);
61b73b12 1484end:
799e2c4f
MD
1485 ret = fclose(fp); /* closes both fp and fd */
1486 if (ret) {
1487 PERROR("fclose");
1488 }
9f19cc17 1489 return count;
2ef84c95 1490
61b73b12 1491error_fp:
799e2c4f
MD
1492 ret = close(fd);
1493 if (ret) {
1494 PERROR("close");
1495 }
2ef84c95
DG
1496error:
1497 return -1;
1498}
096102bd
DG
1499
1500/*
1501 * Get kernel version and validate it.
1502 */
b8e2fb80
FD
1503int kernel_validate_version(struct lttng_kernel_abi_tracer_version *version,
1504 struct lttng_kernel_abi_tracer_abi_version *abi_version)
096102bd
DG
1505{
1506 int ret;
096102bd 1507
7d268848 1508 ret = kernctl_tracer_version(kernel_tracer_fd, version);
096102bd 1509 if (ret < 0) {
521dd134 1510 ERR("Failed to retrieve the lttng-modules version");
096102bd
DG
1511 goto error;
1512 }
1513
1514 /* Validate version */
88076e89 1515 if (version->major != VERSION_MAJOR) {
c052142c 1516 ERR("Kernel tracer major version (%d) is not compatible with lttng-tools major version (%d)",
88076e89 1517 version->major, VERSION_MAJOR);
096102bd 1518 goto error_version;
096102bd 1519 }
7d268848 1520 ret = kernctl_tracer_abi_version(kernel_tracer_fd, abi_version);
c052142c 1521 if (ret < 0) {
521dd134 1522 ERR("Failed to retrieve lttng-modules ABI version");
c052142c
MD
1523 goto error;
1524 }
b8e2fb80 1525 if (abi_version->major != LTTNG_KERNEL_ABI_MAJOR_VERSION) {
521dd134 1526 ERR("Kernel tracer ABI version (%d.%d) does not match the expected ABI major version (%d.*)",
88076e89 1527 abi_version->major, abi_version->minor,
b8e2fb80 1528 LTTNG_KERNEL_ABI_MAJOR_VERSION);
c052142c
MD
1529 goto error;
1530 }
1531 DBG2("Kernel tracer version validated (%d.%d, ABI %d.%d)",
88076e89
JD
1532 version->major, version->minor,
1533 abi_version->major, abi_version->minor);
096102bd
DG
1534 return 0;
1535
1536error_version:
096102bd
DG
1537 ret = -1;
1538
1539error:
521dd134 1540 ERR("Kernel tracer version check failed; kernel tracing will not be available");
096102bd
DG
1541 return ret;
1542}
335a95b7
MD
1543
1544/*
1545 * Kernel work-arounds called at the start of sessiond main().
1546 */
1547int init_kernel_workarounds(void)
1548{
8936c33a 1549 int ret;
335a95b7
MD
1550 FILE *fp;
1551
1552 /*
1553 * boot_id needs to be read once before being used concurrently
1554 * to deal with a Linux kernel race. A fix is proposed for
1555 * upstream, but the work-around is needed for older kernels.
1556 */
1557 fp = fopen("/proc/sys/kernel/random/boot_id", "r");
1558 if (!fp) {
1559 goto end_boot_id;
1560 }
1561 while (!feof(fp)) {
1562 char buf[37] = "";
1563
8936c33a
DG
1564 ret = fread(buf, 1, sizeof(buf), fp);
1565 if (ret < 0) {
1566 /* Ignore error, we don't really care */
1567 }
335a95b7 1568 }
799e2c4f
MD
1569 ret = fclose(fp);
1570 if (ret) {
1571 PERROR("fclose");
1572 }
335a95b7 1573end_boot_id:
335a95b7
MD
1574 return 0;
1575}
2f77fc4b
DG
1576
1577/*
d070c424 1578 * Teardown of a kernel session, keeping data required by destroy notifiers.
2f77fc4b
DG
1579 */
1580void kernel_destroy_session(struct ltt_kernel_session *ksess)
1581{
82b69413
JG
1582 struct lttng_trace_chunk *trace_chunk;
1583
2f77fc4b
DG
1584 if (ksess == NULL) {
1585 DBG3("No kernel session when tearing down session");
1586 return;
1587 }
1588
1589 DBG("Tearing down kernel session");
82b69413 1590 trace_chunk = ksess->current_trace_chunk;
2f77fc4b 1591
07b86b52 1592 /*
15dc512a
DG
1593 * Destroy channels on the consumer if at least one FD has been sent and we
1594 * are in no output mode because the streams are in *no* monitor mode so we
1595 * have to send a command to clean them up or else they leaked.
07b86b52 1596 */
15dc512a 1597 if (!ksess->output_traces && ksess->consumer_fds_sent) {
07b86b52
JD
1598 int ret;
1599 struct consumer_socket *socket;
1600 struct lttng_ht_iter iter;
1601
1602 /* For each consumer socket. */
d069d577 1603 rcu_read_lock();
07b86b52
JD
1604 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
1605 socket, node.node) {
1606 struct ltt_kernel_channel *chan;
1607
1608 /* For each channel, ask the consumer to destroy it. */
1609 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
1610 ret = kernel_consumer_destroy_channel(socket, chan);
1611 if (ret < 0) {
1612 /* Consumer is probably dead. Use next socket. */
1613 continue;
1614 }
1615 }
1616 }
d069d577 1617 rcu_read_unlock();
07b86b52
JD
1618 }
1619
2f77fc4b
DG
1620 /* Close any relayd session */
1621 consumer_output_send_destroy_relayd(ksess->consumer);
1622
1623 trace_kernel_destroy_session(ksess);
82b69413 1624 lttng_trace_chunk_put(trace_chunk);
2f77fc4b 1625}
fb5f35b6 1626
d070c424
MD
1627/* Teardown of data required by destroy notifiers. */
1628void kernel_free_session(struct ltt_kernel_session *ksess)
1629{
1630 if (ksess == NULL) {
1631 return;
1632 }
1633 trace_kernel_free_session(ksess);
1634}
1635
fb5f35b6
DG
1636/*
1637 * Destroy a kernel channel object. It does not do anything on the tracer side.
1638 */
1639void kernel_destroy_channel(struct ltt_kernel_channel *kchan)
1640{
1641 struct ltt_kernel_session *ksess = NULL;
1642
a0377dfe
FD
1643 LTTNG_ASSERT(kchan);
1644 LTTNG_ASSERT(kchan->channel);
fb5f35b6
DG
1645
1646 DBG3("Kernel destroy channel %s", kchan->channel->name);
1647
1648 /* Update channel count of associated session. */
1649 if (kchan->session) {
1650 /* Keep pointer reference so we can update it after the destroy. */
1651 ksess = kchan->session;
1652 }
1653
1654 trace_kernel_destroy_channel(kchan);
1655
1656 /*
1657 * At this point the kernel channel is not visible anymore. This is safe
1658 * since in order to work on a visible kernel session, the tracing session
1659 * lock (ltt_session.lock) MUST be acquired.
1660 */
1661 if (ksess) {
1662 ksess->channel_count--;
1663 }
1664}
6dc3064a
DG
1665
1666/*
1667 * Take a snapshot for a given kernel session.
1668 *
9a654598 1669 * Return LTTNG_OK on success or else return a LTTNG_ERR code.
6dc3064a 1670 */
fb9a95c4
JG
1671enum lttng_error_code kernel_snapshot_record(
1672 struct ltt_kernel_session *ksess,
f46376a1 1673 const struct consumer_output *output,
d07ceecd 1674 uint64_t nb_packets_per_stream)
6dc3064a 1675{
2a06df8d 1676 int err, ret, saved_metadata_fd;
9a654598 1677 enum lttng_error_code status = LTTNG_OK;
6dc3064a
DG
1678 struct consumer_socket *socket;
1679 struct lttng_ht_iter iter;
1680 struct ltt_kernel_metadata *saved_metadata;
3b967712 1681 char *trace_path = NULL;
5da88b0f 1682 size_t consumer_path_offset = 0;
6dc3064a 1683
a0377dfe
FD
1684 LTTNG_ASSERT(ksess);
1685 LTTNG_ASSERT(ksess->consumer);
1686 LTTNG_ASSERT(output);
6dc3064a
DG
1687
1688 DBG("Kernel snapshot record started");
1689
1690 /* Save current metadata since the following calls will change it. */
1691 saved_metadata = ksess->metadata;
1692 saved_metadata_fd = ksess->metadata_stream_fd;
1693
1694 rcu_read_lock();
1695
1696 ret = kernel_open_metadata(ksess);
1697 if (ret < 0) {
9a654598 1698 status = LTTNG_ERR_KERN_META_FAIL;
6dc3064a
DG
1699 goto error;
1700 }
1701
1702 ret = kernel_open_metadata_stream(ksess);
1703 if (ret < 0) {
9a654598 1704 status = LTTNG_ERR_KERN_META_FAIL;
6dc3064a
DG
1705 goto error_open_stream;
1706 }
1707
3b967712 1708 trace_path = setup_channel_trace_path(ksess->consumer,
bd666153 1709 "", &consumer_path_offset);
3b967712
MD
1710 if (!trace_path) {
1711 status = LTTNG_ERR_INVALID;
1712 goto error;
1713 }
6dc3064a 1714 /* Send metadata to consumer and snapshot everything. */
348a81dc 1715 cds_lfht_for_each_entry(output->socks->ht, &iter.iter,
6dc3064a 1716 socket, node.node) {
6dc3064a 1717 struct ltt_kernel_channel *chan;
6dc3064a 1718
6dc3064a
DG
1719 pthread_mutex_lock(socket->lock);
1720 /* This stream must not be monitored by the consumer. */
07b86b52 1721 ret = kernel_consumer_add_metadata(socket, ksess, 0);
6dc3064a 1722 pthread_mutex_unlock(socket->lock);
6dc3064a 1723 if (ret < 0) {
0ed78e50 1724 status = LTTNG_ERR_KERN_META_FAIL;
6dc3064a
DG
1725 goto error_consumer;
1726 }
1727
1728 /* For each channel, ask the consumer to snapshot it. */
1729 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
9a654598 1730 status = consumer_snapshot_channel(socket, chan->key, output, 0,
f46376a1 1731 &trace_path[consumer_path_offset],
d2956687 1732 nb_packets_per_stream);
9a654598 1733 if (status != LTTNG_OK) {
2a06df8d
DG
1734 (void) kernel_consumer_destroy_metadata(socket,
1735 ksess->metadata);
6dc3064a
DG
1736 goto error_consumer;
1737 }
1738 }
1739
1740 /* Snapshot metadata, */
9a654598 1741 status = consumer_snapshot_channel(socket, ksess->metadata->key, output,
f46376a1 1742 1, &trace_path[consumer_path_offset], 0);
9a654598 1743 if (status != LTTNG_OK) {
6dc3064a
DG
1744 goto error_consumer;
1745 }
07b86b52
JD
1746
1747 /*
1748 * The metadata snapshot is done, ask the consumer to destroy it since
1749 * it's not monitored on the consumer side.
1750 */
1751 (void) kernel_consumer_destroy_metadata(socket, ksess->metadata);
6dc3064a
DG
1752 }
1753
1754error_consumer:
1755 /* Close newly opened metadata stream. It's now on the consumer side. */
2a06df8d
DG
1756 err = close(ksess->metadata_stream_fd);
1757 if (err < 0) {
6dc3064a
DG
1758 PERROR("close snapshot kernel");
1759 }
1760
1761error_open_stream:
1762 trace_kernel_destroy_metadata(ksess->metadata);
1763error:
1764 /* Restore metadata state.*/
1765 ksess->metadata = saved_metadata;
1766 ksess->metadata_stream_fd = saved_metadata_fd;
6dc3064a 1767 rcu_read_unlock();
3b967712 1768 free(trace_path);
9a654598 1769 return status;
6dc3064a 1770}
834978fd
DG
1771
1772/*
1773 * Get the syscall mask array from the kernel tracer.
1774 *
1775 * Return 0 on success else a negative value. In both case, syscall_mask should
1776 * be freed.
1777 */
1778int kernel_syscall_mask(int chan_fd, char **syscall_mask, uint32_t *nr_bits)
1779{
a0377dfe
FD
1780 LTTNG_ASSERT(syscall_mask);
1781 LTTNG_ASSERT(nr_bits);
834978fd
DG
1782
1783 return kernctl_syscall_mask(chan_fd, syscall_mask, nr_bits);
1784}
6e21424e 1785
959e3c66
JR
1786static
1787int kernel_tracer_abi_greater_or_equal(unsigned int major, unsigned int minor)
6e21424e 1788{
959e3c66 1789 int ret;
b8e2fb80 1790 struct lttng_kernel_abi_tracer_abi_version abi;
6e21424e 1791
7d268848 1792 ret = kernctl_tracer_abi_version(kernel_tracer_fd, &abi);
6e21424e
JR
1793 if (ret < 0) {
1794 ERR("Failed to retrieve lttng-modules ABI version");
1795 goto error;
1796 }
1797
959e3c66
JR
1798 ret = abi.major > major || (abi.major == major && abi.minor >= minor);
1799error:
1800 return ret;
1801}
1802
1803/*
1804 * Check for the support of the RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS via abi
1805 * version number.
1806 *
1807 * Return 1 on success, 0 when feature is not supported, negative value in case
1808 * of errors.
1809 */
1810int kernel_supports_ring_buffer_snapshot_sample_positions(void)
1811{
6e21424e
JR
1812 /*
1813 * RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS was introduced in 2.3
1814 */
959e3c66 1815 return kernel_tracer_abi_greater_or_equal(2, 3);
6e21424e 1816}
5c408ad8 1817
a40a503f
MD
1818/*
1819 * Check for the support of the packet sequence number via abi version number.
1820 *
1821 * Return 1 on success, 0 when feature is not supported, negative value in case
1822 * of errors.
1823 */
1824int kernel_supports_ring_buffer_packet_sequence_number(void)
1825{
a40a503f 1826 /*
3029bc92
JG
1827 * Packet sequence number was introduced in LTTng 2.8,
1828 * lttng-modules ABI 2.1.
a40a503f 1829 */
959e3c66
JR
1830 return kernel_tracer_abi_greater_or_equal(2, 1);
1831}
1832
1833/*
1834 * Check for the support of event notifiers via abi version number.
1835 *
1836 * Return 1 on success, 0 when feature is not supported, negative value in case
1837 * of errors.
1838 */
1839int kernel_supports_event_notifiers(void)
1840{
1841 /*
1842 * Event notifiers were introduced in LTTng 2.13, lttng-modules ABI 2.6.
1843 */
1844 return kernel_tracer_abi_greater_or_equal(2, 6);
a40a503f
MD
1845}
1846
346732ae
JR
1847/*
1848 * Check for the support of ctf2 via abi version number.
1849 *
1850 * Return 1 on success, 0 when feature is not supported, negative value in case
1851 * of errors.
1852 */
1853int kernel_supports_ctf2(void)
1854{
1855 /*
1856 * JORAJ TODO: change this for the actual value when merged upstream
1857 * default to 2.7 ABI for now (modules 2.14)
1858 * CTF2 support was introduced in LTTng 2.1XX, lttng-modules ABI 2.XX.
1859 */
1860 return kernel_tracer_abi_greater_or_equal(2, 7);
1861}
1862
5c408ad8
JD
1863/*
1864 * Rotate a kernel session.
1865 *
d5a1b7aa 1866 * Return LTTNG_OK on success or else an LTTng error code.
5c408ad8 1867 */
d5a1b7aa 1868enum lttng_error_code kernel_rotate_session(struct ltt_session *session)
5c408ad8
JD
1869{
1870 int ret;
d5a1b7aa 1871 enum lttng_error_code status = LTTNG_OK;
5c408ad8
JD
1872 struct consumer_socket *socket;
1873 struct lttng_ht_iter iter;
1874 struct ltt_kernel_session *ksess = session->kernel_session;
1875
a0377dfe
FD
1876 LTTNG_ASSERT(ksess);
1877 LTTNG_ASSERT(ksess->consumer);
5c408ad8
JD
1878
1879 DBG("Rotate kernel session %s started (session %" PRIu64 ")",
1880 session->name, session->id);
1881
1882 rcu_read_lock();
1883
1884 /*
1885 * Note that this loop will end after one iteration given that there is
1886 * only one kernel consumer.
1887 */
1888 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
1889 socket, node.node) {
1890 struct ltt_kernel_channel *chan;
1891
b8a1b0bd 1892 /* For each channel, ask the consumer to rotate it. */
5c408ad8 1893 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
92816cc3
JG
1894 DBG("Rotate kernel channel %" PRIu64 ", session %s",
1895 chan->key, session->name);
5c408ad8 1896 ret = consumer_rotate_channel(socket, chan->key,
f46376a1 1897 ksess->consumer,
d2956687 1898 /* is_metadata_channel */ false);
5c408ad8 1899 if (ret < 0) {
7e0de219 1900 status = LTTNG_ERR_ROTATION_FAIL_CONSUMER;
5c408ad8
JD
1901 goto error;
1902 }
1903 }
1904
1905 /*
1906 * Rotate the metadata channel.
1907 */
22a1b931 1908 ret = consumer_rotate_channel(socket, ksess->metadata->key,
f46376a1 1909 ksess->consumer,
d2956687 1910 /* is_metadata_channel */ true);
5c408ad8 1911 if (ret < 0) {
7e0de219 1912 status = LTTNG_ERR_ROTATION_FAIL_CONSUMER;
5c408ad8
JD
1913 goto error;
1914 }
1915 }
1916
5c408ad8
JD
1917error:
1918 rcu_read_unlock();
d5a1b7aa 1919 return status;
5c408ad8 1920}
d2956687
JG
1921
1922enum lttng_error_code kernel_create_channel_subdirectories(
1923 const struct ltt_kernel_session *ksess)
1924{
1925 enum lttng_error_code ret = LTTNG_OK;
1926 enum lttng_trace_chunk_status chunk_status;
1927
1928 rcu_read_lock();
a0377dfe 1929 LTTNG_ASSERT(ksess->current_trace_chunk);
d2956687
JG
1930
1931 /*
1932 * Create the index subdirectory which will take care
1933 * of implicitly creating the channel's path.
1934 */
1935 chunk_status = lttng_trace_chunk_create_subdirectory(
1936 ksess->current_trace_chunk,
1937 DEFAULT_KERNEL_TRACE_DIR "/" DEFAULT_INDEX_DIR);
1938 if (chunk_status != LTTNG_TRACE_CHUNK_STATUS_OK) {
1939 ret = LTTNG_ERR_CREATE_DIR_FAIL;
1940 goto error;
1941 }
1942error:
1943 rcu_read_unlock();
1944 return ret;
1945}
7d268848
MD
1946
1947/*
1948 * Setup necessary data for kernel tracer action.
1949 */
7d268848
MD
1950int init_kernel_tracer(void)
1951{
1952 int ret;
1953 bool is_root = !getuid();
1954
1955 /* Modprobe lttng kernel modules */
1956 ret = modprobe_lttng_control();
1957 if (ret < 0) {
1958 goto error;
1959 }
1960
1961 /* Open debugfs lttng */
1962 kernel_tracer_fd = open(module_proc_lttng, O_RDWR);
1963 if (kernel_tracer_fd < 0) {
1964 DBG("Failed to open %s", module_proc_lttng);
1965 goto error_open;
1966 }
1967
1968 /* Validate kernel version */
412d7227
SM
1969 ret = kernel_validate_version(&the_kernel_tracer_version,
1970 &the_kernel_tracer_abi_version);
7d268848
MD
1971 if (ret < 0) {
1972 goto error_version;
1973 }
1974
1975 ret = modprobe_lttng_data();
1976 if (ret < 0) {
1977 goto error_modules;
1978 }
1979
1980 ret = kernel_supports_ring_buffer_snapshot_sample_positions();
1981 if (ret < 0) {
1982 goto error_modules;
1983 }
7d268848
MD
1984 if (ret < 1) {
1985 WARN("Kernel tracer does not support buffer monitoring. "
1986 "The monitoring timer of channels in the kernel domain "
1987 "will be set to 0 (disabled).");
1988 }
1989
352b58f5
JR
1990 ret = kernel_supports_event_notifiers();
1991 if (ret < 0) {
1992 ERR("Failed to check for kernel tracer event notifier support");
1993 goto error_modules;
1994 }
1995 ret = kernel_create_event_notifier_group(&kernel_tracer_event_notifier_group_fd);
1996 if (ret < 0) {
1997 /* This is not fatal. */
1998 WARN("Failed to create kernel event notifier group");
1999 kernel_tracer_event_notifier_group_fd = -1;
2000 } else {
90aa04a1
FD
2001 enum event_notifier_error_accounting_status error_accounting_status;
2002 enum lttng_error_code error_code_ret =
352b58f5
JR
2003 kernel_create_event_notifier_group_notification_fd(
2004 &kernel_tracer_event_notifier_group_notification_fd);
2005
2006 if (error_code_ret != LTTNG_OK) {
2007 goto error_modules;
2008 }
2009
90aa04a1
FD
2010 error_accounting_status = event_notifier_error_accounting_register_kernel(
2011 kernel_tracer_event_notifier_group_fd);
2012 if (error_accounting_status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
2013 ERR("Failed to initialize event notifier error accounting for kernel tracer");
2014 error_code_ret = LTTNG_ERR_EVENT_NOTIFIER_ERROR_ACCOUNTING;
2015 goto error_modules;
2016 }
2017
352b58f5
JR
2018 kernel_token_to_event_notifier_rule_ht = cds_lfht_new(
2019 DEFAULT_HT_SIZE, 1, 0,
2020 CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING,
2021 NULL);
2022 if (!kernel_token_to_event_notifier_rule_ht) {
2023 goto error_token_ht;
2024 }
2025 }
2026
2027 DBG("Kernel tracer initialized: kernel tracer fd = %d, event notifier group fd = %d, event notifier group notification fd = %d",
2028 kernel_tracer_fd, kernel_tracer_event_notifier_group_fd,
2029 kernel_tracer_event_notifier_group_notification_fd);
7d268848
MD
2030
2031 ret = syscall_init_table(kernel_tracer_fd);
2032 if (ret < 0) {
2033 ERR("Unable to populate syscall table. Syscall tracing won't "
2034 "work for this session daemon.");
2035 }
352b58f5 2036
7d268848
MD
2037 return 0;
2038
2039error_version:
2040 modprobe_remove_lttng_control();
2041 ret = close(kernel_tracer_fd);
2042 if (ret) {
352b58f5
JR
2043 PERROR("Failed to close kernel tracer file descriptor: fd = %d",
2044 kernel_tracer_fd);
7d268848 2045 }
6dcf80d3 2046
7d268848
MD
2047 kernel_tracer_fd = -1;
2048 return LTTNG_ERR_KERN_VERSION;
2049
352b58f5
JR
2050
2051error_token_ht:
2052 ret = close(kernel_tracer_event_notifier_group_notification_fd);
2053 if (ret) {
2054 PERROR("Failed to close kernel tracer event notifier group notification file descriptor: fd = %d",
2055 kernel_tracer_event_notifier_group_notification_fd);
2056 }
2057
6dcf80d3
JG
2058 kernel_tracer_event_notifier_group_notification_fd = -1;
2059
7d268848 2060error_modules:
352b58f5
JR
2061 ret = close(kernel_tracer_event_notifier_group_fd);
2062 if (ret) {
2063 PERROR("Failed to close kernel tracer event notifier group file descriptor: fd = %d",
2064 kernel_tracer_event_notifier_group_fd);
2065 }
2066
6dcf80d3
JG
2067 kernel_tracer_event_notifier_group_fd = -1;
2068
7d268848
MD
2069 ret = close(kernel_tracer_fd);
2070 if (ret) {
352b58f5
JR
2071 PERROR("Failed to close kernel tracer file descriptor: fd = %d",
2072 kernel_tracer_fd);
7d268848
MD
2073 }
2074
6dcf80d3
JG
2075 kernel_tracer_fd = -1;
2076
7d268848
MD
2077error_open:
2078 modprobe_remove_lttng_control();
2079
2080error:
2081 WARN("No kernel tracer available");
2082 kernel_tracer_fd = -1;
2083 if (!is_root) {
2084 return LTTNG_ERR_NEED_ROOT_SESSIOND;
2085 } else {
2086 return LTTNG_ERR_KERN_NA;
2087 }
2088}
2089
7d268848
MD
2090void cleanup_kernel_tracer(void)
2091{
352b58f5
JR
2092 DBG2("Closing kernel event notifier group notification file descriptor");
2093 if (kernel_tracer_event_notifier_group_notification_fd >= 0) {
b69a1b40 2094 int ret = notification_thread_command_remove_tracer_event_source(
412d7227 2095 the_notification_thread_handle,
352b58f5
JR
2096 kernel_tracer_event_notifier_group_notification_fd);
2097 if (ret != LTTNG_OK) {
2098 ERR("Failed to remove kernel event notifier notification from notification thread");
2099 }
2100
2101 ret = close(kernel_tracer_event_notifier_group_notification_fd);
2102 if (ret) {
2103 PERROR("Failed to close kernel event notifier group notification file descriptor: fd = %d",
2104 kernel_tracer_event_notifier_group_notification_fd);
2105 }
2106
2107 kernel_tracer_event_notifier_group_notification_fd = -1;
2108 }
2109
2110 if (kernel_token_to_event_notifier_rule_ht) {
b69a1b40
JG
2111 const int ret = cds_lfht_destroy(
2112 kernel_token_to_event_notifier_rule_ht, NULL);
a0377dfe 2113 LTTNG_ASSERT(ret == 0);
352b58f5
JR
2114 }
2115
2116 DBG2("Closing kernel event notifier group file descriptor");
2117 if (kernel_tracer_event_notifier_group_fd >= 0) {
b69a1b40
JG
2118 const int ret = close(kernel_tracer_event_notifier_group_fd);
2119
352b58f5
JR
2120 if (ret) {
2121 PERROR("Failed to close kernel event notifier group file descriptor: fd = %d",
2122 kernel_tracer_event_notifier_group_fd);
2123 }
2124
2125 kernel_tracer_event_notifier_group_fd = -1;
2126 }
7d268848
MD
2127
2128 DBG2("Closing kernel fd");
2129 if (kernel_tracer_fd >= 0) {
b69a1b40
JG
2130 const int ret = close(kernel_tracer_fd);
2131
7d268848 2132 if (ret) {
352b58f5
JR
2133 PERROR("Failed to close kernel tracer file descriptor: fd = %d",
2134 kernel_tracer_fd);
7d268848 2135 }
352b58f5 2136
7d268848
MD
2137 kernel_tracer_fd = -1;
2138 }
352b58f5 2139
7d268848
MD
2140 free(syscall_table);
2141}
2142
7d268848
MD
2143bool kernel_tracer_is_initialized(void)
2144{
2145 return kernel_tracer_fd >= 0;
2146}
bca212a2
MD
2147
2148/*
2149 * Clear a kernel session.
2150 *
2151 * Return LTTNG_OK on success or else an LTTng error code.
2152 */
2153enum lttng_error_code kernel_clear_session(struct ltt_session *session)
2154{
2155 int ret;
2156 enum lttng_error_code status = LTTNG_OK;
2157 struct consumer_socket *socket;
2158 struct lttng_ht_iter iter;
2159 struct ltt_kernel_session *ksess = session->kernel_session;
2160
a0377dfe
FD
2161 LTTNG_ASSERT(ksess);
2162 LTTNG_ASSERT(ksess->consumer);
bca212a2
MD
2163
2164 DBG("Clear kernel session %s (session %" PRIu64 ")",
2165 session->name, session->id);
2166
2167 rcu_read_lock();
2168
2169 if (ksess->active) {
2170 ERR("Expecting inactive session %s (%" PRIu64 ")", session->name, session->id);
2171 status = LTTNG_ERR_FATAL;
2172 goto end;
2173 }
2174
2175 /*
2176 * Note that this loop will end after one iteration given that there is
2177 * only one kernel consumer.
2178 */
2179 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
2180 socket, node.node) {
2181 struct ltt_kernel_channel *chan;
2182
2183 /* For each channel, ask the consumer to clear it. */
2184 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
2185 DBG("Clear kernel channel %" PRIu64 ", session %s",
2186 chan->key, session->name);
2187 ret = consumer_clear_channel(socket, chan->key);
2188 if (ret < 0) {
2189 goto error;
2190 }
2191 }
2192
2193 if (!ksess->metadata) {
2194 /*
2195 * Nothing to do for the metadata.
2196 * This is a snapshot session.
2197 * The metadata is genererated on the fly.
2198 */
2199 continue;
2200 }
2201
2202 /*
2203 * Clear the metadata channel.
2204 * Metadata channel is not cleared per se but we still need to
2205 * perform a rotation operation on it behind the scene.
2206 */
2207 ret = consumer_clear_channel(socket, ksess->metadata->key);
2208 if (ret < 0) {
2209 goto error;
2210 }
2211 }
2212
2213 goto end;
2214error:
2215 switch (-ret) {
2216 case LTTCOMM_CONSUMERD_RELAYD_CLEAR_DISALLOWED:
2217 status = LTTNG_ERR_CLEAR_RELAY_DISALLOWED;
2218 break;
2219 default:
2220 status = LTTNG_ERR_CLEAR_FAIL_CONSUMER;
2221 break;
2222 }
2223end:
2224 rcu_read_unlock();
2225 return status;
2226}
352b58f5
JR
2227
2228enum lttng_error_code kernel_create_event_notifier_group_notification_fd(
2229 int *event_notifier_group_notification_fd)
2230{
2231 int local_fd = -1, ret;
2232 enum lttng_error_code error_code_ret;
2233
a0377dfe 2234 LTTNG_ASSERT(event_notifier_group_notification_fd);
352b58f5
JR
2235
2236 ret = kernctl_create_event_notifier_group_notification_fd(
2237 kernel_tracer_event_notifier_group_fd);
2238 if (ret < 0) {
2239 PERROR("Failed to create kernel event notifier group notification file descriptor");
2240 error_code_ret = LTTNG_ERR_EVENT_NOTIFIER_GROUP_NOTIFICATION_FD;
2241 goto error;
2242 }
2243
2244 local_fd = ret;
2245
2246 /* Prevent fd duplication after execlp(). */
2247 ret = fcntl(local_fd, F_SETFD, FD_CLOEXEC);
2248 if (ret < 0) {
2249 PERROR("Failed to set FD_CLOEXEC on kernel event notifier group notification file descriptor: fd = %d",
2250 local_fd);
2251 error_code_ret = LTTNG_ERR_EVENT_NOTIFIER_GROUP_NOTIFICATION_FD;
2252 goto error;
2253 }
2254
2255 DBG("Created kernel notifier group notification file descriptor: fd = %d",
2256 local_fd);
2257 error_code_ret = LTTNG_OK;
2258 *event_notifier_group_notification_fd = local_fd;
2259 local_fd = -1;
2260
2261error:
2262 if (local_fd >= 0) {
2263 ret = close(local_fd);
2264 if (ret) {
2265 PERROR("Failed to close kernel event notifier group notification file descriptor: fd = %d",
2266 local_fd);
2267 }
2268 }
2269
2270 return error_code_ret;
2271}
2272
2273enum lttng_error_code kernel_destroy_event_notifier_group_notification_fd(
2274 int event_notifier_group_notification_fd)
2275{
2276 enum lttng_error_code ret_code = LTTNG_OK;
2277
2278 DBG("Closing event notifier group notification file descriptor: fd = %d",
2279 event_notifier_group_notification_fd);
2280 if (event_notifier_group_notification_fd >= 0) {
2281 const int ret = close(event_notifier_group_notification_fd);
2282 if (ret) {
2283 PERROR("Failed to close event notifier group notification file descriptor: fd = %d",
2284 event_notifier_group_notification_fd);
2285 }
2286 }
2287
2288 return ret_code;
2289}
2290
2291static
2292unsigned long hash_trigger(const struct lttng_trigger *trigger)
2293{
2294 const struct lttng_condition *condition =
2295 lttng_trigger_get_const_condition(trigger);
2296
2297 return lttng_condition_hash(condition);
2298}
2299
2300static
2301int match_trigger(struct cds_lfht_node *node, const void *key)
2302{
2303 const struct ltt_kernel_event_notifier_rule *event_notifier_rule;
7966af57 2304 const struct lttng_trigger *trigger = (lttng_trigger *) key;
352b58f5
JR
2305
2306 event_notifier_rule = caa_container_of(node,
2307 const struct ltt_kernel_event_notifier_rule, ht_node);
2308
2309 return lttng_trigger_is_equal(trigger, event_notifier_rule->trigger);
2310}
2311
2312static enum lttng_error_code kernel_create_event_notifier_rule(
2313 struct lttng_trigger *trigger,
2314 const struct lttng_credentials *creds, uint64_t token)
2315{
2316 int err, fd, ret = 0;
2317 enum lttng_error_code error_code_ret;
2318 enum lttng_condition_status condition_status;
2319 enum lttng_condition_type condition_type;
2320 enum lttng_event_rule_type event_rule_type;
2321 struct ltt_kernel_event_notifier_rule *event_notifier_rule;
b8e2fb80 2322 struct lttng_kernel_abi_event_notifier kernel_event_notifier = {};
bbd6675c 2323 unsigned int capture_bytecode_count = 0, i;
352b58f5
JR
2324 const struct lttng_condition *condition = NULL;
2325 const struct lttng_event_rule *event_rule = NULL;
bbd6675c 2326 enum lttng_condition_status cond_status;
352b58f5 2327
a0377dfe 2328 LTTNG_ASSERT(trigger);
352b58f5
JR
2329
2330 condition = lttng_trigger_get_const_condition(trigger);
a0377dfe 2331 LTTNG_ASSERT(condition);
352b58f5
JR
2332
2333 condition_type = lttng_condition_get_type(condition);
a0377dfe 2334 LTTNG_ASSERT(condition_type == LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
352b58f5
JR
2335
2336 /* Does not acquire a reference. */
8dbb86b8 2337 condition_status = lttng_condition_event_rule_matches_get_rule(
352b58f5 2338 condition, &event_rule);
a0377dfe
FD
2339 LTTNG_ASSERT(condition_status == LTTNG_CONDITION_STATUS_OK);
2340 LTTNG_ASSERT(event_rule);
352b58f5
JR
2341
2342 event_rule_type = lttng_event_rule_get_type(event_rule);
a0377dfe 2343 LTTNG_ASSERT(event_rule_type != LTTNG_EVENT_RULE_TYPE_UNKNOWN);
352b58f5
JR
2344
2345 error_code_ret = trace_kernel_create_event_notifier_rule(trigger, token,
8dbb86b8
JR
2346 lttng_condition_event_rule_matches_get_error_counter_index(
2347 condition),
352b58f5
JR
2348 &event_notifier_rule);
2349 if (error_code_ret != LTTNG_OK) {
2350 goto error;
2351 }
2352
2353 error_code_ret = trace_kernel_init_event_notifier_from_event_rule(
2354 event_rule, &kernel_event_notifier);
2355 if (error_code_ret != LTTNG_OK) {
b5e3b044 2356 goto free_event;
352b58f5
JR
2357 }
2358
2359 kernel_event_notifier.event.token = event_notifier_rule->token;
90aa04a1 2360 kernel_event_notifier.error_counter_idx =
8dbb86b8
JR
2361 lttng_condition_event_rule_matches_get_error_counter_index(
2362 condition);
352b58f5
JR
2363
2364 fd = kernctl_create_event_notifier(
2365 kernel_tracer_event_notifier_group_fd,
2366 &kernel_event_notifier);
2367 if (fd < 0) {
2368 switch (-fd) {
2369 case EEXIST:
2370 error_code_ret = LTTNG_ERR_KERN_EVENT_EXIST;
2371 break;
2372 case ENOSYS:
2373 WARN("Failed to create kernel event notifier: not notifier type not implemented");
2374 error_code_ret = LTTNG_ERR_KERN_EVENT_ENOSYS;
2375 break;
2376 case ENOENT:
2377 WARN("Failed to create kernel event notifier: not found: name = '%s'",
2378 kernel_event_notifier.event.name);
2379 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
2380 break;
2381 default:
2382 PERROR("Failed to create kernel event notifier: error code = %d, name = '%s'",
2383 fd, kernel_event_notifier.event.name);
2384 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
2385 }
2386 goto free_event;
2387 }
2388
2389 event_notifier_rule->fd = fd;
2390 /* Prevent fd duplication after execlp(). */
2391 err = fcntl(event_notifier_rule->fd, F_SETFD, FD_CLOEXEC);
2392 if (err < 0) {
2393 PERROR("Failed to set FD_CLOEXEC on kernel event notifier file descriptor: fd = %d",
2394 fd);
2395 error_code_ret = LTTNG_ERR_FATAL;
2396 goto set_cloexec_error;
2397 }
2398
2399 if (event_notifier_rule->filter) {
2400 err = kernctl_filter(event_notifier_rule->fd, event_notifier_rule->filter);
2401 if (err < 0) {
2402 switch (-err) {
2403 case ENOMEM:
2404 error_code_ret = LTTNG_ERR_FILTER_NOMEM;
2405 break;
2406 default:
2407 error_code_ret = LTTNG_ERR_FILTER_INVAL;
2408 break;
2409 }
2410 goto filter_error;
2411 }
2412 }
2413
2414 if (lttng_event_rule_get_type(event_rule) ==
46fd07ac 2415 LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE) {
352b58f5
JR
2416 ret = userspace_probe_event_rule_add_callsites(
2417 event_rule, creds, event_notifier_rule->fd);
2418 if (ret) {
2419 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
2420 goto add_callsite_error;
2421 }
2422 }
2423
d602bd6a 2424 /* Set the capture bytecode if any. */
8dbb86b8 2425 cond_status = lttng_condition_event_rule_matches_get_capture_descriptor_count(
bbd6675c 2426 condition, &capture_bytecode_count);
a0377dfe 2427 LTTNG_ASSERT(cond_status == LTTNG_CONDITION_STATUS_OK);
bbd6675c
JR
2428
2429 for (i = 0; i < capture_bytecode_count; i++) {
2430 const struct lttng_bytecode *capture_bytecode =
8dbb86b8 2431 lttng_condition_event_rule_matches_get_capture_bytecode_at_index(
bbd6675c
JR
2432 condition, i);
2433
2434 if (capture_bytecode == NULL) {
2435 ERR("Unexpected NULL capture bytecode on condition");
2436 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
e8b1187d 2437 goto capture_error;
bbd6675c
JR
2438 }
2439
2440 ret = kernctl_capture(event_notifier_rule->fd, capture_bytecode);
2441 if (ret < 0) {
2442 ERR("Failed to set capture bytecode on event notifier rule fd: fd = %d",
2443 event_notifier_rule->fd);
2444 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
e8b1187d 2445 goto capture_error;
bbd6675c
JR
2446 }
2447 }
2448
352b58f5
JR
2449 err = kernctl_enable(event_notifier_rule->fd);
2450 if (err < 0) {
2451 switch (-err) {
2452 case EEXIST:
2453 error_code_ret = LTTNG_ERR_KERN_EVENT_EXIST;
2454 break;
2455 default:
2456 PERROR("enable kernel event notifier");
2457 error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL;
2458 break;
2459 }
2460 goto enable_error;
2461 }
2462
2463 /* Add trigger to kernel token mapping in the hash table. */
2464 rcu_read_lock();
2465 cds_lfht_add(kernel_token_to_event_notifier_rule_ht, hash_trigger(trigger),
2466 &event_notifier_rule->ht_node);
2467 rcu_read_unlock();
2468
2469 DBG("Created kernel event notifier: name = '%s', fd = %d",
2470 kernel_event_notifier.event.name,
2471 event_notifier_rule->fd);
2472
2473 return LTTNG_OK;
2474
e8b1187d 2475capture_error:
352b58f5
JR
2476add_callsite_error:
2477enable_error:
2478set_cloexec_error:
2479filter_error:
2480 {
2481 const int close_ret = close(event_notifier_rule->fd);
2482
2483 if (close_ret) {
2484 PERROR("Failed to close kernel event notifier file descriptor: fd = %d",
2485 event_notifier_rule->fd);
2486 }
2487 }
2488free_event:
2489 free(event_notifier_rule);
2490error:
2491 return error_code_ret;
2492}
2493
2494enum lttng_error_code kernel_register_event_notifier(
2495 struct lttng_trigger *trigger,
2496 const struct lttng_credentials *cmd_creds)
2497{
2498 enum lttng_error_code ret;
2499 enum lttng_condition_status status;
2500 enum lttng_domain_type domain_type;
2501 const struct lttng_event_rule *event_rule;
2502 const struct lttng_condition *const condition =
2503 lttng_trigger_get_const_condition(trigger);
2504 const uint64_t token = lttng_trigger_get_tracer_token(trigger);
2505
a0377dfe 2506 LTTNG_ASSERT(condition);
352b58f5
JR
2507
2508 /* Does not acquire a reference to the event rule. */
8dbb86b8 2509 status = lttng_condition_event_rule_matches_get_rule(
352b58f5 2510 condition, &event_rule);
a0377dfe 2511 LTTNG_ASSERT(status == LTTNG_CONDITION_STATUS_OK);
352b58f5
JR
2512
2513 domain_type = lttng_event_rule_get_domain_type(event_rule);
a0377dfe 2514 LTTNG_ASSERT(domain_type == LTTNG_DOMAIN_KERNEL);
352b58f5
JR
2515
2516 ret = kernel_create_event_notifier_rule(trigger, cmd_creds, token);
2517 if (ret != LTTNG_OK) {
124dda43 2518 ERR("Failed to create kernel event notifier rule");
352b58f5
JR
2519 }
2520
2521 return ret;
2522}
2523
2524enum lttng_error_code kernel_unregister_event_notifier(
2525 const struct lttng_trigger *trigger)
2526{
2527 struct ltt_kernel_event_notifier_rule *token_event_rule_element;
2528 struct cds_lfht_node *node;
2529 struct cds_lfht_iter iter;
2530 enum lttng_error_code error_code_ret;
2531 int ret;
2532
2533 rcu_read_lock();
2534
2535 cds_lfht_lookup(kernel_token_to_event_notifier_rule_ht,
2536 hash_trigger(trigger), match_trigger, trigger, &iter);
2537
2538 node = cds_lfht_iter_get_node(&iter);
2539 if (!node) {
2540 error_code_ret = LTTNG_ERR_TRIGGER_NOT_FOUND;
2541 goto error;
2542 }
2543
2544 token_event_rule_element = caa_container_of(node,
2545 struct ltt_kernel_event_notifier_rule, ht_node);
2546
2547 ret = kernel_disable_event_notifier_rule(token_event_rule_element);
2548 if (ret) {
2549 error_code_ret = LTTNG_ERR_FATAL;
2550 goto error;
2551 }
2552
2553 trace_kernel_destroy_event_notifier_rule(token_event_rule_element);
2554 error_code_ret = LTTNG_OK;
2555
2556error:
2557 rcu_read_unlock();
2558
2559 return error_code_ret;
2560}
2561
2562int kernel_get_notification_fd(void)
2563{
2564 return kernel_tracer_event_notifier_group_notification_fd;
2565}
This page took 0.249621 seconds and 5 git commands to generate.