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