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