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