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