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