Add type-checked versions of allocation and deallocations functions
[lttng-tools.git] / src / bin / lttng-sessiond / trace-kernel.cpp
CommitLineData
54012638 1/*
21cf9b6b 2 * Copyright (C) 2011 EfficiOS Inc.
54012638 3 *
ab5be9fa 4 * SPDX-License-Identifier: GPL-2.0-only
54012638 5 *
54012638
DG
6 */
7
6c1c0768 8#define _LGPL_SOURCE
54012638
DG
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
c363b55d 12#include <unistd.h>
54012638 13
dcabc190
FD
14#include <lttng/event.h>
15#include <lttng/lttng-error.h>
352b58f5 16#include <lttng/kernel-probe.h>
dcabc190 17#include <lttng/userspace-probe.h>
c9e313bc 18#include <lttng/userspace-probe-internal.hpp>
352b58f5 19#include <lttng/event-rule/event-rule.h>
c9e313bc 20#include <lttng/event-rule/event-rule-internal.hpp>
85522de5 21#include <lttng/event-rule/kernel-kprobe.h>
c9e313bc 22#include <lttng/event-rule/kernel-kprobe-internal.hpp>
4f7da553 23#include <lttng/event-rule/kernel-syscall.h>
c9e313bc 24#include <lttng/event-rule/kernel-syscall-internal.hpp>
695f7044 25#include <lttng/event-rule/kernel-tracepoint.h>
c9e313bc 26#include <lttng/event-rule/kernel-tracepoint-internal.hpp>
695f7044 27#include <lttng/event-rule/kernel-uprobe.h>
c9e313bc
SM
28#include <lttng/event-rule/kernel-uprobe-internal.hpp>
29#include <common/common.hpp>
30#include <common/defaults.hpp>
31#include <common/trace-chunk.hpp>
32#include <common/macros.hpp>
1e307fab 33
c9e313bc
SM
34#include "consumer.hpp"
35#include "trace-kernel.hpp"
36#include "lttng-sessiond.hpp"
37#include "notification-thread-commands.hpp"
54012638 38
19e70852 39/*
050349bb 40 * Find the channel name for the given kernel session.
19e70852 41 */
62499ad6 42struct ltt_kernel_channel *trace_kernel_get_channel_by_name(
df4f5a87 43 const char *name, struct ltt_kernel_session *session)
19e70852
DG
44{
45 struct ltt_kernel_channel *chan;
46
a0377dfe
FD
47 LTTNG_ASSERT(session);
48 LTTNG_ASSERT(name);
19e70852 49
85076754
MD
50 /*
51 * If we receive an empty string for channel name, it means the
52 * default channel name is requested.
53 */
54 if (name[0] == '\0')
55 name = DEFAULT_CHANNEL_NAME;
56
54d01ffb
DG
57 DBG("Trying to find channel %s", name);
58
19e70852
DG
59 cds_list_for_each_entry(chan, &session->channel_list.head, list) {
60 if (strcmp(name, chan->channel->name) == 0) {
61 DBG("Found channel by name %s", name);
62 return chan;
63 }
64 }
65
19e70852
DG
66 return NULL;
67}
68
00a62084
MD
69/*
70 * Find the event for the given channel.
71 */
72struct ltt_kernel_event *trace_kernel_find_event(
73 char *name, struct ltt_kernel_channel *channel,
74 enum lttng_event_type type,
2b00d462 75 struct lttng_bytecode *filter)
00a62084
MD
76{
77 struct ltt_kernel_event *ev;
78 int found = 0;
79
a0377dfe
FD
80 LTTNG_ASSERT(name);
81 LTTNG_ASSERT(channel);
00a62084
MD
82
83 cds_list_for_each_entry(ev, &channel->events_list.head, list) {
84 if (type != LTTNG_EVENT_ALL && ev->type != type) {
85 continue;
86 }
87 if (strcmp(name, ev->event->name)) {
88 continue;
89 }
90 if ((ev->filter && !filter) || (!ev->filter && filter)) {
91 continue;
92 }
93 if (ev->filter && filter) {
94 if (ev->filter->len != filter->len ||
95 memcmp(ev->filter->data, filter->data,
96 filter->len) != 0) {
97 continue;
98 }
99 }
100 found = 1;
101 break;
102 }
103 if (found) {
104 DBG("Found event %s for channel %s", name,
105 channel->channel->name);
106 return ev;
107 } else {
108 return NULL;
109 }
110}
111
19e70852 112/*
050349bb 113 * Find the event name for the given channel.
19e70852 114 */
62499ad6 115struct ltt_kernel_event *trace_kernel_get_event_by_name(
d0ae4ea8
MD
116 char *name, struct ltt_kernel_channel *channel,
117 enum lttng_event_type type)
19e70852
DG
118{
119 struct ltt_kernel_event *ev;
00a62084 120 int found = 0;
19e70852 121
a0377dfe
FD
122 LTTNG_ASSERT(name);
123 LTTNG_ASSERT(channel);
19e70852
DG
124
125 cds_list_for_each_entry(ev, &channel->events_list.head, list) {
00a62084 126 if (type != LTTNG_EVENT_ALL && ev->type != type) {
d0ae4ea8 127 continue;
19e70852 128 }
00a62084
MD
129 if (strcmp(name, ev->event->name)) {
130 continue;
131 }
132 found = 1;
133 break;
134 }
135 if (found) {
136 DBG("Found event %s for channel %s", name,
137 channel->channel->name);
138 return ev;
139 } else {
140 return NULL;
19e70852 141 }
19e70852
DG
142}
143
54012638 144/*
050349bb 145 * Allocate and initialize a kernel session data structure.
54012638 146 *
050349bb 147 * Return pointer to structure or NULL.
54012638 148 */
dec56f6c 149struct ltt_kernel_session *trace_kernel_create_session(void)
54012638 150{
a4b92340 151 struct ltt_kernel_session *lks = NULL;
54012638
DG
152
153 /* Allocate a new ltt kernel session */
64803277 154 lks = zmalloc<ltt_kernel_session>();
54012638 155 if (lks == NULL) {
df0f840b 156 PERROR("create kernel session zmalloc");
a4b92340 157 goto alloc_error;
54012638
DG
158 }
159
160 /* Init data structure */
03550b58
MD
161 lks->fd = -1;
162 lks->metadata_stream_fd = -1;
54012638
DG
163 lks->channel_count = 0;
164 lks->stream_count_global = 0;
165 lks->metadata = NULL;
166 CDS_INIT_LIST_HEAD(&lks->channel_list.head);
167
159b042f
JG
168 lks->tracker_pid = process_attr_tracker_create();
169 if (!lks->tracker_pid) {
55c9e7ca
JR
170 goto error;
171 }
159b042f
JG
172 lks->tracker_vpid = process_attr_tracker_create();
173 if (!lks->tracker_vpid) {
55c9e7ca
JR
174 goto error;
175 }
159b042f
JG
176 lks->tracker_uid = process_attr_tracker_create();
177 if (!lks->tracker_uid) {
55c9e7ca
JR
178 goto error;
179 }
159b042f
JG
180 lks->tracker_vuid = process_attr_tracker_create();
181 if (!lks->tracker_vuid) {
55c9e7ca
JR
182 goto error;
183 }
159b042f
JG
184 lks->tracker_gid = process_attr_tracker_create();
185 if (!lks->tracker_gid) {
55c9e7ca
JR
186 goto error;
187 }
159b042f
JG
188 lks->tracker_vgid = process_attr_tracker_create();
189 if (!lks->tracker_vgid) {
55c9e7ca
JR
190 goto error;
191 }
00e2e675
DG
192 lks->consumer = consumer_create_output(CONSUMER_DST_LOCAL);
193 if (lks->consumer == NULL) {
194 goto error;
195 }
196
54012638
DG
197 return lks;
198
199error:
159b042f
JG
200 process_attr_tracker_destroy(lks->tracker_pid);
201 process_attr_tracker_destroy(lks->tracker_vpid);
202 process_attr_tracker_destroy(lks->tracker_uid);
203 process_attr_tracker_destroy(lks->tracker_vuid);
204 process_attr_tracker_destroy(lks->tracker_gid);
205 process_attr_tracker_destroy(lks->tracker_vgid);
a4b92340
DG
206 free(lks);
207
208alloc_error:
54012638
DG
209 return NULL;
210}
211
212/*
050349bb 213 * Allocate and initialize a kernel channel data structure.
54012638 214 *
050349bb 215 * Return pointer to structure or NULL.
54012638 216 */
00e2e675 217struct ltt_kernel_channel *trace_kernel_create_channel(
fdd9eb17 218 struct lttng_channel *chan)
54012638 219{
54012638 220 struct ltt_kernel_channel *lkc;
61a5b6b1 221 struct lttng_channel_extended *extended = NULL;
54012638 222
a0377dfe 223 LTTNG_ASSERT(chan);
0525e9ae 224
64803277 225 lkc = zmalloc<ltt_kernel_channel>();
f3ed775e 226 if (lkc == NULL) {
df0f840b 227 PERROR("ltt_kernel_channel zmalloc");
54012638
DG
228 goto error;
229 }
230
64803277 231 lkc->channel = zmalloc<lttng_channel>();
f3ed775e 232 if (lkc->channel == NULL) {
df0f840b 233 PERROR("lttng_channel zmalloc");
e9404c27
JG
234 goto error;
235 }
236
64803277 237 extended = zmalloc<lttng_channel_extended>();
e9404c27
JG
238 if (!extended) {
239 PERROR("lttng_channel_channel zmalloc");
f3ed775e
DG
240 goto error;
241 }
242 memcpy(lkc->channel, chan, sizeof(struct lttng_channel));
e9404c27
JG
243 memcpy(extended, chan->attr.extended.ptr, sizeof(struct lttng_channel_extended));
244 lkc->channel->attr.extended.ptr = extended;
245 extended = NULL;
54012638 246
85076754
MD
247 /*
248 * If we receive an empty string for channel name, it means the
249 * default channel name is requested.
250 */
251 if (chan->name[0] == '\0') {
252 strncpy(lkc->channel->name, DEFAULT_CHANNEL_NAME,
253 sizeof(lkc->channel->name));
254 }
b8e2fb80 255 lkc->channel->name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
85076754 256
03550b58 257 lkc->fd = -1;
54012638 258 lkc->stream_count = 0;
cbbbb275 259 lkc->event_count = 0;
d36b8583 260 lkc->enabled = 1;
753873bf 261 lkc->published_to_notification_thread = false;
54012638
DG
262 /* Init linked list */
263 CDS_INIT_LIST_HEAD(&lkc->events_list.head);
264 CDS_INIT_LIST_HEAD(&lkc->stream_list.head);
645328ae 265 CDS_INIT_LIST_HEAD(&lkc->ctx_list);
54012638
DG
266
267 return lkc;
268
269error:
e9404c27
JG
270 if (lkc) {
271 free(lkc->channel);
272 }
273 free(extended);
274 free(lkc);
54012638
DG
275 return NULL;
276}
277
645328ae
DG
278/*
279 * Allocate and init a kernel context object.
280 *
281 * Return the allocated object or NULL on error.
282 */
283struct ltt_kernel_context *trace_kernel_create_context(
b8e2fb80 284 struct lttng_kernel_abi_context *ctx)
645328ae
DG
285{
286 struct ltt_kernel_context *kctx;
287
64803277 288 kctx = zmalloc<ltt_kernel_context>();
645328ae
DG
289 if (!kctx) {
290 PERROR("zmalloc kernel context");
291 goto error;
292 }
293
294 if (ctx) {
295 memcpy(&kctx->ctx, ctx, sizeof(kctx->ctx));
296 }
df3c77c8
JG
297error:
298 return kctx;
299}
645328ae 300
df3c77c8
JG
301/*
302 * Allocate and init a kernel context object from an existing kernel context
303 * object.
304 *
305 * Return the allocated object or NULL on error.
306 */
307struct ltt_kernel_context *trace_kernel_copy_context(
308 struct ltt_kernel_context *kctx)
309{
310 struct ltt_kernel_context *kctx_copy;
311
a0377dfe 312 LTTNG_ASSERT(kctx);
64803277 313 kctx_copy = zmalloc<ltt_kernel_context>();
df3c77c8
JG
314 if (!kctx_copy) {
315 PERROR("zmalloc ltt_kernel_context");
316 goto error;
317 }
318
319 memcpy(kctx_copy, kctx, sizeof(*kctx_copy));
320 memset(&kctx_copy->list, 0, sizeof(kctx_copy->list));
7b9445b3 321
645328ae 322error:
df3c77c8 323 return kctx_copy;
645328ae
DG
324}
325
54012638 326/*
050349bb 327 * Allocate and initialize a kernel event. Set name and event type.
a969e101 328 * We own filter_expression, and filter.
54012638 329 *
050349bb 330 * Return pointer to structure or NULL.
54012638 331 */
71a3bb01
FD
332enum lttng_error_code trace_kernel_create_event(
333 struct lttng_event *ev, char *filter_expression,
2b00d462 334 struct lttng_bytecode *filter,
71a3bb01 335 struct ltt_kernel_event **kernel_event)
54012638 336{
71a3bb01 337 enum lttng_error_code ret;
b8e2fb80 338 struct lttng_kernel_abi_event *attr;
71a3bb01 339 struct ltt_kernel_event *local_kernel_event;
dcabc190 340 struct lttng_userspace_probe_location *userspace_probe_location = NULL;
54012638 341
a0377dfe 342 LTTNG_ASSERT(ev);
0525e9ae 343
64803277
SM
344 local_kernel_event = zmalloc<ltt_kernel_event>();
345 attr = zmalloc<lttng_kernel_abi_event>();
71a3bb01 346 if (local_kernel_event == NULL || attr == NULL) {
df0f840b 347 PERROR("kernel event zmalloc");
71a3bb01 348 ret = LTTNG_ERR_NOMEM;
54012638
DG
349 goto error;
350 }
351
f3ed775e 352 switch (ev->type) {
7d29a247 353 case LTTNG_EVENT_PROBE:
b8e2fb80 354 attr->instrumentation = LTTNG_KERNEL_ABI_KPROBE;
7d29a247
DG
355 attr->u.kprobe.addr = ev->attr.probe.addr;
356 attr->u.kprobe.offset = ev->attr.probe.offset;
f3ed775e 357 strncpy(attr->u.kprobe.symbol_name,
b8e2fb80
FD
358 ev->attr.probe.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
359 attr->u.kprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
f3ed775e 360 break;
dcabc190
FD
361 case LTTNG_EVENT_USERSPACE_PROBE:
362 {
87597c2c
JG
363 const struct lttng_userspace_probe_location* location = NULL;
364 const struct lttng_userspace_probe_location_lookup_method *lookup = NULL;
dcabc190
FD
365
366 location = lttng_event_get_userspace_probe_location(ev);
367 if (!location) {
368 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
369 goto error;
370 }
371
372 /*
373 * From this point on, the specific term 'uprobe' is used
374 * instead of the generic 'userspace probe' because it's the
375 * technology used at the moment for this instrumentation.
376 * LTTng currently implements userspace probes using uprobes.
377 * In the interactions with the kernel tracer, we use the
378 * uprobe term.
379 */
b8e2fb80 380 attr->instrumentation = LTTNG_KERNEL_ABI_UPROBE;
dcabc190 381
dcabc190
FD
382 lookup = lttng_userspace_probe_location_get_lookup_method(
383 location);
384 if (!lookup) {
385 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
386 goto error;
387 }
388
389 /*
390 * From the kernel tracer's perspective, all userspace probe
391 * event types are all the same: a file and an offset.
392 */
393 switch (lttng_userspace_probe_location_lookup_method_get_type(lookup)) {
394 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF:
395 /* Get the file descriptor on the target binary. */
396 attr->u.uprobe.fd =
397 lttng_userspace_probe_location_function_get_binary_fd(location);
398
399 /*
400 * Save a reference to the probe location used during
e368fb43 401 * the listing of events.
dcabc190
FD
402 */
403 userspace_probe_location =
404 lttng_userspace_probe_location_copy(location);
dcabc190
FD
405 break;
406 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
407 /* Get the file descriptor on the target binary. */
408 attr->u.uprobe.fd =
409 lttng_userspace_probe_location_tracepoint_get_binary_fd(location);
410
411 /*
412 * Save a reference to the probe location used during the listing of
e368fb43 413 * events.
dcabc190
FD
414 */
415 userspace_probe_location =
416 lttng_userspace_probe_location_copy(location);
dcabc190
FD
417 break;
418 default:
419 DBG("Unsupported lookup method type");
420 ret = LTTNG_ERR_PROBE_LOCATION_INVAL;
421 goto error;
422 }
423 break;
424 }
f3ed775e 425 case LTTNG_EVENT_FUNCTION:
b8e2fb80 426 attr->instrumentation = LTTNG_KERNEL_ABI_KRETPROBE;
8f0d098b
MD
427 attr->u.kretprobe.addr = ev->attr.probe.addr;
428 attr->u.kretprobe.offset = ev->attr.probe.offset;
8f0d098b 429 strncpy(attr->u.kretprobe.symbol_name,
b8e2fb80
FD
430 ev->attr.probe.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
431 attr->u.kretprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
8f0d098b
MD
432 break;
433 case LTTNG_EVENT_FUNCTION_ENTRY:
b8e2fb80 434 attr->instrumentation = LTTNG_KERNEL_ABI_FUNCTION;
f3ed775e 435 strncpy(attr->u.ftrace.symbol_name,
b8e2fb80
FD
436 ev->attr.ftrace.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
437 attr->u.ftrace.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
f3ed775e 438 break;
e6ddca71 439 case LTTNG_EVENT_TRACEPOINT:
b8e2fb80 440 attr->instrumentation = LTTNG_KERNEL_ABI_TRACEPOINT;
f3ed775e 441 break;
a54bd42d 442 case LTTNG_EVENT_SYSCALL:
b8e2fb80
FD
443 attr->instrumentation = LTTNG_KERNEL_ABI_SYSCALL;
444 attr->u.syscall.abi = LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL;
445 attr->u.syscall.entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT;
446 attr->u.syscall.match = LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME;
0133c199 447 break;
7a3d1328 448 case LTTNG_EVENT_ALL:
b8e2fb80 449 attr->instrumentation = LTTNG_KERNEL_ABI_ALL;
7a3d1328 450 break;
f3ed775e
DG
451 default:
452 ERR("Unknown kernel instrumentation type (%d)", ev->type);
71a3bb01 453 ret = LTTNG_ERR_INVALID;
f3ed775e
DG
454 goto error;
455 }
456
457 /* Copy event name */
b8e2fb80
FD
458 strncpy(attr->name, ev->name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
459 attr->name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
f3ed775e 460
54012638 461 /* Setting up a kernel event */
71a3bb01
FD
462 local_kernel_event->fd = -1;
463 local_kernel_event->event = attr;
464 local_kernel_event->enabled = 1;
465 local_kernel_event->filter_expression = filter_expression;
466 local_kernel_event->filter = filter;
dcabc190 467 local_kernel_event->userspace_probe_location = userspace_probe_location;
54012638 468
71a3bb01
FD
469 *kernel_event = local_kernel_event;
470
471 return LTTNG_OK;
54012638
DG
472
473error:
a969e101
MD
474 free(filter_expression);
475 free(filter);
71a3bb01 476 free(local_kernel_event);
a2c0da86 477 free(attr);
71a3bb01 478 return ret;
54012638
DG
479}
480
352b58f5
JR
481/*
482 * Allocate and initialize a kernel token event rule.
483 *
484 * Return pointer to structure or NULL.
485 */
486enum lttng_error_code trace_kernel_create_event_notifier_rule(
487 struct lttng_trigger *trigger,
488 uint64_t token,
90aa04a1 489 uint64_t error_counter_index,
352b58f5
JR
490 struct ltt_kernel_event_notifier_rule **event_notifier_rule)
491{
492 enum lttng_error_code ret = LTTNG_OK;
493 enum lttng_condition_type condition_type;
494 enum lttng_event_rule_type event_rule_type;
495 enum lttng_condition_status condition_status;
496 struct ltt_kernel_event_notifier_rule *local_kernel_token_event_rule;
497 const struct lttng_condition *condition = NULL;
498 const struct lttng_event_rule *event_rule = NULL;
499
a0377dfe 500 LTTNG_ASSERT(event_notifier_rule);
352b58f5 501
7c1f6da2 502 condition = lttng_trigger_get_const_condition(trigger);
a0377dfe 503 LTTNG_ASSERT(condition);
352b58f5
JR
504
505 condition_type = lttng_condition_get_type(condition);
a0377dfe 506 LTTNG_ASSERT(condition_type == LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
352b58f5 507
8dbb86b8 508 condition_status = lttng_condition_event_rule_matches_get_rule(
352b58f5 509 condition, &event_rule);
a0377dfe
FD
510 LTTNG_ASSERT(condition_status == LTTNG_CONDITION_STATUS_OK);
511 LTTNG_ASSERT(event_rule);
352b58f5
JR
512
513 event_rule_type = lttng_event_rule_get_type(event_rule);
a0377dfe 514 LTTNG_ASSERT(event_rule_type != LTTNG_EVENT_RULE_TYPE_UNKNOWN);
352b58f5
JR
515
516 local_kernel_token_event_rule =
64803277 517 zmalloc<ltt_kernel_event_notifier_rule>();
352b58f5
JR
518 if (local_kernel_token_event_rule == NULL) {
519 PERROR("Failed to allocate ltt_kernel_token_event_rule structure");
520 ret = LTTNG_ERR_NOMEM;
521 goto error;
522 }
523
524 local_kernel_token_event_rule->fd = -1;
525 local_kernel_token_event_rule->enabled = 1;
526 local_kernel_token_event_rule->token = token;
90aa04a1 527 local_kernel_token_event_rule->error_counter_index = error_counter_index;
352b58f5
JR
528
529 /* Get the reference of the event rule. */
530 lttng_trigger_get(trigger);
531
532 local_kernel_token_event_rule->trigger = trigger;
533 /* The event rule still owns the filter and bytecode. */
534 local_kernel_token_event_rule->filter =
535 lttng_event_rule_get_filter_bytecode(event_rule);
536
537 DBG3("Created kernel event notifier rule: token = %" PRIu64,
538 local_kernel_token_event_rule->token);
539error:
540 *event_notifier_rule = local_kernel_token_event_rule;
541 return ret;
542}
543
544/*
545 * Initialize a kernel trigger from an event rule.
546 */
547enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
548 const struct lttng_event_rule *rule,
b8e2fb80 549 struct lttng_kernel_abi_event_notifier *kernel_event_notifier)
352b58f5 550{
366a83b3 551 enum lttng_error_code ret_code;
352b58f5 552 const char *name;
366a83b3 553 int strncpy_ret;
352b58f5
JR
554
555 switch (lttng_event_rule_get_type(rule)) {
85522de5 556 case LTTNG_EVENT_RULE_TYPE_KERNEL_KPROBE:
352b58f5
JR
557 {
558 uint64_t address = 0, offset = 0;
559 const char *symbol_name = NULL;
560 const struct lttng_kernel_probe_location *location = NULL;
561 enum lttng_kernel_probe_location_status k_status;
562 enum lttng_event_rule_status status;
563
85522de5 564 status = lttng_event_rule_kernel_kprobe_get_location(rule, &location);
352b58f5 565 if (status != LTTNG_EVENT_RULE_STATUS_OK) {
366a83b3 566 ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
352b58f5
JR
567 goto error;
568 }
569
570 switch (lttng_kernel_probe_location_get_type(location)) {
571 case LTTNG_KERNEL_PROBE_LOCATION_TYPE_ADDRESS:
572 {
573 k_status = lttng_kernel_probe_location_address_get_address(
574 location, &address);
a0377dfe 575 LTTNG_ASSERT(k_status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK);
352b58f5
JR
576 break;
577 }
578 case LTTNG_KERNEL_PROBE_LOCATION_TYPE_SYMBOL_OFFSET:
579 {
580 k_status = lttng_kernel_probe_location_symbol_get_offset(
581 location, &offset);
a0377dfe 582 LTTNG_ASSERT(k_status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK);
352b58f5
JR
583 symbol_name = lttng_kernel_probe_location_symbol_get_name(
584 location);
585 break;
586 }
587 default:
588 abort();
589 }
590
b8e2fb80 591 kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_ABI_KPROBE;
352b58f5
JR
592 kernel_event_notifier->event.u.kprobe.addr = address;
593 kernel_event_notifier->event.u.kprobe.offset = offset;
594 if (symbol_name) {
366a83b3 595 strncpy_ret = lttng_strncpy(
352b58f5 596 kernel_event_notifier->event.u.kprobe.symbol_name,
2d6df81a
JG
597 symbol_name,
598 sizeof(kernel_event_notifier->event.u.kprobe.symbol_name));
352b58f5 599
366a83b3
JG
600 if (strncpy_ret) {
601 ret_code = LTTNG_ERR_INVALID;
352b58f5
JR
602 goto error;
603 }
604 }
605
b8e2fb80 606 kernel_event_notifier->event.u.kprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
f2791161 607
85522de5 608 status = lttng_event_rule_kernel_kprobe_get_event_name(rule, &name);
a0377dfe 609 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK);
366a83b3 610 ret_code = LTTNG_OK;
352b58f5
JR
611 break;
612 }
46fd07ac 613 case LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE:
352b58f5
JR
614 {
615 const struct lttng_userspace_probe_location* location = NULL;
616 const struct lttng_userspace_probe_location_lookup_method *lookup = NULL;
617 enum lttng_event_rule_status status;
618
46fd07ac 619 status = lttng_event_rule_kernel_uprobe_get_location(rule, &location);
352b58f5 620 if (status != LTTNG_EVENT_RULE_STATUS_OK) {
366a83b3 621 ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
352b58f5
JR
622 goto error;
623 }
624
b8e2fb80 625 kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_ABI_UPROBE;
352b58f5
JR
626
627 lookup = lttng_userspace_probe_location_get_lookup_method(
628 location);
629 if (!lookup) {
366a83b3 630 ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
352b58f5
JR
631 goto error;
632 }
633
634 /*
635 * From the kernel tracer's perspective, all userspace probe
636 * event types are all the same: a file and an offset.
637 */
638 switch (lttng_userspace_probe_location_lookup_method_get_type(lookup)) {
639 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF:
640 /* Get the file descriptor on the target binary. */
641 kernel_event_notifier->event.u.uprobe.fd =
642 lttng_userspace_probe_location_function_get_binary_fd(location);
643
644 break;
645 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
646 /* Get the file descriptor on the target binary. */
647 kernel_event_notifier->event.u.uprobe.fd =
648 lttng_userspace_probe_location_tracepoint_get_binary_fd(location);
649 break;
650 default:
651 abort();
652 }
653
46fd07ac 654 status = lttng_event_rule_kernel_uprobe_get_event_name(
405f9e7d 655 rule, &name);
a0377dfe 656 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK);
366a83b3 657 ret_code = LTTNG_OK;
352b58f5
JR
658 break;
659 }
695f7044 660 case LTTNG_EVENT_RULE_TYPE_KERNEL_TRACEPOINT:
352b58f5 661 {
352b58f5 662 const enum lttng_event_rule_status status =
695f7044 663 lttng_event_rule_kernel_tracepoint_get_name_pattern(
352b58f5
JR
664 rule, &name);
665
a0377dfe 666 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK);
352b58f5 667 kernel_event_notifier->event.instrumentation =
b8e2fb80 668 LTTNG_KERNEL_ABI_TRACEPOINT;
352b58f5 669
366a83b3 670 ret_code = LTTNG_OK;
352b58f5
JR
671 break;
672 }
4f7da553 673 case LTTNG_EVENT_RULE_TYPE_KERNEL_SYSCALL:
352b58f5
JR
674 {
675 const enum lttng_event_rule_status status =
4f7da553 676 lttng_event_rule_kernel_syscall_get_name_pattern(
352b58f5 677 rule, &name);
4f7da553 678 const enum lttng_event_rule_kernel_syscall_emission_site
f6a5af19 679 emission_site =
4f7da553 680 lttng_event_rule_kernel_syscall_get_emission_site(rule);
b8e2fb80 681 enum lttng_kernel_abi_syscall_entryexit entryexit;
352b58f5 682
a0377dfe
FD
683 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK);
684 LTTNG_ASSERT(emission_site != LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_UNKNOWN);
57739a6b 685
f6a5af19 686 switch(emission_site) {
4f7da553 687 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY:
b8e2fb80 688 entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRY;
57739a6b 689 break;
4f7da553 690 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT:
b8e2fb80 691 entryexit = LTTNG_KERNEL_ABI_SYSCALL_EXIT;
57739a6b 692 break;
4f7da553 693 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT:
b8e2fb80 694 entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT;
57739a6b
JR
695 break;
696 default:
697 abort();
698 break;
699 }
352b58f5
JR
700
701 kernel_event_notifier->event.instrumentation =
b8e2fb80 702 LTTNG_KERNEL_ABI_SYSCALL;
352b58f5 703 kernel_event_notifier->event.u.syscall.abi =
b8e2fb80 704 LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL;
352b58f5 705 kernel_event_notifier->event.u.syscall.entryexit =
57739a6b 706 entryexit;
352b58f5 707 kernel_event_notifier->event.u.syscall.match =
b8e2fb80 708 LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME;
366a83b3 709 ret_code = LTTNG_OK;
352b58f5
JR
710 break;
711 }
352b58f5
JR
712 default:
713 abort();
714 break;
715 }
716
366a83b3 717 strncpy_ret = lttng_strncpy(kernel_event_notifier->event.name, name,
b8e2fb80 718 LTTNG_KERNEL_ABI_SYM_NAME_LEN);
366a83b3
JG
719 if (strncpy_ret) {
720 ret_code = LTTNG_ERR_INVALID;
352b58f5
JR
721 goto error;
722 }
723
724error:
366a83b3 725 return ret_code;
352b58f5 726}
54012638 727/*
050349bb 728 * Allocate and initialize a kernel metadata.
54012638 729 *
050349bb 730 * Return pointer to structure or NULL.
54012638 731 */
a4b92340 732struct ltt_kernel_metadata *trace_kernel_create_metadata(void)
54012638 733{
d42266a4 734 int ret;
54012638 735 struct ltt_kernel_metadata *lkm;
f3ed775e 736 struct lttng_channel *chan;
54012638 737
64803277
SM
738 lkm = zmalloc<ltt_kernel_metadata>();
739 chan = zmalloc<lttng_channel>();
f3ed775e 740 if (lkm == NULL || chan == NULL) {
df0f840b 741 PERROR("kernel metadata zmalloc");
54012638
DG
742 goto error;
743 }
744
d42266a4
JG
745 ret = lttng_strncpy(
746 chan->name, DEFAULT_METADATA_NAME, sizeof(chan->name));
747 if (ret) {
748 ERR("Failed to initialize metadata channel name to `%s`",
749 DEFAULT_METADATA_NAME);
750 goto error;
751 }
752
54012638 753 /* Set default attributes */
d42266a4 754 chan->attr.overwrite = DEFAULT_METADATA_OVERWRITE;
3e230f92 755 chan->attr.subbuf_size = default_get_metadata_subbuf_size();
b389abbe 756 chan->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM;
d42266a4
JG
757 chan->attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER;
758 chan->attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER;;
759
760
761 /*
762 * The metadata channel of kernel sessions must use the "mmap"
763 * back-end since the consumer daemon accumulates complete
764 * metadata units before sending them to the relay daemon in
765 * live mode. The consumer daemon also needs to extract the contents
766 * of the metadata cache when computing a rotation position.
767 *
768 * In both cases, it is not possible to rely on the splice
769 * back-end as the consumer daemon may need to accumulate more
770 * content than can be backed by the ring buffer's underlying
771 * pages.
772 */
773 chan->attr.output = LTTNG_EVENT_MMAP;
774 chan->attr.tracefile_size = 0;
775 chan->attr.tracefile_count = 0;
776 chan->attr.live_timer_interval = 0;
54012638
DG
777
778 /* Init metadata */
03550b58 779 lkm->fd = -1;
f3ed775e 780 lkm->conf = chan;
54012638
DG
781
782 return lkm;
783
784error:
a2c0da86
MD
785 free(lkm);
786 free(chan);
54012638
DG
787 return NULL;
788}
789
790/*
050349bb
DG
791 * Allocate and initialize a kernel stream. The stream is set to ACTIVE_FD by
792 * default.
54012638 793 *
050349bb 794 * Return pointer to structure or NULL.
54012638 795 */
00e2e675
DG
796struct ltt_kernel_stream *trace_kernel_create_stream(const char *name,
797 unsigned int count)
54012638 798{
00e2e675 799 int ret;
54012638
DG
800 struct ltt_kernel_stream *lks;
801
a0377dfe 802 LTTNG_ASSERT(name);
0525e9ae 803
64803277 804 lks = zmalloc<ltt_kernel_stream>();
54012638 805 if (lks == NULL) {
df0f840b 806 PERROR("kernel stream zmalloc");
54012638
DG
807 goto error;
808 }
809
00e2e675 810 /* Set name */
535b8ff4 811 ret = snprintf(lks->name, sizeof(lks->name), "%s_%u", name, count);
00e2e675
DG
812 if (ret < 0) {
813 PERROR("snprintf stream name");
814 goto error;
815 }
816 lks->name[sizeof(lks->name) - 1] = '\0';
817
54012638 818 /* Init stream */
03550b58 819 lks->fd = -1;
54012638 820 lks->state = 0;
ffe60014 821 lks->cpu = count;
54012638
DG
822
823 return lks;
824
825error:
826 return NULL;
827}
c363b55d 828
050349bb
DG
829/*
830 * Cleanup kernel stream structure.
831 */
62499ad6 832void trace_kernel_destroy_stream(struct ltt_kernel_stream *stream)
c363b55d 833{
a0377dfe 834 LTTNG_ASSERT(stream);
0525e9ae 835
33a2b854 836 DBG("[trace] Closing stream fd %d", stream->fd);
c363b55d 837 /* Close kernel fd */
03550b58 838 if (stream->fd >= 0) {
c617c0c6
MD
839 int ret;
840
03550b58
MD
841 ret = close(stream->fd);
842 if (ret) {
843 PERROR("close");
844 }
799e2c4f 845 }
c363b55d
DG
846 /* Remove from stream list */
847 cds_list_del(&stream->list);
f9815039 848
c363b55d
DG
849 free(stream);
850}
851
050349bb
DG
852/*
853 * Cleanup kernel event structure.
854 */
62499ad6 855void trace_kernel_destroy_event(struct ltt_kernel_event *event)
c363b55d 856{
a0377dfe 857 LTTNG_ASSERT(event);
0525e9ae 858
87eb4ab8 859 if (event->fd >= 0) {
c617c0c6
MD
860 int ret;
861
87eb4ab8
MD
862 DBG("[trace] Closing event fd %d", event->fd);
863 /* Close kernel fd */
799e2c4f
MD
864 ret = close(event->fd);
865 if (ret) {
866 PERROR("close");
867 }
87eb4ab8 868 } else {
352b58f5 869 DBG("[trace] Tearing down event (no associated file descriptor)");
87eb4ab8 870 }
c363b55d
DG
871
872 /* Remove from event list */
873 cds_list_del(&event->list);
f9815039 874
00a62084
MD
875 free(event->filter_expression);
876 free(event->filter);
877
f9815039 878 free(event->event);
c363b55d
DG
879 free(event);
880}
881
352b58f5
JR
882/*
883 * Cleanup kernel event structure.
884 */
885static void free_token_event_rule_rcu(struct rcu_head *rcu_node)
886{
887 struct ltt_kernel_event_notifier_rule *rule = caa_container_of(rcu_node,
888 struct ltt_kernel_event_notifier_rule, rcu_node);
889
890 free(rule);
891}
892
893void trace_kernel_destroy_event_notifier_rule(
894 struct ltt_kernel_event_notifier_rule *event)
895{
a0377dfe 896 LTTNG_ASSERT(event);
352b58f5
JR
897
898 if (event->fd >= 0) {
899 const int ret = close(event->fd);
900
901 DBG("Closing kernel event notifier rule file descriptor: fd = %d",
902 event->fd);
903 if (ret) {
904 PERROR("Failed to close kernel event notifier file descriptor: fd = %d",
905 event->fd);
906 }
907 } else {
908 DBG("Destroying kernel event notifier rule (no associated file descriptor)");
909 }
910
911 lttng_trigger_put(event->trigger);
912 call_rcu(&event->rcu_node, free_token_event_rule_rcu);
913}
645328ae
DG
914/*
915 * Cleanup kernel context structure.
916 */
917void trace_kernel_destroy_context(struct ltt_kernel_context *ctx)
918{
a0377dfe 919 LTTNG_ASSERT(ctx);
645328ae 920
ba985c3a
JG
921 if (ctx->in_list) {
922 cds_list_del(&ctx->list);
923 }
645328ae
DG
924 free(ctx);
925}
926
050349bb
DG
927/*
928 * Cleanup kernel channel structure.
929 */
62499ad6 930void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel)
c363b55d 931{
af9737e9
DG
932 struct ltt_kernel_stream *stream, *stmp;
933 struct ltt_kernel_event *event, *etmp;
645328ae 934 struct ltt_kernel_context *ctx, *ctmp;
799e2c4f 935 int ret;
e9404c27 936 enum lttng_error_code status;
c363b55d 937
a0377dfe 938 LTTNG_ASSERT(channel);
0525e9ae 939
33a2b854 940 DBG("[trace] Closing channel fd %d", channel->fd);
c363b55d 941 /* Close kernel fd */
03550b58
MD
942 if (channel->fd >= 0) {
943 ret = close(channel->fd);
944 if (ret) {
945 PERROR("close");
946 }
799e2c4f 947 }
c363b55d
DG
948
949 /* For each stream in the channel list */
af9737e9 950 cds_list_for_each_entry_safe(stream, stmp, &channel->stream_list.head, list) {
62499ad6 951 trace_kernel_destroy_stream(stream);
c363b55d
DG
952 }
953
954 /* For each event in the channel list */
af9737e9 955 cds_list_for_each_entry_safe(event, etmp, &channel->events_list.head, list) {
62499ad6 956 trace_kernel_destroy_event(event);
c363b55d
DG
957 }
958
645328ae
DG
959 /* For each context in the channel list */
960 cds_list_for_each_entry_safe(ctx, ctmp, &channel->ctx_list, list) {
961 trace_kernel_destroy_context(ctx);
962 }
963
c363b55d
DG
964 /* Remove from channel list */
965 cds_list_del(&channel->list);
f9815039 966
412d7227
SM
967 if (the_notification_thread_handle &&
968 channel->published_to_notification_thread) {
63aaa3dc 969 status = notification_thread_command_remove_channel(
412d7227
SM
970 the_notification_thread_handle, channel->key,
971 LTTNG_DOMAIN_KERNEL);
a0377dfe 972 LTTNG_ASSERT(status == LTTNG_OK);
63aaa3dc 973 }
e9404c27 974 free(channel->channel->attr.extended.ptr);
f9815039 975 free(channel->channel);
c363b55d
DG
976 free(channel);
977}
978
050349bb
DG
979/*
980 * Cleanup kernel metadata structure.
981 */
62499ad6 982void trace_kernel_destroy_metadata(struct ltt_kernel_metadata *metadata)
c363b55d 983{
a0377dfe 984 LTTNG_ASSERT(metadata);
0525e9ae 985
33a2b854 986 DBG("[trace] Closing metadata fd %d", metadata->fd);
c363b55d 987 /* Close kernel fd */
03550b58 988 if (metadata->fd >= 0) {
c617c0c6
MD
989 int ret;
990
03550b58
MD
991 ret = close(metadata->fd);
992 if (ret) {
993 PERROR("close");
994 }
799e2c4f 995 }
c363b55d 996
f9815039 997 free(metadata->conf);
c363b55d
DG
998 free(metadata);
999}
1000
050349bb 1001/*
62499ad6 1002 * Cleanup kernel session structure
050349bb 1003 */
62499ad6 1004void trace_kernel_destroy_session(struct ltt_kernel_session *session)
c363b55d 1005{
af9737e9 1006 struct ltt_kernel_channel *channel, *ctmp;
799e2c4f 1007 int ret;
c363b55d 1008
a0377dfe 1009 LTTNG_ASSERT(session);
0525e9ae 1010
33a2b854 1011 DBG("[trace] Closing session fd %d", session->fd);
c363b55d 1012 /* Close kernel fds */
03550b58
MD
1013 if (session->fd >= 0) {
1014 ret = close(session->fd);
1015 if (ret) {
1016 PERROR("close");
1017 }
799e2c4f 1018 }
f9815039 1019
03550b58 1020 if (session->metadata_stream_fd >= 0) {
70dc1c34 1021 DBG("[trace] Closing metadata stream fd %d", session->metadata_stream_fd);
799e2c4f
MD
1022 ret = close(session->metadata_stream_fd);
1023 if (ret) {
1024 PERROR("close");
1025 }
70dc1c34 1026 }
c363b55d 1027
d36b8583 1028 if (session->metadata != NULL) {
62499ad6 1029 trace_kernel_destroy_metadata(session->metadata);
d36b8583 1030 }
c363b55d 1031
af9737e9 1032 cds_list_for_each_entry_safe(channel, ctmp, &session->channel_list.head, list) {
62499ad6 1033 trace_kernel_destroy_channel(channel);
c363b55d 1034 }
d070c424 1035}
c363b55d 1036
d070c424
MD
1037/* Free elements needed by destroy notifiers. */
1038void trace_kernel_free_session(struct ltt_kernel_session *session)
1039{
00e2e675 1040 /* Wipe consumer output object */
6addfa37 1041 consumer_output_put(session->consumer);
00e2e675 1042
159b042f
JG
1043 process_attr_tracker_destroy(session->tracker_pid);
1044 process_attr_tracker_destroy(session->tracker_vpid);
1045 process_attr_tracker_destroy(session->tracker_uid);
1046 process_attr_tracker_destroy(session->tracker_vuid);
1047 process_attr_tracker_destroy(session->tracker_gid);
1048 process_attr_tracker_destroy(session->tracker_vgid);
55c9e7ca 1049
c363b55d
DG
1050 free(session);
1051}
This page took 0.132783 seconds and 4 git commands to generate.