95184984d27cc15721080da921a950fd7f4fb0c9
[lttng-modules.git] / src / lttng-events.c
1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
2 *
3 * lttng-events.c
4 *
5 * Holds LTTng per-session event registry.
6 *
7 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 */
9
10 /*
11 * This page_alloc.h wrapper needs to be included before gfpflags.h because it
12 * overrides a function with a define.
13 */
14 #include "wrapper/page_alloc.h"
15
16 #include <linux/module.h>
17 #include <linux/mutex.h>
18 #include <linux/sched.h>
19 #include <linux/slab.h>
20 #include <linux/jiffies.h>
21 #include <linux/utsname.h>
22 #include <linux/err.h>
23 #include <linux/seq_file.h>
24 #include <linux/file.h>
25 #include <linux/anon_inodes.h>
26 #include <linux/uaccess.h>
27 #include <linux/vmalloc.h>
28 #include <linux/dmi.h>
29
30 #include <wrapper/compiler_attributes.h>
31 #include <wrapper/uuid.h>
32 #include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
33 #include <wrapper/random.h>
34 #include <wrapper/tracepoint.h>
35 #include <wrapper/list.h>
36 #include <wrapper/types.h>
37 #include <lttng/kernel-version.h>
38 #include <lttng/events.h>
39 #include <lttng/events-internal.h>
40 #include <lttng/lttng-bytecode.h>
41 #include <lttng/tracer.h>
42 #include <lttng/event-notifier-notification.h>
43 #include <lttng/abi-old.h>
44 #include <lttng/endian.h>
45 #include <lttng/string-utils.h>
46 #include <lttng/utils.h>
47 #include <counter/counter.h>
48 #include <ringbuffer/backend.h>
49 #include <ringbuffer/frontend.h>
50
51 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,16,0) \
52 || LTTNG_RHEL_KERNEL_RANGE(5,14,0,162,0,0, 5,15,0,0,0,0))
53 #include <linux/stdarg.h>
54 #else
55 #include <stdarg.h>
56 #endif
57
58 #define METADATA_CACHE_DEFAULT_SIZE 4096
59
60 static LIST_HEAD(sessions);
61 static LIST_HEAD(event_notifier_groups);
62 static LIST_HEAD(lttng_transport_list);
63 static LIST_HEAD(lttng_counter_transport_list);
64 /*
65 * Protect the sessions and metadata caches.
66 */
67 static DEFINE_MUTEX(sessions_mutex);
68 static struct kmem_cache *event_recorder_cache;
69 static struct kmem_cache *event_recorder_private_cache;
70 static struct kmem_cache *event_counter_cache;
71 static struct kmem_cache *event_counter_private_cache;
72 static struct kmem_cache *event_notifier_cache;
73 static struct kmem_cache *event_notifier_private_cache;
74
75 static void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session);
76 static void lttng_session_sync_event_enablers(struct lttng_kernel_session *session);
77 static void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group);
78 static void lttng_event_enabler_sync(struct lttng_event_enabler_common *event_enabler);
79
80 static void _lttng_event_destroy(struct lttng_kernel_event_common *event);
81 static void _lttng_channel_destroy(struct lttng_kernel_channel_common *chan);
82 static void _lttng_event_unregister(struct lttng_kernel_event_common *event);
83 static
84 int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common *event);
85 static
86 int _lttng_session_metadata_statedump(struct lttng_kernel_session *session);
87 static
88 void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream);
89 static
90 int _lttng_type_statedump(struct lttng_kernel_session *session,
91 const struct lttng_kernel_type_common *type,
92 enum lttng_kernel_string_encoding parent_encoding,
93 size_t nesting);
94 static
95 int _lttng_field_statedump(struct lttng_kernel_session *session,
96 const struct lttng_kernel_event_field *field,
97 size_t nesting, const char **prev_field_name_p);
98
99 void synchronize_trace(void)
100 {
101 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,1,0) || \
102 LTTNG_RHEL_KERNEL_RANGE(4,18,0,193,0,0, 4,19,0,0,0,0))
103 synchronize_rcu();
104 #else
105 synchronize_sched();
106 #endif
107
108 #ifdef CONFIG_PREEMPT_RT_FULL
109 synchronize_rcu();
110 #endif
111 }
112
113 void lttng_lock_sessions(void)
114 {
115 mutex_lock(&sessions_mutex);
116 }
117
118 void lttng_unlock_sessions(void)
119 {
120 mutex_unlock(&sessions_mutex);
121 }
122
123 static struct lttng_transport *lttng_transport_find(const char *name)
124 {
125 struct lttng_transport *transport;
126
127 list_for_each_entry(transport, &lttng_transport_list, node) {
128 if (!strcmp(transport->name, name))
129 return transport;
130 }
131 return NULL;
132 }
133
134 /*
135 * Called with sessions lock held.
136 */
137 int lttng_session_active(void)
138 {
139 struct lttng_kernel_session_private *iter;
140
141 list_for_each_entry(iter, &sessions, node) {
142 if (iter->pub->active)
143 return 1;
144 }
145 return 0;
146 }
147
148 struct lttng_kernel_session *lttng_session_create(void)
149 {
150 struct lttng_kernel_session *session;
151 struct lttng_kernel_session_private *session_priv;
152 struct lttng_metadata_cache *metadata_cache;
153 int i;
154
155 mutex_lock(&sessions_mutex);
156 session = lttng_kvzalloc(sizeof(*session), GFP_KERNEL);
157 if (!session)
158 goto err;
159 session_priv = lttng_kvzalloc(sizeof(*session_priv), GFP_KERNEL);
160 if (!session_priv)
161 goto err_free_session;
162 session->priv = session_priv;
163 session_priv->pub = session;
164
165 INIT_LIST_HEAD(&session_priv->chan_head);
166 INIT_LIST_HEAD(&session_priv->events_head);
167 lttng_guid_gen(&session_priv->uuid);
168
169 metadata_cache = kzalloc(sizeof(struct lttng_metadata_cache),
170 GFP_KERNEL);
171 if (!metadata_cache)
172 goto err_free_session_private;
173 metadata_cache->data = vzalloc(METADATA_CACHE_DEFAULT_SIZE);
174 if (!metadata_cache->data)
175 goto err_free_cache;
176 metadata_cache->cache_alloc = METADATA_CACHE_DEFAULT_SIZE;
177 kref_init(&metadata_cache->refcount);
178 mutex_init(&metadata_cache->lock);
179 session_priv->metadata_cache = metadata_cache;
180 INIT_LIST_HEAD(&metadata_cache->metadata_stream);
181 memcpy(&metadata_cache->uuid, &session_priv->uuid,
182 sizeof(metadata_cache->uuid));
183 INIT_LIST_HEAD(&session_priv->enablers_head);
184 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
185 INIT_HLIST_HEAD(&session_priv->events_name_ht.table[i]);
186 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
187 INIT_HLIST_HEAD(&session_priv->events_key_ht.table[i]);
188 list_add(&session_priv->node, &sessions);
189
190 if (lttng_id_tracker_init(&session->pid_tracker, session, TRACKER_PID))
191 goto tracker_alloc_error;
192 if (lttng_id_tracker_init(&session->vpid_tracker, session, TRACKER_VPID))
193 goto tracker_alloc_error;
194 if (lttng_id_tracker_init(&session->uid_tracker, session, TRACKER_UID))
195 goto tracker_alloc_error;
196 if (lttng_id_tracker_init(&session->vuid_tracker, session, TRACKER_VUID))
197 goto tracker_alloc_error;
198 if (lttng_id_tracker_init(&session->gid_tracker, session, TRACKER_GID))
199 goto tracker_alloc_error;
200 if (lttng_id_tracker_init(&session->vgid_tracker, session, TRACKER_VGID))
201 goto tracker_alloc_error;
202
203 mutex_unlock(&sessions_mutex);
204
205 return session;
206
207 tracker_alloc_error:
208 lttng_id_tracker_fini(&session->pid_tracker);
209 lttng_id_tracker_fini(&session->vpid_tracker);
210 lttng_id_tracker_fini(&session->uid_tracker);
211 lttng_id_tracker_fini(&session->vuid_tracker);
212 lttng_id_tracker_fini(&session->gid_tracker);
213 lttng_id_tracker_fini(&session->vgid_tracker);
214 err_free_cache:
215 kfree(metadata_cache);
216 err_free_session_private:
217 lttng_kvfree(session_priv);
218 err_free_session:
219 lttng_kvfree(session);
220 err:
221 mutex_unlock(&sessions_mutex);
222 return NULL;
223 }
224
225 static
226 struct lttng_counter_transport *lttng_counter_transport_find(const char *name)
227 {
228 struct lttng_counter_transport *transport;
229
230 list_for_each_entry(transport, &lttng_counter_transport_list, node) {
231 if (!strcmp(transport->name, name))
232 return transport;
233 }
234 return NULL;
235 }
236
237 struct lttng_kernel_channel_counter *lttng_kernel_counter_create(
238 const char *counter_transport_name,
239 size_t number_dimensions,
240 const struct lttng_kernel_counter_dimension *dimensions,
241 int64_t global_sum_step,
242 bool coalesce_hits)
243 {
244 struct lttng_counter_transport *counter_transport = NULL;
245 struct lttng_kernel_channel_counter *counter = NULL;
246
247 counter_transport = lttng_counter_transport_find(counter_transport_name);
248 if (!counter_transport) {
249 printk(KERN_WARNING "LTTng: counter transport %s not found.\n",
250 counter_transport_name);
251 goto notransport;
252 }
253 if (!try_module_get(counter_transport->owner)) {
254 printk(KERN_WARNING "LTTng: Can't lock counter transport module.\n");
255 goto notransport;
256 }
257
258 counter = counter_transport->ops.priv->counter_create(number_dimensions, dimensions,
259 global_sum_step);
260 if (!counter)
261 goto create_error;
262
263 /* Create event notifier error counter. */
264 counter->ops = &counter_transport->ops;
265 counter->priv->parent.coalesce_hits = coalesce_hits;
266 counter->priv->transport = counter_transport;
267 mutex_init(&counter->priv->map.lock);
268
269 return counter;
270
271 create_error:
272 if (counter_transport)
273 module_put(counter_transport->owner);
274 notransport:
275 return NULL;
276 }
277
278 static
279 void lttng_kernel_counter_destroy(struct lttng_kernel_channel_counter *counter)
280 {
281 struct lttng_counter_transport *counter_transport = counter->priv->transport;
282
283 lttng_kvfree(counter->priv->map.descriptors);
284 counter->ops->priv->counter_destroy(counter);
285 module_put(counter_transport->owner);
286 }
287
288 struct lttng_event_notifier_group *lttng_event_notifier_group_create(void)
289 {
290 struct lttng_transport *transport = NULL;
291 struct lttng_event_notifier_group *event_notifier_group;
292 const char *transport_name = "relay-event-notifier";
293 size_t subbuf_size = 4096; //TODO
294 size_t num_subbuf = 16; //TODO
295 unsigned int switch_timer_interval = 0;
296 unsigned int read_timer_interval = 0;
297 int i;
298
299 mutex_lock(&sessions_mutex);
300
301 transport = lttng_transport_find(transport_name);
302 if (!transport) {
303 printk(KERN_WARNING "LTTng: transport %s not found\n",
304 transport_name);
305 goto notransport;
306 }
307 if (!try_module_get(transport->owner)) {
308 printk(KERN_WARNING "LTTng: Can't lock transport %s module.\n",
309 transport_name);
310 goto notransport;
311 }
312
313 event_notifier_group = lttng_kvzalloc(sizeof(struct lttng_event_notifier_group),
314 GFP_KERNEL);
315 if (!event_notifier_group)
316 goto nomem;
317
318 /*
319 * Initialize the ring buffer used to store event notifier
320 * notifications.
321 */
322 event_notifier_group->ops = &transport->ops;
323 event_notifier_group->chan = transport->ops.priv->channel_create(
324 transport_name, event_notifier_group, NULL,
325 subbuf_size, num_subbuf, switch_timer_interval,
326 read_timer_interval);
327 if (!event_notifier_group->chan)
328 goto create_error;
329
330 event_notifier_group->transport = transport;
331
332 INIT_LIST_HEAD(&event_notifier_group->enablers_head);
333 INIT_LIST_HEAD(&event_notifier_group->event_notifiers_head);
334 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
335 INIT_HLIST_HEAD(&event_notifier_group->events_name_ht.table[i]);
336
337 list_add(&event_notifier_group->node, &event_notifier_groups);
338
339 mutex_unlock(&sessions_mutex);
340
341 return event_notifier_group;
342
343 create_error:
344 lttng_kvfree(event_notifier_group);
345 nomem:
346 if (transport)
347 module_put(transport->owner);
348 notransport:
349 mutex_unlock(&sessions_mutex);
350 return NULL;
351 }
352
353 void metadata_cache_destroy(struct kref *kref)
354 {
355 struct lttng_metadata_cache *cache =
356 container_of(kref, struct lttng_metadata_cache, refcount);
357 vfree(cache->data);
358 kfree(cache);
359 }
360
361 void lttng_session_destroy(struct lttng_kernel_session *session)
362 {
363 struct lttng_kernel_channel_common_private *chan_priv, *tmpchan_priv;
364 struct lttng_kernel_event_recorder_private *event_recorder_priv, *tmpevent_recorder_priv;
365 struct lttng_metadata_stream *metadata_stream;
366 struct lttng_event_enabler_common *event_enabler, *tmp_event_enabler;
367 int ret;
368
369 mutex_lock(&sessions_mutex);
370 WRITE_ONCE(session->active, 0);
371 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
372 ret = lttng_syscalls_unregister_syscall_table(&chan_priv->syscall_table);
373 WARN_ON(ret);
374 }
375 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node)
376 _lttng_event_unregister(&event_recorder_priv->pub->parent);
377 synchronize_trace(); /* Wait for in-flight events to complete */
378 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
379 ret = lttng_syscalls_destroy_syscall_table(&chan_priv->syscall_table);
380 WARN_ON(ret);
381 }
382 list_for_each_entry_safe(event_enabler, tmp_event_enabler, &session->priv->enablers_head, node)
383 lttng_event_enabler_destroy(event_enabler);
384 list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv, &session->priv->events_head, parent.parent.node)
385 _lttng_event_destroy(&event_recorder_priv->pub->parent);
386 list_for_each_entry_safe(chan_priv, tmpchan_priv, &session->priv->chan_head, node) {
387 _lttng_channel_destroy(chan_priv->pub);
388 }
389 mutex_lock(&session->priv->metadata_cache->lock);
390 list_for_each_entry(metadata_stream, &session->priv->metadata_cache->metadata_stream, node)
391 _lttng_metadata_channel_hangup(metadata_stream);
392 mutex_unlock(&session->priv->metadata_cache->lock);
393 lttng_id_tracker_fini(&session->pid_tracker);
394 lttng_id_tracker_fini(&session->vpid_tracker);
395 lttng_id_tracker_fini(&session->uid_tracker);
396 lttng_id_tracker_fini(&session->vuid_tracker);
397 lttng_id_tracker_fini(&session->gid_tracker);
398 lttng_id_tracker_fini(&session->vgid_tracker);
399 kref_put(&session->priv->metadata_cache->refcount, metadata_cache_destroy);
400 list_del(&session->priv->node);
401 mutex_unlock(&sessions_mutex);
402 lttng_kvfree(session->priv);
403 lttng_kvfree(session);
404 }
405
406 void lttng_event_notifier_group_destroy(
407 struct lttng_event_notifier_group *event_notifier_group)
408 {
409 struct lttng_event_enabler_common *event_enabler, *tmp_event_enabler;
410 struct lttng_kernel_event_notifier_private *event_notifier_priv, *tmpevent_notifier_priv;
411 int ret;
412
413 if (!event_notifier_group)
414 return;
415
416 mutex_lock(&sessions_mutex);
417
418 ret = lttng_syscalls_unregister_syscall_table(&event_notifier_group->syscall_table);
419 WARN_ON(ret);
420
421 list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
422 &event_notifier_group->event_notifiers_head, parent.node)
423 _lttng_event_unregister(&event_notifier_priv->pub->parent);
424
425 /* Wait for in-flight event notifier to complete */
426 synchronize_trace();
427
428 irq_work_sync(&event_notifier_group->wakeup_pending);
429
430 ret = lttng_syscalls_destroy_syscall_table(&event_notifier_group->syscall_table);
431 WARN_ON(ret);
432
433 list_for_each_entry_safe(event_enabler, tmp_event_enabler,
434 &event_notifier_group->enablers_head, node)
435 lttng_event_enabler_destroy(event_enabler);
436
437 list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
438 &event_notifier_group->event_notifiers_head, parent.node)
439 _lttng_event_destroy(&event_notifier_priv->pub->parent);
440
441 if (event_notifier_group->error_counter)
442 lttng_kernel_counter_destroy(event_notifier_group->error_counter);
443
444 event_notifier_group->ops->priv->channel_destroy(event_notifier_group->chan);
445 module_put(event_notifier_group->transport->owner);
446 list_del(&event_notifier_group->node);
447
448 mutex_unlock(&sessions_mutex);
449 lttng_kvfree(event_notifier_group);
450 }
451
452 int lttng_session_statedump(struct lttng_kernel_session *session)
453 {
454 int ret;
455
456 mutex_lock(&sessions_mutex);
457 ret = lttng_statedump_start(session);
458 mutex_unlock(&sessions_mutex);
459 return ret;
460 }
461
462 int lttng_session_enable(struct lttng_kernel_session *session)
463 {
464 int ret = 0;
465 struct lttng_kernel_channel_common_private *chan_priv;
466
467 mutex_lock(&sessions_mutex);
468 if (session->active) {
469 ret = -EBUSY;
470 goto end;
471 }
472
473 /* Set transient enabler state to "enabled" */
474 session->priv->tstate = 1;
475
476 /* We need to sync enablers with session before activation. */
477 lttng_session_sync_event_enablers(session);
478
479 /*
480 * Snapshot the number of events per channel to know the type of header
481 * we need to use.
482 */
483 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
484 struct lttng_kernel_channel_buffer_private *chan_buf_priv;
485
486 if (chan_priv->pub->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
487 continue;
488 chan_buf_priv = container_of(chan_priv, struct lttng_kernel_channel_buffer_private, parent);
489 if (chan_buf_priv->header_type)
490 continue; /* don't change it if session stop/restart */
491 if (chan_buf_priv->free_event_id < 31)
492 chan_buf_priv->header_type = 1; /* compact */
493 else
494 chan_buf_priv->header_type = 2; /* large */
495 }
496
497 /* Clear each stream's quiescent state. */
498 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
499 struct lttng_kernel_channel_buffer_private *chan_buf_priv;
500
501 if (chan_priv->pub->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
502 continue;
503 chan_buf_priv = container_of(chan_priv, struct lttng_kernel_channel_buffer_private, parent);
504 if (chan_buf_priv->channel_type != METADATA_CHANNEL)
505 lib_ring_buffer_clear_quiescent_channel(chan_buf_priv->rb_chan);
506 }
507
508 WRITE_ONCE(session->active, 1);
509 WRITE_ONCE(session->priv->been_active, 1);
510 ret = _lttng_session_metadata_statedump(session);
511 if (ret) {
512 WRITE_ONCE(session->active, 0);
513 goto end;
514 }
515 ret = lttng_statedump_start(session);
516 if (ret)
517 WRITE_ONCE(session->active, 0);
518 end:
519 mutex_unlock(&sessions_mutex);
520 return ret;
521 }
522
523 int lttng_session_disable(struct lttng_kernel_session *session)
524 {
525 int ret = 0;
526 struct lttng_kernel_channel_common_private *chan_priv;
527
528 mutex_lock(&sessions_mutex);
529 if (!session->active) {
530 ret = -EBUSY;
531 goto end;
532 }
533 WRITE_ONCE(session->active, 0);
534
535 /* Set transient enabler state to "disabled" */
536 session->priv->tstate = 0;
537 lttng_session_sync_event_enablers(session);
538
539 /* Set each stream's quiescent state. */
540 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
541 struct lttng_kernel_channel_buffer_private *chan_buf_priv;
542
543 if (chan_priv->pub->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
544 continue;
545 chan_buf_priv = container_of(chan_priv, struct lttng_kernel_channel_buffer_private, parent);
546 if (chan_buf_priv->channel_type != METADATA_CHANNEL)
547 lib_ring_buffer_set_quiescent_channel(chan_buf_priv->rb_chan);
548 }
549 end:
550 mutex_unlock(&sessions_mutex);
551 return ret;
552 }
553
554 int lttng_session_metadata_regenerate(struct lttng_kernel_session *session)
555 {
556 int ret = 0;
557 struct lttng_kernel_channel_common_private *chan_priv;
558 struct lttng_kernel_event_recorder_private *event_recorder_priv;
559 struct lttng_metadata_cache *cache = session->priv->metadata_cache;
560 struct lttng_metadata_stream *stream;
561
562 mutex_lock(&sessions_mutex);
563 if (!session->active) {
564 ret = -EBUSY;
565 goto end;
566 }
567
568 mutex_lock(&cache->lock);
569 memset(cache->data, 0, cache->cache_alloc);
570 cache->metadata_written = 0;
571 cache->version++;
572 list_for_each_entry(stream, &session->priv->metadata_cache->metadata_stream, node) {
573 stream->metadata_out = 0;
574 stream->metadata_in = 0;
575 }
576 mutex_unlock(&cache->lock);
577
578 session->priv->metadata_dumped = 0;
579 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
580 struct lttng_kernel_channel_buffer_private *chan_buf_priv;
581
582 if (chan_priv->pub->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
583 continue;
584 chan_buf_priv = container_of(chan_priv, struct lttng_kernel_channel_buffer_private, parent);
585 chan_buf_priv->metadata_dumped = 0;
586 }
587
588 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node) {
589 event_recorder_priv->metadata_dumped = 0;
590 }
591
592 ret = _lttng_session_metadata_statedump(session);
593
594 end:
595 mutex_unlock(&sessions_mutex);
596 return ret;
597 }
598
599 static
600 bool is_channel_buffer_metadata(struct lttng_kernel_channel_common *channel)
601 {
602 struct lttng_kernel_channel_buffer *chan_buf;
603
604 if (channel->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
605 return false;
606 chan_buf = container_of(channel, struct lttng_kernel_channel_buffer, parent);
607 if (chan_buf->priv->channel_type == METADATA_CHANNEL)
608 return true;
609 return false;
610 }
611
612 int lttng_channel_enable(struct lttng_kernel_channel_common *channel)
613 {
614 int ret = 0;
615
616 mutex_lock(&sessions_mutex);
617 if (is_channel_buffer_metadata(channel)) {
618 ret = -EPERM;
619 goto end;
620 }
621 if (channel->enabled) {
622 ret = -EEXIST;
623 goto end;
624 }
625 /* Set transient enabler state to "enabled" */
626 channel->priv->tstate = 1;
627 lttng_session_sync_event_enablers(channel->session);
628 /* Set atomically the state to "enabled" */
629 WRITE_ONCE(channel->enabled, 1);
630 end:
631 mutex_unlock(&sessions_mutex);
632 return ret;
633 }
634
635 int lttng_channel_disable(struct lttng_kernel_channel_common *channel)
636 {
637 int ret = 0;
638
639 mutex_lock(&sessions_mutex);
640 if (is_channel_buffer_metadata(channel)) {
641 ret = -EPERM;
642 goto end;
643 }
644 if (!channel->enabled) {
645 ret = -EEXIST;
646 goto end;
647 }
648 /* Set atomically the state to "disabled" */
649 WRITE_ONCE(channel->enabled, 0);
650 /* Set transient enabler state to "enabled" */
651 channel->priv->tstate = 0;
652 lttng_session_sync_event_enablers(channel->session);
653 end:
654 mutex_unlock(&sessions_mutex);
655 return ret;
656 }
657
658 int lttng_event_enable(struct lttng_kernel_event_common *event)
659 {
660 int ret = 0;
661
662 mutex_lock(&sessions_mutex);
663 switch (event->type) {
664 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
665 {
666 struct lttng_kernel_event_recorder *event_recorder =
667 container_of(event, struct lttng_kernel_event_recorder, parent);
668
669 if (event_recorder->chan->priv->channel_type == METADATA_CHANNEL) {
670 ret = -EPERM;
671 goto end;
672 }
673 break;
674 }
675 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
676 lttng_fallthrough;
677 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
678 break;
679 default:
680 break;
681 }
682
683 if (event->enabled) {
684 ret = -EEXIST;
685 goto end;
686 }
687 switch (event->priv->instrumentation) {
688 case LTTNG_KERNEL_ABI_TRACEPOINT:
689 lttng_fallthrough;
690 case LTTNG_KERNEL_ABI_SYSCALL:
691 lttng_fallthrough;
692 case LTTNG_KERNEL_ABI_KPROBE:
693 lttng_fallthrough;
694 case LTTNG_KERNEL_ABI_KRETPROBE:
695 ret = -EINVAL;
696 break;
697
698 case LTTNG_KERNEL_ABI_UPROBE:
699 WRITE_ONCE(event->enabled, 1);
700 break;
701
702 case LTTNG_KERNEL_ABI_FUNCTION:
703 lttng_fallthrough;
704 case LTTNG_KERNEL_ABI_NOOP:
705 lttng_fallthrough;
706 default:
707 WARN_ON_ONCE(1);
708 ret = -EINVAL;
709 }
710 end:
711 mutex_unlock(&sessions_mutex);
712 return ret;
713 }
714
715 int lttng_event_disable(struct lttng_kernel_event_common *event)
716 {
717 int ret = 0;
718
719 mutex_lock(&sessions_mutex);
720 switch (event->type) {
721 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
722 {
723 struct lttng_kernel_event_recorder *event_recorder =
724 container_of(event, struct lttng_kernel_event_recorder, parent);
725
726 if (event_recorder->chan->priv->channel_type == METADATA_CHANNEL) {
727 ret = -EPERM;
728 goto end;
729 }
730 break;
731 }
732 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
733 lttng_fallthrough;
734 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
735 break;
736 default:
737 break;
738 }
739
740 if (!event->enabled) {
741 ret = -EEXIST;
742 goto end;
743 }
744 switch (event->priv->instrumentation) {
745 case LTTNG_KERNEL_ABI_TRACEPOINT:
746 lttng_fallthrough;
747 case LTTNG_KERNEL_ABI_SYSCALL:
748 lttng_fallthrough;
749 case LTTNG_KERNEL_ABI_KPROBE:
750 lttng_fallthrough;
751 case LTTNG_KERNEL_ABI_KRETPROBE:
752 ret = -EINVAL;
753 break;
754
755 case LTTNG_KERNEL_ABI_UPROBE:
756 WRITE_ONCE(event->enabled, 0);
757 break;
758
759 case LTTNG_KERNEL_ABI_FUNCTION:
760 lttng_fallthrough;
761 case LTTNG_KERNEL_ABI_NOOP:
762 lttng_fallthrough;
763 default:
764 WARN_ON_ONCE(1);
765 ret = -EINVAL;
766 }
767 end:
768 mutex_unlock(&sessions_mutex);
769 return ret;
770 }
771
772 struct lttng_kernel_channel_buffer *lttng_channel_buffer_create(struct lttng_kernel_session *session,
773 const char *transport_name,
774 void *buf_addr,
775 size_t subbuf_size, size_t num_subbuf,
776 unsigned int switch_timer_interval,
777 unsigned int read_timer_interval,
778 enum channel_type channel_type)
779 {
780 struct lttng_kernel_channel_buffer *chan;
781 struct lttng_transport *transport = NULL;
782
783 mutex_lock(&sessions_mutex);
784 if (session->priv->been_active && channel_type != METADATA_CHANNEL)
785 goto active; /* Refuse to add channel to active session */
786 transport = lttng_transport_find(transport_name);
787 if (!transport) {
788 printk(KERN_WARNING "LTTng: transport %s not found\n",
789 transport_name);
790 goto notransport;
791 }
792 if (!try_module_get(transport->owner)) {
793 printk(KERN_WARNING "LTTng: Can't lock transport module.\n");
794 goto notransport;
795 }
796 chan = lttng_kernel_alloc_channel_buffer();
797 if (!chan)
798 goto nomem;
799 chan->parent.session = session;
800 chan->priv->id = session->priv->free_chan_id++;
801 chan->ops = &transport->ops;
802 /*
803 * Note: the channel creation op already writes into the packet
804 * headers. Therefore the "chan" information used as input
805 * should be already accessible.
806 */
807 chan->priv->rb_chan = transport->ops.priv->channel_create(transport_name,
808 chan, buf_addr, subbuf_size, num_subbuf,
809 switch_timer_interval, read_timer_interval);
810 if (!chan->priv->rb_chan)
811 goto create_error;
812 chan->priv->parent.tstate = 1;
813 chan->parent.enabled = 1;
814 chan->priv->transport = transport;
815 chan->priv->channel_type = channel_type;
816 list_add(&chan->priv->parent.node, &session->priv->chan_head);
817 mutex_unlock(&sessions_mutex);
818 return chan;
819
820 create_error:
821 lttng_kernel_free_channel_common(&chan->parent);
822 nomem:
823 if (transport)
824 module_put(transport->owner);
825 notransport:
826 active:
827 mutex_unlock(&sessions_mutex);
828 return NULL;
829 }
830
831 /*
832 * Only used internally at session destruction for per-cpu channels, and
833 * when metadata channel is released.
834 * Needs to be called with sessions mutex held.
835 */
836 static
837 void lttng_kernel_buffer_destroy(struct lttng_kernel_channel_buffer *chan)
838 {
839 chan->ops->priv->channel_destroy(chan->priv->rb_chan);
840 module_put(chan->priv->transport->owner);
841 lttng_kernel_destroy_context(chan->priv->ctx);
842 kfree(chan->priv);
843 kfree(chan);
844 }
845
846 static
847 void _lttng_channel_destroy(struct lttng_kernel_channel_common *chan)
848 {
849 list_del(&chan->priv->node);
850
851 switch (chan->type) {
852 case LTTNG_KERNEL_CHANNEL_TYPE_BUFFER:
853 {
854 struct lttng_kernel_channel_buffer *chan_buf =
855 container_of(chan, struct lttng_kernel_channel_buffer, parent);
856 lttng_kernel_buffer_destroy(chan_buf);
857 break;
858 }
859 case LTTNG_KERNEL_CHANNEL_TYPE_COUNTER:
860 {
861 struct lttng_kernel_channel_counter *chan_counter =
862 container_of(chan, struct lttng_kernel_channel_counter, parent);
863 lttng_kernel_counter_destroy(chan_counter);
864 break;
865 }
866 default:
867 WARN_ON_ONCE(1);
868 }
869 }
870
871 void lttng_metadata_channel_buffer_destroy(struct lttng_kernel_channel_buffer *chan)
872 {
873 BUG_ON(chan->priv->channel_type != METADATA_CHANNEL);
874
875 /* Protect the metadata cache with the sessions_mutex. */
876 mutex_lock(&sessions_mutex);
877 _lttng_channel_destroy(&chan->parent);
878 mutex_unlock(&sessions_mutex);
879 }
880 EXPORT_SYMBOL_GPL(lttng_metadata_channel_buffer_destroy);
881
882 static
883 void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream)
884 {
885 stream->finalized = 1;
886 wake_up_interruptible(&stream->read_wait);
887 }
888
889 static
890 bool lttng_kernel_event_id_available(struct lttng_event_enabler_common *event_enabler)
891 {
892 struct lttng_kernel_abi_event *event_param = &event_enabler->event_param;
893 enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
894
895 switch (event_enabler->enabler_type) {
896 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
897 {
898 struct lttng_event_recorder_enabler *event_recorder_enabler =
899 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
900 struct lttng_kernel_channel_buffer *chan = event_recorder_enabler->chan;
901
902 switch (itype) {
903 case LTTNG_KERNEL_ABI_TRACEPOINT:
904 lttng_fallthrough;
905 case LTTNG_KERNEL_ABI_KPROBE:
906 lttng_fallthrough;
907 case LTTNG_KERNEL_ABI_SYSCALL:
908 lttng_fallthrough;
909 case LTTNG_KERNEL_ABI_UPROBE:
910 if (chan->priv->free_event_id == -1U)
911 return false;
912 return true;
913 case LTTNG_KERNEL_ABI_KRETPROBE:
914 /* kretprobes require 2 event IDs. */
915 if (chan->priv->free_event_id >= -2U)
916 return false;
917 return true;
918 default:
919 WARN_ON_ONCE(1);
920 return false;
921 }
922 }
923 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
924 {
925 struct lttng_event_counter_enabler *event_counter_enabler =
926 container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
927 struct lttng_kernel_channel_counter *chan = event_counter_enabler->chan;
928 size_t nr_dimensions, max_nr_elem;
929
930 if (lttng_kernel_counter_get_nr_dimensions(chan, &nr_dimensions))
931 return false;
932 WARN_ON_ONCE(nr_dimensions != 1);
933 if (nr_dimensions != 1)
934 return false;
935 if (lttng_kernel_counter_get_max_nr_elem(chan, &max_nr_elem))
936 return false;
937 switch (itype) {
938 case LTTNG_KERNEL_ABI_TRACEPOINT:
939 lttng_fallthrough;
940 case LTTNG_KERNEL_ABI_KPROBE:
941 lttng_fallthrough;
942 case LTTNG_KERNEL_ABI_SYSCALL:
943 lttng_fallthrough;
944 case LTTNG_KERNEL_ABI_UPROBE:
945 if (chan->priv->free_index >= max_nr_elem)
946 return false;
947 return true;
948 case LTTNG_KERNEL_ABI_KRETPROBE:
949 /* kretprobes require 2 event IDs. */
950 if (chan->priv->free_index + 1 >= max_nr_elem)
951 return false;
952 return true;
953 default:
954 WARN_ON_ONCE(1);
955 return false;
956 }
957 }
958 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
959 return true;
960 default:
961 WARN_ON_ONCE(1);
962 return false;
963 }
964 }
965
966 static
967 struct lttng_kernel_event_common *lttng_kernel_event_alloc(struct lttng_event_enabler_common *event_enabler,
968 struct hlist_head *key_head,
969 const char *key_string)
970 {
971 struct lttng_kernel_abi_event *event_param = &event_enabler->event_param;
972 enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
973
974 switch (event_enabler->enabler_type) {
975 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
976 {
977 struct lttng_event_recorder_enabler *event_recorder_enabler =
978 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
979 struct lttng_kernel_event_recorder *event_recorder;
980 struct lttng_kernel_event_recorder_private *event_recorder_priv;
981 struct lttng_kernel_channel_buffer *chan = event_recorder_enabler->chan;
982
983 WARN_ON_ONCE(key_head); /* not implemented. */
984 event_recorder = kmem_cache_zalloc(event_recorder_cache, GFP_KERNEL);
985 if (!event_recorder)
986 return NULL;
987 event_recorder_priv = kmem_cache_zalloc(event_recorder_private_cache, GFP_KERNEL);
988 if (!event_recorder_priv) {
989 kmem_cache_free(event_recorder_private_cache, event_recorder);
990 return NULL;
991 }
992 event_recorder_priv->pub = event_recorder;
993 event_recorder_priv->parent.parent.pub = &event_recorder->parent;
994 event_recorder->priv = event_recorder_priv;
995 event_recorder->parent.priv = &event_recorder_priv->parent.parent;
996
997 event_recorder->parent.type = LTTNG_KERNEL_EVENT_TYPE_RECORDER;
998 event_recorder->parent.run_filter = lttng_kernel_interpret_event_filter;
999 event_recorder->priv->parent.parent.instrumentation = itype;
1000 INIT_LIST_HEAD(&event_recorder->priv->parent.parent.filter_bytecode_runtime_head);
1001 INIT_LIST_HEAD(&event_recorder->priv->parent.parent.enablers_ref_head);
1002
1003 event_recorder->chan = chan;
1004 event_recorder->priv->parent.chan = &chan->parent;
1005 event_recorder->priv->parent.id = chan->priv->free_event_id++;
1006 return &event_recorder->parent;
1007 }
1008 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
1009 {
1010 struct lttng_event_notifier_enabler *event_notifier_enabler =
1011 container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
1012 struct lttng_kernel_event_notifier *event_notifier;
1013 struct lttng_kernel_event_notifier_private *event_notifier_priv;
1014
1015 WARN_ON_ONCE(key_head); /* not implemented. */
1016 event_notifier = kmem_cache_zalloc(event_notifier_cache, GFP_KERNEL);
1017 if (!event_notifier)
1018 return NULL;
1019 event_notifier_priv = kmem_cache_zalloc(event_notifier_private_cache, GFP_KERNEL);
1020 if (!event_notifier_priv) {
1021 kmem_cache_free(event_notifier_private_cache, event_notifier);
1022 return NULL;
1023 }
1024 event_notifier_priv->pub = event_notifier;
1025 event_notifier_priv->parent.pub = &event_notifier->parent;
1026 event_notifier->priv = event_notifier_priv;
1027 event_notifier->parent.priv = &event_notifier_priv->parent;
1028
1029 event_notifier->parent.type = LTTNG_KERNEL_EVENT_TYPE_NOTIFIER;
1030 event_notifier->parent.run_filter = lttng_kernel_interpret_event_filter;
1031 event_notifier->priv->parent.instrumentation = itype;
1032 event_notifier->priv->parent.user_token = event_enabler->user_token;
1033 INIT_LIST_HEAD(&event_notifier->priv->parent.filter_bytecode_runtime_head);
1034 INIT_LIST_HEAD(&event_notifier->priv->parent.enablers_ref_head);
1035
1036 event_notifier->priv->group = event_notifier_enabler->group;
1037 event_notifier->priv->error_counter_index = event_notifier_enabler->error_counter_index;
1038 event_notifier->priv->num_captures = 0;
1039 event_notifier->notification_send = lttng_event_notifier_notification_send;
1040 INIT_LIST_HEAD(&event_notifier->priv->capture_bytecode_runtime_head);
1041 return &event_notifier->parent;
1042 }
1043 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
1044 {
1045 struct lttng_event_counter_enabler *event_counter_enabler =
1046 container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
1047 struct lttng_kernel_event_counter *event_counter;
1048 struct lttng_kernel_event_counter_private *event_counter_priv;
1049 struct lttng_kernel_channel_counter *chan = event_counter_enabler->chan;
1050 bool key_found = false;
1051
1052 event_counter = kmem_cache_zalloc(event_counter_cache, GFP_KERNEL);
1053 if (!event_counter)
1054 return NULL;
1055 event_counter_priv = kmem_cache_zalloc(event_counter_private_cache, GFP_KERNEL);
1056 if (!event_counter_priv) {
1057 kmem_cache_free(event_counter_private_cache, event_counter);
1058 return NULL;
1059 }
1060 event_counter_priv->pub = event_counter;
1061 event_counter_priv->parent.parent.pub = &event_counter->parent;
1062 event_counter->priv = event_counter_priv;
1063 event_counter->parent.priv = &event_counter_priv->parent.parent;
1064
1065 event_counter->parent.type = LTTNG_KERNEL_EVENT_TYPE_COUNTER;
1066 event_counter->parent.run_filter = lttng_kernel_interpret_event_filter;
1067 event_counter->priv->parent.parent.instrumentation = itype;
1068 INIT_LIST_HEAD(&event_counter->priv->parent.parent.filter_bytecode_runtime_head);
1069 INIT_LIST_HEAD(&event_counter->priv->parent.parent.enablers_ref_head);
1070
1071 event_counter->chan = chan;
1072 event_counter->priv->parent.chan = &chan->parent;
1073 if (!chan->priv->parent.coalesce_hits)
1074 event_counter->priv->parent.parent.user_token = event_counter_enabler->parent.parent.user_token;
1075 strcpy(event_counter_priv->key, key_string);
1076 event_counter_priv->action = event_counter_enabler->action;
1077 if (key_head) {
1078 struct lttng_kernel_event_counter_private *event_counter_priv_iter;
1079
1080 lttng_hlist_for_each_entry(event_counter_priv_iter, key_head, hlist_key_node) {
1081 if (!strcmp(key_string, event_counter_priv_iter->key)) {
1082 /* Same key, use same id. */
1083 key_found = true;
1084 event_counter->priv->parent.id = event_counter_priv_iter->parent.id;
1085 break;
1086 }
1087 }
1088 }
1089 if (!key_found)
1090 event_counter->priv->parent.id = chan->priv->free_index++;
1091 return &event_counter->parent;
1092 }
1093 default:
1094 return NULL;
1095 }
1096 }
1097
1098 static
1099 void lttng_kernel_event_free(struct lttng_kernel_event_common *event)
1100 {
1101 switch (event->type) {
1102 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1103 {
1104 struct lttng_kernel_event_recorder *event_recorder =
1105 container_of(event, struct lttng_kernel_event_recorder, parent);
1106
1107 kmem_cache_free(event_recorder_private_cache, event_recorder->priv);
1108 kmem_cache_free(event_recorder_cache, event_recorder);
1109 break;
1110 }
1111 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
1112 {
1113 struct lttng_kernel_event_counter *event_counter =
1114 container_of(event, struct lttng_kernel_event_counter, parent);
1115
1116 kmem_cache_free(event_counter_private_cache, event_counter->priv);
1117 kmem_cache_free(event_counter_cache, event_counter);
1118 break;
1119 }
1120 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1121 {
1122 struct lttng_kernel_event_notifier *event_notifier =
1123 container_of(event, struct lttng_kernel_event_notifier, parent);
1124
1125 kmem_cache_free(event_notifier_private_cache, event_notifier->priv);
1126 kmem_cache_free(event_notifier_cache, event_notifier);
1127 break;
1128 }
1129 default:
1130 WARN_ON_ONCE(1);
1131 }
1132 }
1133
1134 static
1135 int lttng_kernel_event_notifier_clear_error_counter(struct lttng_kernel_event_common *event)
1136 {
1137 switch (event->type) {
1138 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1139 lttng_fallthrough;
1140 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
1141 return 0;
1142
1143 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1144 {
1145 struct lttng_kernel_event_notifier *event_notifier =
1146 container_of(event, struct lttng_kernel_event_notifier, parent);
1147 struct lttng_kernel_channel_counter *error_counter;
1148 struct lttng_event_notifier_group *event_notifier_group = event_notifier->priv->group;
1149 size_t dimension_index[1];
1150 int ret;
1151
1152 /*
1153 * Clear the error counter bucket. The sessiond keeps track of which
1154 * bucket is currently in use. We trust it. The session lock
1155 * synchronizes against concurrent creation of the error
1156 * counter.
1157 */
1158 error_counter = event_notifier_group->error_counter;
1159 if (!error_counter)
1160 return 0;
1161 /*
1162 * Check that the index is within the boundary of the counter.
1163 */
1164 if (event_notifier->priv->error_counter_index >= event_notifier_group->error_counter_len) {
1165 printk(KERN_INFO "LTTng: event_notifier: Error counter index out-of-bound: counter-len=%zu, index=%llu\n",
1166 event_notifier_group->error_counter_len, event_notifier->priv->error_counter_index);
1167 return -EINVAL;
1168 }
1169
1170 dimension_index[0] = event_notifier->priv->error_counter_index;
1171 ret = error_counter->ops->priv->counter_clear(error_counter, dimension_index);
1172 if (ret) {
1173 printk(KERN_INFO "LTTng: event_notifier: Unable to clear error counter bucket %llu\n",
1174 event_notifier->priv->error_counter_index);
1175 return -EINVAL;
1176 }
1177 return 0;
1178 }
1179 default:
1180 return -EINVAL;
1181 }
1182 }
1183
1184 int format_event_key(struct lttng_event_enabler_common *event_enabler, char *key_string,
1185 const char *event_name)
1186 {
1187 struct lttng_event_counter_enabler *event_counter_enabler;
1188 const struct lttng_kernel_counter_key_dimension *dim;
1189 size_t i, left = LTTNG_KERNEL_COUNTER_KEY_LEN;
1190 const struct lttng_kernel_counter_key *key;
1191
1192 if (event_enabler->enabler_type != LTTNG_EVENT_ENABLER_TYPE_COUNTER)
1193 return 0;
1194 event_counter_enabler = container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
1195 key = event_counter_enabler->key;
1196 if (!key->nr_dimensions)
1197 return 0;
1198 /* Currently event keys can only be specified on a single dimension. */
1199 if (key->nr_dimensions != 1)
1200 return -EINVAL;
1201 dim = &key->dimension_array[0];
1202 for (i = 0; i < dim->nr_key_tokens; i++) {
1203 const struct lttng_key_token *token = &dim->token_array[i];
1204 size_t token_len;
1205 const char *str;
1206
1207 switch (token->type) {
1208 case LTTNG_KEY_TOKEN_STRING:
1209 str = token->str;
1210 break;
1211 case LTTNG_KEY_TOKEN_EVENT_NAME:
1212 str = event_name;
1213 break;
1214 default:
1215 return -EINVAL;
1216 }
1217 token_len = strlen(str);
1218 if (token_len >= left)
1219 return -EINVAL;
1220 strcat(key_string, str);
1221 left -= token_len;
1222 }
1223 return 0;
1224 }
1225
1226 static
1227 bool match_event_key(struct lttng_kernel_event_common *event, const char *key_string)
1228 {
1229 switch (event->type) {
1230 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1231 lttng_fallthrough;
1232 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1233 return true;
1234
1235 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
1236 {
1237 struct lttng_kernel_event_counter_private *event_counter_priv =
1238 container_of(event->priv, struct lttng_kernel_event_counter_private, parent.parent);
1239
1240 if (key_string[0] == '\0')
1241 return true;
1242 return !strcmp(key_string, event_counter_priv->key);
1243 }
1244
1245 default:
1246 WARN_ON_ONCE(1);
1247 return false;
1248 }
1249 }
1250
1251 static
1252 bool match_event_session_token(struct lttng_kernel_event_session_common_private *event_session_priv,
1253 uint64_t token)
1254 {
1255 if (event_session_priv->chan->priv->coalesce_hits)
1256 return true;
1257 if (event_session_priv->parent.user_token == token)
1258 return true;
1259 return false;
1260 }
1261
1262 bool lttng_event_enabler_event_name_key_match_event(struct lttng_event_enabler_common *event_enabler,
1263 const char *event_name, const char *key_string, struct lttng_kernel_event_common *event)
1264 {
1265 switch (event_enabler->enabler_type) {
1266 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
1267 lttng_fallthrough;
1268 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
1269 {
1270 struct lttng_event_enabler_session_common *event_session_enabler =
1271 container_of(event_enabler, struct lttng_event_enabler_session_common, parent);
1272 struct lttng_kernel_event_session_common_private *event_session_priv =
1273 container_of(event->priv, struct lttng_kernel_event_session_common_private, parent);
1274 bool same_event = false, same_channel = false, same_key = false,
1275 same_token = false;
1276
1277 WARN_ON_ONCE(!event->priv->desc);
1278 if (!strncmp(event->priv->desc->event_name, event_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1))
1279 same_event = true;
1280 if (event_session_enabler->chan == event_session_priv->chan) {
1281 same_channel = true;
1282 if (match_event_session_token(event_session_priv, event_enabler->user_token))
1283 same_token = true;
1284 }
1285 if (match_event_key(event, key_string))
1286 same_key = true;
1287 return same_event && same_channel && same_key && same_token;
1288 }
1289
1290 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
1291 {
1292 /*
1293 * Check if event_notifier already exists by checking
1294 * if the event_notifier and enabler share the same
1295 * description and id.
1296 */
1297 if (!strncmp(event->priv->desc->event_name, event_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1)
1298 && event->priv->user_token == event_enabler->user_token)
1299 return true;
1300 else
1301 return false;
1302 }
1303 default:
1304 WARN_ON_ONCE(1);
1305 return false;
1306 }
1307 }
1308
1309 static
1310 int lttng_counter_append_descriptor(struct lttng_kernel_channel_counter *counter,
1311 uint64_t user_token,
1312 size_t index,
1313 const char *key)
1314 {
1315 struct lttng_counter_map *map = &counter->priv->map;
1316 struct lttng_counter_map_descriptor *last;
1317 int ret = 0;
1318
1319 if (strlen(key) >= LTTNG_KERNEL_COUNTER_KEY_LEN) {
1320 WARN_ON_ONCE(1);
1321 return -EOVERFLOW;
1322 }
1323 mutex_lock(&map->lock);
1324 if (map->nr_descriptors == map->alloc_len) {
1325 struct lttng_counter_map_descriptor *new_table, *old_table;
1326 size_t old_len = map->nr_descriptors;
1327 size_t new_len = max_t(size_t, old_len + 1, map->alloc_len * 2);
1328
1329 old_table = map->descriptors;
1330 new_table = lttng_kvzalloc(sizeof(struct lttng_counter_map_descriptor) * new_len,
1331 GFP_KERNEL);
1332 if (!new_table) {
1333 ret = -ENOMEM;
1334 goto unlock;
1335 }
1336
1337 if (old_table)
1338 memcpy(new_table, old_table, old_len * sizeof(struct lttng_counter_map_descriptor));
1339
1340 map->descriptors = new_table;
1341 map->alloc_len = new_len;
1342 lttng_kvfree(old_table);
1343 }
1344 last = &map->descriptors[map->nr_descriptors++];
1345 last->user_token = user_token;
1346 last->array_index = index;
1347 strcpy(last->key, key);
1348 unlock:
1349 mutex_unlock(&map->lock);
1350 return ret;
1351 }
1352
1353 static
1354 int lttng_append_event_to_channel_map(struct lttng_event_enabler_common *event_enabler,
1355 struct lttng_kernel_event_common *event,
1356 const char *event_name)
1357 {
1358 struct lttng_event_counter_enabler *event_counter_enabler;
1359 struct lttng_kernel_channel_counter *chan_counter;
1360 struct lttng_kernel_event_counter *event_counter;
1361 const char *name = "<UNKNOWN>";
1362
1363 if (event_enabler->enabler_type != LTTNG_EVENT_ENABLER_TYPE_COUNTER)
1364 return 0;
1365 event_counter_enabler = container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
1366 event_counter = container_of(event, struct lttng_kernel_event_counter, parent);
1367 chan_counter = event_counter_enabler->chan;
1368 if (event_counter->priv->key[0])
1369 name = event_counter->priv->key;
1370 else
1371 name = event_name;
1372 return lttng_counter_append_descriptor(chan_counter, event_enabler->user_token,
1373 event_counter->priv->parent.id, name);
1374 }
1375
1376 /*
1377 * Supports event creation while tracing session is active.
1378 * Needs to be called with sessions mutex held.
1379 */
1380 struct lttng_kernel_event_common *_lttng_kernel_event_create(struct lttng_event_enabler_common *event_enabler,
1381 const struct lttng_kernel_event_desc *event_desc,
1382 struct lttng_kernel_event_pair *event_pair)
1383 {
1384 char key_string[LTTNG_KERNEL_COUNTER_KEY_LEN] = { 0 };
1385 struct lttng_event_ht *events_name_ht = lttng_get_events_name_ht_from_enabler(event_enabler);
1386 struct lttng_event_ht *events_key_ht = lttng_get_events_key_ht_from_enabler(event_enabler);
1387 struct list_head *event_list_head = lttng_get_event_list_head_from_enabler(event_enabler);
1388 struct lttng_kernel_abi_event *event_param = &event_enabler->event_param;
1389 enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
1390 struct lttng_kernel_event_common_private *event_priv_iter;
1391 struct lttng_kernel_event_common *event;
1392 struct hlist_head *name_head, *key_head = NULL;
1393 const char *event_name;
1394 int ret;
1395
1396 if (event_pair == NULL || event_pair->check_ids) {
1397 if (!lttng_kernel_event_id_available(event_enabler)) {
1398 ret = -EMFILE;
1399 goto full;
1400 }
1401 }
1402
1403 switch (itype) {
1404 case LTTNG_KERNEL_ABI_TRACEPOINT:
1405 event_name = event_desc->event_name;
1406 break;
1407
1408 case LTTNG_KERNEL_ABI_KPROBE:
1409 lttng_fallthrough;
1410 case LTTNG_KERNEL_ABI_UPROBE:
1411 lttng_fallthrough;
1412 case LTTNG_KERNEL_ABI_SYSCALL:
1413 event_name = event_param->name;
1414 break;
1415
1416 case LTTNG_KERNEL_ABI_KRETPROBE:
1417 event_name = event_pair->name;
1418 break;
1419
1420 case LTTNG_KERNEL_ABI_FUNCTION:
1421 lttng_fallthrough;
1422 case LTTNG_KERNEL_ABI_NOOP:
1423 lttng_fallthrough;
1424 default:
1425 WARN_ON_ONCE(1);
1426 ret = -EINVAL;
1427 goto type_error;
1428 }
1429
1430 if (format_event_key(event_enabler, key_string, event_name)) {
1431 ret = -EINVAL;
1432 goto type_error;
1433 }
1434
1435 name_head = utils_borrow_hash_table_bucket(events_name_ht->table, LTTNG_EVENT_HT_SIZE, event_name);
1436 lttng_hlist_for_each_entry(event_priv_iter, name_head, hlist_name_node) {
1437 if (lttng_event_enabler_event_name_key_match_event(event_enabler,
1438 event_name, key_string, event_priv_iter->pub)) {
1439 ret = -EEXIST;
1440 goto exist;
1441 }
1442 }
1443
1444 if (key_string[0] != '\0')
1445 key_head = utils_borrow_hash_table_bucket(events_key_ht->table, LTTNG_EVENT_HT_SIZE, key_string);
1446
1447 event = lttng_kernel_event_alloc(event_enabler, key_head, key_string);
1448 if (!event) {
1449 ret = -ENOMEM;
1450 goto alloc_error;
1451 }
1452
1453 switch (itype) {
1454 case LTTNG_KERNEL_ABI_TRACEPOINT:
1455 /* Event will be enabled by enabler sync. */
1456 event->enabled = 0;
1457 event->priv->registered = 0;
1458 event->priv->desc = lttng_event_desc_get(event_name);
1459 if (!event->priv->desc) {
1460 ret = -ENOENT;
1461 goto register_error;
1462 }
1463 /* Populate lttng_event structure before event registration. */
1464 smp_wmb();
1465 break;
1466
1467 case LTTNG_KERNEL_ABI_KPROBE:
1468 /* Event will be enabled by enabler sync. */
1469 event->enabled = 0;
1470 event->priv->registered = 0;
1471 ret = lttng_kprobes_init_event(event_name,
1472 event_param->u.kprobe.symbol_name,
1473 event_param->u.kprobe.offset,
1474 event_param->u.kprobe.addr,
1475 event);
1476 if (ret) {
1477 ret = -EINVAL;
1478 goto register_error;
1479 }
1480 /*
1481 * Populate lttng_event structure before event
1482 * registration.
1483 */
1484 smp_wmb();
1485 ret = try_module_get(event->priv->desc->owner);
1486 WARN_ON_ONCE(!ret);
1487 break;
1488
1489 case LTTNG_KERNEL_ABI_KRETPROBE:
1490 {
1491 /* Event will be enabled by enabler sync. */
1492 event->enabled = 0;
1493 event->priv->registered = 0;
1494 ret = lttng_kretprobes_init_event(event_name,
1495 event_pair->entryexit,
1496 event, event_pair->krp);
1497 if (ret) {
1498 ret = -EINVAL;
1499 goto register_error;
1500 }
1501 ret = try_module_get(event->priv->desc->owner);
1502 WARN_ON_ONCE(!ret);
1503 break;
1504 }
1505
1506 case LTTNG_KERNEL_ABI_SYSCALL:
1507 /* Event will be enabled by enabler sync. */
1508 event->enabled = 0;
1509 event->priv->registered = 0;
1510 event->priv->desc = event_desc;
1511 switch (event_param->u.syscall.entryexit) {
1512 case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT:
1513 ret = -EINVAL;
1514 goto register_error;
1515 case LTTNG_KERNEL_ABI_SYSCALL_ENTRY:
1516 event->priv->u.syscall.entryexit = LTTNG_SYSCALL_ENTRY;
1517 break;
1518 case LTTNG_KERNEL_ABI_SYSCALL_EXIT:
1519 event->priv->u.syscall.entryexit = LTTNG_SYSCALL_EXIT;
1520 break;
1521 }
1522 switch (event_param->u.syscall.abi) {
1523 case LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL:
1524 ret = -EINVAL;
1525 goto register_error;
1526 case LTTNG_KERNEL_ABI_SYSCALL_ABI_NATIVE:
1527 event->priv->u.syscall.abi = LTTNG_SYSCALL_ABI_NATIVE;
1528 break;
1529 case LTTNG_KERNEL_ABI_SYSCALL_ABI_COMPAT:
1530 event->priv->u.syscall.abi = LTTNG_SYSCALL_ABI_COMPAT;
1531 break;
1532 }
1533 if (!event->priv->desc) {
1534 ret = -EINVAL;
1535 goto register_error;
1536 }
1537 break;
1538
1539 case LTTNG_KERNEL_ABI_UPROBE:
1540 /*
1541 * Needs to be explicitly enabled after creation, since
1542 * we may want to apply filters.
1543 */
1544 event->enabled = 0;
1545 event->priv->registered = 1;
1546
1547 /*
1548 * Populate lttng_event structure before event
1549 * registration.
1550 */
1551 smp_wmb();
1552
1553 ret = lttng_uprobes_register_event(event_param->name,
1554 event_param->u.uprobe.fd,
1555 event);
1556 if (ret)
1557 goto register_error;
1558 ret = try_module_get(event->priv->desc->owner);
1559 WARN_ON_ONCE(!ret);
1560 ret = lttng_append_event_to_channel_map(event_enabler, event, event_name);
1561 WARN_ON_ONCE(ret);
1562 break;
1563
1564 default:
1565 WARN_ON_ONCE(1);
1566 ret = -EINVAL;
1567 goto register_error;
1568 }
1569
1570 ret = _lttng_event_recorder_metadata_statedump(event);
1571 WARN_ON_ONCE(ret > 0);
1572 if (ret) {
1573 goto statedump_error;
1574 }
1575
1576 ret = lttng_kernel_event_notifier_clear_error_counter(event);
1577 if (ret) {
1578 goto register_error;
1579 }
1580
1581 hlist_add_head(&event->priv->hlist_name_node, name_head);
1582 if (key_head) {
1583 struct lttng_kernel_event_counter_private *event_counter_priv =
1584 container_of(event->priv, struct lttng_kernel_event_counter_private, parent.parent);
1585 hlist_add_head(&event_counter_priv->hlist_key_node, key_head);
1586 }
1587 list_add(&event->priv->node, event_list_head);
1588
1589 return event;
1590
1591 statedump_error:
1592 /* If a statedump error occurs, events will not be readable. */
1593 register_error:
1594 lttng_kernel_event_free(event);
1595 alloc_error:
1596 exist:
1597 type_error:
1598 full:
1599 return ERR_PTR(ret);
1600 }
1601
1602 struct lttng_kernel_event_common *lttng_kernel_event_create(struct lttng_event_enabler_common *event_enabler,
1603 const struct lttng_kernel_event_desc *event_desc,
1604 struct lttng_kernel_event_pair *event_pair)
1605 {
1606 struct lttng_kernel_event_common *event;
1607
1608 mutex_lock(&sessions_mutex);
1609 event = _lttng_kernel_event_create(event_enabler, event_desc, event_pair);
1610 mutex_unlock(&sessions_mutex);
1611 return event;
1612 }
1613
1614 int lttng_kernel_counter_read(struct lttng_kernel_channel_counter *counter,
1615 const size_t *dim_indexes, int32_t cpu,
1616 int64_t *val, bool *overflow, bool *underflow)
1617 {
1618 return counter->ops->priv->counter_read(counter, dim_indexes,
1619 cpu, val, overflow, underflow);
1620 }
1621
1622 int lttng_kernel_counter_aggregate(struct lttng_kernel_channel_counter *counter,
1623 const size_t *dim_indexes, int64_t *val,
1624 bool *overflow, bool *underflow)
1625 {
1626 return counter->ops->priv->counter_aggregate(counter, dim_indexes,
1627 val, overflow, underflow);
1628 }
1629
1630 int lttng_kernel_counter_clear(struct lttng_kernel_channel_counter *counter,
1631 const size_t *dim_indexes)
1632 {
1633 return counter->ops->priv->counter_clear(counter, dim_indexes);
1634 }
1635
1636 int lttng_kernel_counter_get_nr_dimensions(struct lttng_kernel_channel_counter *counter,
1637 size_t *nr_dimensions)
1638 {
1639 return counter->ops->priv->counter_get_nr_dimensions(counter, nr_dimensions);
1640 }
1641
1642 int lttng_kernel_counter_get_max_nr_elem(struct lttng_kernel_channel_counter *counter,
1643 size_t *max_nr_elem)
1644 {
1645 return counter->ops->priv->counter_get_max_nr_elem(counter, max_nr_elem);
1646 }
1647
1648 /* Used for tracepoints, system calls, and kprobe. */
1649 static
1650 void register_event(struct lttng_kernel_event_common *event)
1651 {
1652 const struct lttng_kernel_event_desc *desc;
1653 int ret = -EINVAL;
1654
1655 WARN_ON_ONCE(event->priv->registered);
1656
1657 desc = event->priv->desc;
1658 switch (event->priv->instrumentation) {
1659 case LTTNG_KERNEL_ABI_TRACEPOINT:
1660 ret = lttng_tracepoint_probe_register(desc->event_kname,
1661 desc->tp_class->probe_callback,
1662 event);
1663 break;
1664
1665 case LTTNG_KERNEL_ABI_SYSCALL:
1666 ret = lttng_syscall_filter_enable_event(event);
1667 break;
1668
1669 case LTTNG_KERNEL_ABI_KPROBE:
1670 ret = lttng_kprobes_register_event(event);
1671 break;
1672
1673 case LTTNG_KERNEL_ABI_UPROBE:
1674 ret = 0;
1675 break;
1676
1677 case LTTNG_KERNEL_ABI_KRETPROBE:
1678 ret = lttng_kretprobes_register_event(event);
1679 break;
1680
1681 case LTTNG_KERNEL_ABI_FUNCTION:
1682 lttng_fallthrough;
1683 case LTTNG_KERNEL_ABI_NOOP:
1684 lttng_fallthrough;
1685 default:
1686 WARN_ON_ONCE(1);
1687 }
1688 WARN_ON_ONCE(ret);
1689 if (!ret)
1690 event->priv->registered = 1;
1691 }
1692
1693 static
1694 void unregister_event(struct lttng_kernel_event_common *event)
1695 {
1696 struct lttng_kernel_event_common_private *event_priv = event->priv;
1697 const struct lttng_kernel_event_desc *desc;
1698 int ret = -EINVAL;
1699
1700 WARN_ON_ONCE(!event->priv->registered);
1701
1702 desc = event_priv->desc;
1703 switch (event_priv->instrumentation) {
1704 case LTTNG_KERNEL_ABI_TRACEPOINT:
1705 ret = lttng_tracepoint_probe_unregister(event_priv->desc->event_kname,
1706 event_priv->desc->tp_class->probe_callback,
1707 event);
1708 break;
1709
1710 case LTTNG_KERNEL_ABI_KPROBE:
1711 lttng_kprobes_unregister_event(event);
1712 ret = 0;
1713 break;
1714
1715 case LTTNG_KERNEL_ABI_KRETPROBE:
1716 lttng_kretprobes_unregister_event(event);
1717 ret = 0;
1718 break;
1719
1720 case LTTNG_KERNEL_ABI_SYSCALL:
1721 ret = lttng_syscall_filter_disable_event(event);
1722 break;
1723
1724 case LTTNG_KERNEL_ABI_NOOP:
1725 switch (event->type) {
1726 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1727 lttng_fallthrough;
1728 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
1729 ret = 0;
1730 break;
1731 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1732 WARN_ON_ONCE(1);
1733 break;
1734 }
1735 break;
1736
1737 case LTTNG_KERNEL_ABI_UPROBE:
1738 lttng_uprobes_unregister_event(event);
1739 ret = 0;
1740 break;
1741
1742 case LTTNG_KERNEL_ABI_FUNCTION:
1743 lttng_fallthrough;
1744 default:
1745 WARN_ON_ONCE(1);
1746 }
1747 WARN_ON_ONCE(ret);
1748 if (!ret)
1749 event_priv->registered = 0;
1750 }
1751
1752 static
1753 void _lttng_event_unregister(struct lttng_kernel_event_common *event)
1754 {
1755 if (event->priv->registered)
1756 unregister_event(event);
1757 }
1758
1759 /*
1760 * Only used internally at session destruction.
1761 */
1762 static
1763 void _lttng_event_destroy(struct lttng_kernel_event_common *event)
1764 {
1765 struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref;
1766
1767 lttng_free_event_filter_runtime(event);
1768 /* Free event enabler refs */
1769 list_for_each_entry_safe(enabler_ref, tmp_enabler_ref,
1770 &event->priv->enablers_ref_head, node)
1771 kfree(enabler_ref);
1772
1773 /* Remove from event list. */
1774 list_del(&event->priv->node);
1775 /* Remove from event hash table. */
1776 hlist_del(&event->priv->hlist_name_node);
1777
1778 switch (event->type) {
1779 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
1780 {
1781 struct lttng_kernel_event_counter_private *event_counter_priv =
1782 container_of(event->priv, struct lttng_kernel_event_counter_private, parent.parent);
1783 if (event_counter_priv->key[0] != '\0')
1784 hlist_del(&event_counter_priv->hlist_key_node);
1785 break;
1786 }
1787 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1788 lttng_fallthrough;
1789 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1790 break;
1791 default:
1792 WARN_ON_ONCE(1);
1793 }
1794
1795 switch (event->priv->instrumentation) {
1796 case LTTNG_KERNEL_ABI_TRACEPOINT:
1797 lttng_event_desc_put(event->priv->desc);
1798 break;
1799
1800 case LTTNG_KERNEL_ABI_KPROBE:
1801 module_put(event->priv->desc->owner);
1802 lttng_kprobes_destroy_event_private(event);
1803 break;
1804
1805 case LTTNG_KERNEL_ABI_KRETPROBE:
1806 module_put(event->priv->desc->owner);
1807 lttng_kretprobes_destroy_event_private(event);
1808 break;
1809
1810 case LTTNG_KERNEL_ABI_SYSCALL:
1811 break;
1812
1813 case LTTNG_KERNEL_ABI_UPROBE:
1814 module_put(event->priv->desc->owner);
1815 lttng_uprobes_destroy_event_private(event);
1816 break;
1817
1818 case LTTNG_KERNEL_ABI_FUNCTION:
1819 lttng_fallthrough;
1820 case LTTNG_KERNEL_ABI_NOOP:
1821 lttng_fallthrough;
1822 default:
1823 WARN_ON_ONCE(1);
1824 }
1825
1826 lttng_kernel_event_free(event);
1827 }
1828
1829 static
1830 struct lttng_kernel_id_tracker *get_tracker(struct lttng_kernel_session *session,
1831 enum tracker_type tracker_type)
1832 {
1833 switch (tracker_type) {
1834 case TRACKER_PID:
1835 return &session->pid_tracker;
1836 case TRACKER_VPID:
1837 return &session->vpid_tracker;
1838 case TRACKER_UID:
1839 return &session->uid_tracker;
1840 case TRACKER_VUID:
1841 return &session->vuid_tracker;
1842 case TRACKER_GID:
1843 return &session->gid_tracker;
1844 case TRACKER_VGID:
1845 return &session->vgid_tracker;
1846 default:
1847 WARN_ON_ONCE(1);
1848 return NULL;
1849 }
1850 }
1851
1852 int lttng_session_track_id(struct lttng_kernel_session *session,
1853 enum tracker_type tracker_type, int id)
1854 {
1855 struct lttng_kernel_id_tracker *tracker;
1856 int ret;
1857
1858 tracker = get_tracker(session, tracker_type);
1859 if (!tracker)
1860 return -EINVAL;
1861 if (id < -1)
1862 return -EINVAL;
1863 mutex_lock(&sessions_mutex);
1864 if (id == -1) {
1865 /* track all ids: destroy tracker. */
1866 lttng_id_tracker_destroy(tracker, true);
1867 ret = 0;
1868 } else {
1869 ret = lttng_id_tracker_add(tracker, id);
1870 }
1871 mutex_unlock(&sessions_mutex);
1872 return ret;
1873 }
1874
1875 int lttng_session_untrack_id(struct lttng_kernel_session *session,
1876 enum tracker_type tracker_type, int id)
1877 {
1878 struct lttng_kernel_id_tracker *tracker;
1879 int ret;
1880
1881 tracker = get_tracker(session, tracker_type);
1882 if (!tracker)
1883 return -EINVAL;
1884 if (id < -1)
1885 return -EINVAL;
1886 mutex_lock(&sessions_mutex);
1887 if (id == -1) {
1888 /* untrack all ids: replace by empty tracker. */
1889 ret = lttng_id_tracker_empty_set(tracker);
1890 } else {
1891 ret = lttng_id_tracker_del(tracker, id);
1892 }
1893 mutex_unlock(&sessions_mutex);
1894 return ret;
1895 }
1896
1897 static
1898 void *id_list_start(struct seq_file *m, loff_t *pos)
1899 {
1900 struct lttng_kernel_id_tracker *id_tracker = m->private;
1901 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
1902 struct lttng_id_hash_node *e;
1903 int iter = 0, i;
1904
1905 mutex_lock(&sessions_mutex);
1906 if (id_tracker_p) {
1907 for (i = 0; i < LTTNG_ID_TABLE_SIZE; i++) {
1908 struct hlist_head *head = &id_tracker_p->id_hash[i];
1909
1910 lttng_hlist_for_each_entry(e, head, hlist) {
1911 if (iter++ >= *pos)
1912 return e;
1913 }
1914 }
1915 } else {
1916 /* ID tracker disabled. */
1917 if (iter >= *pos && iter == 0) {
1918 return id_tracker_p; /* empty tracker */
1919 }
1920 iter++;
1921 }
1922 /* End of list */
1923 return NULL;
1924 }
1925
1926 /* Called with sessions_mutex held. */
1927 static
1928 void *id_list_next(struct seq_file *m, void *p, loff_t *ppos)
1929 {
1930 struct lttng_kernel_id_tracker *id_tracker = m->private;
1931 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
1932 struct lttng_id_hash_node *e;
1933 int iter = 0, i;
1934
1935 (*ppos)++;
1936 if (id_tracker_p) {
1937 for (i = 0; i < LTTNG_ID_TABLE_SIZE; i++) {
1938 struct hlist_head *head = &id_tracker_p->id_hash[i];
1939
1940 lttng_hlist_for_each_entry(e, head, hlist) {
1941 if (iter++ >= *ppos)
1942 return e;
1943 }
1944 }
1945 } else {
1946 /* ID tracker disabled. */
1947 if (iter >= *ppos && iter == 0)
1948 return p; /* empty tracker */
1949 iter++;
1950 }
1951
1952 /* End of list */
1953 return NULL;
1954 }
1955
1956 static
1957 void id_list_stop(struct seq_file *m, void *p)
1958 {
1959 mutex_unlock(&sessions_mutex);
1960 }
1961
1962 static
1963 int id_list_show(struct seq_file *m, void *p)
1964 {
1965 struct lttng_kernel_id_tracker *id_tracker = m->private;
1966 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
1967 int id;
1968
1969 if (p == id_tracker_p) {
1970 /* Tracker disabled. */
1971 id = -1;
1972 } else {
1973 const struct lttng_id_hash_node *e = p;
1974
1975 id = lttng_id_tracker_get_node_id(e);
1976 }
1977 switch (id_tracker->priv->tracker_type) {
1978 case TRACKER_PID:
1979 seq_printf(m, "process { pid = %d; };\n", id);
1980 break;
1981 case TRACKER_VPID:
1982 seq_printf(m, "process { vpid = %d; };\n", id);
1983 break;
1984 case TRACKER_UID:
1985 seq_printf(m, "user { uid = %d; };\n", id);
1986 break;
1987 case TRACKER_VUID:
1988 seq_printf(m, "user { vuid = %d; };\n", id);
1989 break;
1990 case TRACKER_GID:
1991 seq_printf(m, "group { gid = %d; };\n", id);
1992 break;
1993 case TRACKER_VGID:
1994 seq_printf(m, "group { vgid = %d; };\n", id);
1995 break;
1996 default:
1997 seq_printf(m, "UNKNOWN { field = %d };\n", id);
1998 }
1999 return 0;
2000 }
2001
2002 static
2003 const struct seq_operations lttng_tracker_ids_list_seq_ops = {
2004 .start = id_list_start,
2005 .next = id_list_next,
2006 .stop = id_list_stop,
2007 .show = id_list_show,
2008 };
2009
2010 static
2011 int lttng_tracker_ids_list_open(struct inode *inode, struct file *file)
2012 {
2013 return seq_open(file, &lttng_tracker_ids_list_seq_ops);
2014 }
2015
2016 static
2017 int lttng_tracker_ids_list_release(struct inode *inode, struct file *file)
2018 {
2019 struct seq_file *m = file->private_data;
2020 struct lttng_kernel_id_tracker *id_tracker = m->private;
2021 int ret;
2022
2023 WARN_ON_ONCE(!id_tracker);
2024 ret = seq_release(inode, file);
2025 if (!ret)
2026 fput(id_tracker->priv->session->priv->file);
2027 return ret;
2028 }
2029
2030 const struct file_operations lttng_tracker_ids_list_fops = {
2031 .owner = THIS_MODULE,
2032 .open = lttng_tracker_ids_list_open,
2033 .read = seq_read,
2034 .llseek = seq_lseek,
2035 .release = lttng_tracker_ids_list_release,
2036 };
2037
2038 int lttng_session_list_tracker_ids(struct lttng_kernel_session *session,
2039 enum tracker_type tracker_type)
2040 {
2041 struct file *tracker_ids_list_file;
2042 struct seq_file *m;
2043 int file_fd, ret;
2044
2045 file_fd = get_unused_fd_flags(0);
2046 if (file_fd < 0) {
2047 ret = file_fd;
2048 goto fd_error;
2049 }
2050
2051 tracker_ids_list_file = anon_inode_getfile("[lttng_tracker_ids_list]",
2052 &lttng_tracker_ids_list_fops,
2053 NULL, O_RDWR);
2054 if (IS_ERR(tracker_ids_list_file)) {
2055 ret = PTR_ERR(tracker_ids_list_file);
2056 goto file_error;
2057 }
2058 if (!atomic_long_add_unless(&session->priv->file->f_count, 1, LONG_MAX)) {
2059 ret = -EOVERFLOW;
2060 goto refcount_error;
2061 }
2062 ret = lttng_tracker_ids_list_fops.open(NULL, tracker_ids_list_file);
2063 if (ret < 0)
2064 goto open_error;
2065 m = tracker_ids_list_file->private_data;
2066
2067 m->private = get_tracker(session, tracker_type);
2068 BUG_ON(!m->private);
2069 fd_install(file_fd, tracker_ids_list_file);
2070
2071 return file_fd;
2072
2073 open_error:
2074 atomic_long_dec(&session->priv->file->f_count);
2075 refcount_error:
2076 fput(tracker_ids_list_file);
2077 file_error:
2078 put_unused_fd(file_fd);
2079 fd_error:
2080 return ret;
2081 }
2082
2083 /*
2084 * Enabler management.
2085 */
2086 static
2087 int lttng_match_enabler_star_glob(const char *desc_name,
2088 const char *pattern)
2089 {
2090 if (!strutils_star_glob_match(pattern, LTTNG_SIZE_MAX,
2091 desc_name, LTTNG_SIZE_MAX))
2092 return 0;
2093 return 1;
2094 }
2095
2096 static
2097 int lttng_match_enabler_name(const char *desc_name,
2098 const char *name)
2099 {
2100 if (strcmp(desc_name, name))
2101 return 0;
2102 return 1;
2103 }
2104
2105 static
2106 int lttng_desc_match_enabler_check(const struct lttng_kernel_event_desc *desc,
2107 struct lttng_event_enabler_common *enabler)
2108 {
2109 const char *desc_name, *enabler_name;
2110 bool compat = false, entry = false;
2111
2112 enabler_name = enabler->event_param.name;
2113 switch (enabler->event_param.instrumentation) {
2114 case LTTNG_KERNEL_ABI_TRACEPOINT:
2115 desc_name = desc->event_name;
2116 switch (enabler->format_type) {
2117 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
2118 return lttng_match_enabler_star_glob(desc_name, enabler_name);
2119 case LTTNG_ENABLER_FORMAT_NAME:
2120 return lttng_match_enabler_name(desc_name, enabler_name);
2121 default:
2122 return -EINVAL;
2123 }
2124 break;
2125
2126 case LTTNG_KERNEL_ABI_SYSCALL:
2127 desc_name = desc->event_name;
2128 if (!strncmp(desc_name, "compat_", strlen("compat_"))) {
2129 desc_name += strlen("compat_");
2130 compat = true;
2131 }
2132 if (!strncmp(desc_name, "syscall_exit_",
2133 strlen("syscall_exit_"))) {
2134 desc_name += strlen("syscall_exit_");
2135 } else if (!strncmp(desc_name, "syscall_entry_",
2136 strlen("syscall_entry_"))) {
2137 desc_name += strlen("syscall_entry_");
2138 entry = true;
2139 } else {
2140 WARN_ON_ONCE(1);
2141 return -EINVAL;
2142 }
2143 switch (enabler->event_param.u.syscall.entryexit) {
2144 case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT:
2145 break;
2146 case LTTNG_KERNEL_ABI_SYSCALL_ENTRY:
2147 if (!entry)
2148 return 0;
2149 break;
2150 case LTTNG_KERNEL_ABI_SYSCALL_EXIT:
2151 if (entry)
2152 return 0;
2153 break;
2154 default:
2155 return -EINVAL;
2156 }
2157 switch (enabler->event_param.u.syscall.abi) {
2158 case LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL:
2159 break;
2160 case LTTNG_KERNEL_ABI_SYSCALL_ABI_NATIVE:
2161 if (compat)
2162 return 0;
2163 break;
2164 case LTTNG_KERNEL_ABI_SYSCALL_ABI_COMPAT:
2165 if (!compat)
2166 return 0;
2167 break;
2168 default:
2169 return -EINVAL;
2170 }
2171 switch (enabler->event_param.u.syscall.match) {
2172 case LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME:
2173 switch (enabler->format_type) {
2174 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
2175 return lttng_match_enabler_star_glob(desc_name, enabler_name);
2176 case LTTNG_ENABLER_FORMAT_NAME:
2177 return lttng_match_enabler_name(desc_name, enabler_name);
2178 default:
2179 return -EINVAL;
2180 }
2181 break;
2182 case LTTNG_KERNEL_ABI_SYSCALL_MATCH_NR:
2183 return -EINVAL; /* Not implemented. */
2184 default:
2185 return -EINVAL;
2186 }
2187 break;
2188
2189 case LTTNG_KERNEL_ABI_KPROBE:
2190 desc_name = desc->event_name;
2191 switch (enabler->format_type) {
2192 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
2193 return -EINVAL;
2194 case LTTNG_ENABLER_FORMAT_NAME:
2195 return lttng_match_enabler_name(desc_name, enabler_name);
2196 default:
2197 return -EINVAL;
2198 }
2199 break;
2200
2201 case LTTNG_KERNEL_ABI_KRETPROBE:
2202 {
2203 char base_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN];
2204 size_t base_name_len; /* includes \0 */
2205 char *last_separator, *entryexit;
2206
2207 desc_name = desc->event_name;
2208 last_separator = strrchr(desc_name, '_');
2209 base_name_len = last_separator - desc_name + 1;
2210 memcpy(base_name, desc_name, base_name_len);
2211 base_name[base_name_len - 1] = '\0'; /* Replace '_' by '\0' */
2212 entryexit = last_separator + 1;
2213
2214 if (!strcmp(entryexit, "entry")) {
2215 entry = true;
2216 } else if (!strcmp(entryexit, "exit")) {
2217 /* Nothing to do. */
2218 } else {
2219 WARN_ON_ONCE(1);
2220 return -EINVAL;
2221 }
2222
2223 switch (enabler->event_param.u.kretprobe.entryexit) {
2224 case LTTNG_KERNEL_ABI_KRETPROBE_ENTRYEXIT:
2225 break;
2226 case LTTNG_KERNEL_ABI_KRETPROBE_ENTRY:
2227 if (!entry)
2228 return 0;
2229 break;
2230 case LTTNG_KERNEL_ABI_KRETPROBE_EXIT:
2231 if (entry)
2232 return 0;
2233 break;
2234 default:
2235 return -EINVAL;
2236 }
2237
2238 switch (enabler->format_type) {
2239 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
2240 return -EINVAL;
2241 case LTTNG_ENABLER_FORMAT_NAME:
2242 return lttng_match_enabler_name(base_name, enabler_name);
2243 default:
2244 return -EINVAL;
2245 }
2246 break;
2247 }
2248
2249 default:
2250 WARN_ON_ONCE(1);
2251 return -EINVAL;
2252 }
2253 }
2254
2255 bool lttng_desc_match_enabler(const struct lttng_kernel_event_desc *desc,
2256 struct lttng_event_enabler_common *enabler)
2257 {
2258 int ret;
2259
2260 ret = lttng_desc_match_enabler_check(desc, enabler);
2261 if (ret < 0) {
2262 WARN_ON_ONCE(1);
2263 return false;
2264 }
2265 return ret;
2266 }
2267
2268 static
2269 bool lttng_event_session_enabler_match_event_session(struct lttng_event_enabler_session_common *event_enabler_session,
2270 struct lttng_kernel_event_session_common_private *event_session_priv)
2271 {
2272 if (lttng_desc_match_enabler(event_session_priv->parent.desc, &event_enabler_session->parent)
2273 && event_session_priv->chan == event_enabler_session->chan
2274 && match_event_session_token(event_session_priv, event_enabler_session->parent.user_token))
2275 return true;
2276 else
2277 return false;
2278 }
2279
2280 static
2281 int lttng_event_notifier_enabler_match_event_notifier(
2282 struct lttng_event_notifier_enabler *event_notifier_enabler,
2283 struct lttng_kernel_event_notifier_private *event_notifier_priv)
2284 {
2285 int desc_matches = lttng_desc_match_enabler(event_notifier_priv->parent.desc,
2286 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
2287
2288 if (desc_matches && event_notifier_priv->group == event_notifier_enabler->group &&
2289 event_notifier_priv->parent.user_token == event_notifier_enabler->parent.user_token)
2290 return 1;
2291 else
2292 return 0;
2293 }
2294
2295 bool lttng_event_enabler_match_event(struct lttng_event_enabler_common *event_enabler,
2296 struct lttng_kernel_event_common *event)
2297 {
2298 if (event_enabler->event_param.instrumentation != event->priv->instrumentation)
2299 return false;
2300
2301 switch (event_enabler->enabler_type) {
2302 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
2303 lttng_fallthrough;
2304 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
2305 {
2306 struct lttng_event_enabler_session_common *event_enabler_session =
2307 container_of(event_enabler, struct lttng_event_enabler_session_common, parent);
2308 struct lttng_kernel_event_session_common_private *event_session_priv =
2309 container_of(event->priv, struct lttng_kernel_event_session_common_private, parent);
2310 return lttng_event_session_enabler_match_event_session(event_enabler_session, event_session_priv);
2311 }
2312 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
2313 {
2314 struct lttng_event_notifier_enabler *event_notifier_enabler =
2315 container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
2316 struct lttng_kernel_event_notifier_private *event_notifier_priv =
2317 container_of(event->priv, struct lttng_kernel_event_notifier_private, parent);
2318 return lttng_event_notifier_enabler_match_event_notifier(event_notifier_enabler, event_notifier_priv);
2319 }
2320 default:
2321 WARN_ON_ONCE(1);
2322 return false;
2323 }
2324 }
2325
2326 static
2327 struct lttng_enabler_ref *lttng_enabler_ref(
2328 struct list_head *enablers_ref_list,
2329 struct lttng_event_enabler_common *enabler)
2330 {
2331 struct lttng_enabler_ref *enabler_ref;
2332
2333 list_for_each_entry(enabler_ref, enablers_ref_list, node) {
2334 if (enabler_ref->ref == enabler)
2335 return enabler_ref;
2336 }
2337 return NULL;
2338 }
2339
2340 static
2341 void lttng_event_enabler_create_tracepoint_events_if_missing(struct lttng_event_enabler_common *event_enabler)
2342 {
2343 struct lttng_kernel_probe_desc *probe_desc;
2344 const struct lttng_kernel_event_desc *desc;
2345 struct list_head *probe_list;
2346 int i;
2347
2348 probe_list = lttng_get_probe_list_head();
2349 /*
2350 * For each probe event, if we find that a probe event matches
2351 * our enabler, create an associated lttng_event if not
2352 * already present.
2353 */
2354 list_for_each_entry(probe_desc, probe_list, head) {
2355 for (i = 0; i < probe_desc->nr_events; i++) {
2356 struct lttng_kernel_event_common *event;
2357
2358 desc = probe_desc->event_desc[i];
2359 if (!lttng_desc_match_enabler(desc, event_enabler))
2360 continue;
2361 /*
2362 * We need to create an event for this event probe.
2363 */
2364 event = _lttng_kernel_event_create(event_enabler, desc, NULL);
2365 if (IS_ERR(event)) {
2366 /* Skip if already found. */
2367 if (PTR_ERR(event) == -EEXIST)
2368 continue;
2369 printk(KERN_INFO "LTTng: Unable to create event %s\n",
2370 probe_desc->event_desc[i]->event_name);
2371 }
2372 }
2373 }
2374 }
2375
2376 /* Try to create the event associated with this kprobe enabler. */
2377 static
2378 void lttng_event_enabler_create_kprobe_event_if_missing(struct lttng_event_enabler_common *event_enabler)
2379 {
2380 struct lttng_kernel_event_common *event;
2381
2382 event = _lttng_kernel_event_create(event_enabler, NULL, NULL);
2383 if (IS_ERR(event)) {
2384 if (PTR_ERR(event) != -EEXIST) {
2385 printk(KERN_INFO "LTTng: Unable to create kprobe event %s\n",
2386 event_enabler->event_param.name);
2387 }
2388 }
2389 }
2390
2391 /* Try to create the event associated with this kretprobe enabler. */
2392 static
2393 void lttng_event_enabler_create_kretprobe_event_if_missing(struct lttng_event_enabler_common *event_enabler)
2394 {
2395 struct lttng_kernel_abi_event *event_param = &event_enabler->event_param;
2396 struct lttng_kernel_event_pair event_pair;
2397 struct lttng_kernel_event_common *event;
2398
2399 if (strlen(event_param->name) + strlen("_entry") >= LTTNG_KERNEL_ABI_SYM_NAME_LEN) {
2400 WARN_ON_ONCE(1);
2401 return;
2402 }
2403
2404 memset(&event_pair, 0, sizeof(event_pair));
2405 event_pair.krp = lttng_kretprobes_create_krp(event_param->u.kretprobe.symbol_name,
2406 event_param->u.kretprobe.offset, event_param->u.kretprobe.addr);
2407 if (!event_pair.krp) {
2408 WARN_ON_ONCE(1);
2409 return;
2410 }
2411 strcpy(event_pair.name, event_enabler->event_param.name);
2412 strcat(event_pair.name, "_entry");
2413 event_pair.check_ids = true;
2414 event_pair.entryexit = LTTNG_KRETPROBE_ENTRY;
2415 event = _lttng_kernel_event_create(event_enabler, NULL, &event_pair);
2416 if (IS_ERR(event)) {
2417 if (PTR_ERR(event) != -EEXIST) {
2418 printk(KERN_INFO "LTTng: Unable to create kretprobe event %s\n",
2419 event_enabler->event_param.name);
2420 }
2421 }
2422
2423 strcpy(event_pair.name, event_enabler->event_param.name);
2424 strcat(event_pair.name, "_exit");
2425 event_pair.check_ids = false;
2426 event_pair.entryexit = LTTNG_KRETPROBE_EXIT;
2427 event = _lttng_kernel_event_create(event_enabler, NULL, &event_pair);
2428 if (IS_ERR(event)) {
2429 if (PTR_ERR(event) != -EEXIST) {
2430 printk(KERN_INFO "LTTng: Unable to create kretprobe event %s\n",
2431 event_enabler->event_param.name);
2432 }
2433 }
2434
2435 lttng_kretprobes_put_krp(event_pair.krp);
2436 }
2437
2438 /*
2439 * Create event if it is missing and present in the list of tracepoint probes.
2440 * Should be called with sessions mutex held.
2441 */
2442 static
2443 void lttng_event_enabler_create_events_if_missing(struct lttng_event_enabler_common *event_enabler)
2444 {
2445 int ret;
2446
2447 switch (event_enabler->event_param.instrumentation) {
2448 case LTTNG_KERNEL_ABI_TRACEPOINT:
2449 lttng_event_enabler_create_tracepoint_events_if_missing(event_enabler);
2450 break;
2451
2452 case LTTNG_KERNEL_ABI_SYSCALL:
2453 ret = lttng_event_enabler_create_syscall_events_if_missing(event_enabler);
2454 WARN_ON_ONCE(ret);
2455 break;
2456
2457 case LTTNG_KERNEL_ABI_KPROBE:
2458 lttng_event_enabler_create_kprobe_event_if_missing(event_enabler);
2459 break;
2460
2461 case LTTNG_KERNEL_ABI_KRETPROBE:
2462 lttng_event_enabler_create_kretprobe_event_if_missing(event_enabler);
2463 break;
2464
2465 default:
2466 WARN_ON_ONCE(1);
2467 break;
2468 }
2469 }
2470
2471 static
2472 void lttng_event_enabler_init_event_filter(struct lttng_event_enabler_common *event_enabler,
2473 struct lttng_kernel_event_common *event)
2474 {
2475 /* Link filter bytecodes if not linked yet. */
2476 lttng_enabler_link_bytecode(event->priv->desc, lttng_static_ctx,
2477 &event->priv->filter_bytecode_runtime_head, &event_enabler->filter_bytecode_head);
2478 }
2479
2480 static
2481 void lttng_event_enabler_init_event_capture(struct lttng_event_enabler_common *event_enabler,
2482 struct lttng_kernel_event_common *event)
2483 {
2484 switch (event_enabler->enabler_type) {
2485 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
2486 lttng_fallthrough;
2487 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
2488 break;
2489 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
2490 {
2491 struct lttng_event_notifier_enabler *event_notifier_enabler =
2492 container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
2493 struct lttng_kernel_event_notifier *event_notifier =
2494 container_of(event, struct lttng_kernel_event_notifier, parent);
2495
2496 /* Link capture bytecodes if not linked yet. */
2497 lttng_enabler_link_bytecode(event->priv->desc,
2498 lttng_static_ctx, &event_notifier->priv->capture_bytecode_runtime_head,
2499 &event_notifier_enabler->capture_bytecode_head);
2500 event_notifier->priv->num_captures = event_notifier_enabler->num_captures;
2501 break;
2502 }
2503 default:
2504 WARN_ON_ONCE(1);
2505 }
2506 }
2507
2508 /*
2509 * Create events associated with an event_enabler (if not already present),
2510 * and add backward reference from the event to the enabler.
2511 * Should be called with sessions mutex held.
2512 */
2513 static
2514 int lttng_event_enabler_ref_events(struct lttng_event_enabler_common *event_enabler)
2515 {
2516 struct list_head *event_list_head = lttng_get_event_list_head_from_enabler(event_enabler);
2517 struct lttng_kernel_event_common_private *event_priv;
2518
2519 /*
2520 * Only try to create events for enablers that are enabled, the user
2521 * might still be attaching filter or exclusion to the event enabler.
2522 */
2523 if (!event_enabler->enabled)
2524 goto end;
2525
2526 lttng_syscall_table_set_wildcard_all(event_enabler);
2527
2528 /* First ensure that probe events are created for this enabler. */
2529 lttng_event_enabler_create_events_if_missing(event_enabler);
2530
2531 /* Link the created event with its associated enabler. */
2532 list_for_each_entry(event_priv, event_list_head, node) {
2533 struct lttng_kernel_event_common *event = event_priv->pub;
2534 struct lttng_enabler_ref *enabler_ref;
2535
2536 if (!lttng_event_enabler_match_event(event_enabler, event))
2537 continue;
2538
2539 enabler_ref = lttng_enabler_ref(&event_priv->enablers_ref_head, event_enabler);
2540 if (!enabler_ref) {
2541 int ret;
2542
2543 /*
2544 * If no backward ref, create it.
2545 * Add backward ref from event_notifier to enabler.
2546 */
2547 enabler_ref = kzalloc(sizeof(*enabler_ref), GFP_KERNEL);
2548 if (!enabler_ref)
2549 return -ENOMEM;
2550
2551 enabler_ref->ref = event_enabler;
2552 list_add(&enabler_ref->node, &event_priv->enablers_ref_head);
2553
2554 ret = lttng_append_event_to_channel_map(event_enabler, event,
2555 event->priv->desc->event_name);
2556 WARN_ON_ONCE(ret);
2557 }
2558
2559 lttng_event_enabler_init_event_filter(event_enabler, event);
2560 lttng_event_enabler_init_event_capture(event_enabler, event);
2561 }
2562 end:
2563 return 0;
2564 }
2565
2566 /*
2567 * Called at module load: connect the probe on all enablers matching
2568 * this event.
2569 * Called with sessions lock held.
2570 */
2571 int lttng_fix_pending_events(void)
2572 {
2573 struct lttng_kernel_session_private *session_priv;
2574
2575 list_for_each_entry(session_priv, &sessions, node)
2576 lttng_session_lazy_sync_event_enablers(session_priv->pub);
2577 return 0;
2578 }
2579
2580 static bool lttng_event_notifier_group_has_active_event_notifiers(
2581 struct lttng_event_notifier_group *event_notifier_group)
2582 {
2583 struct lttng_event_enabler_common *event_enabler;
2584
2585 list_for_each_entry(event_enabler, &event_notifier_group->enablers_head, node) {
2586 if (event_enabler->enabled)
2587 return true;
2588 }
2589 return false;
2590 }
2591
2592 bool lttng_event_notifier_active(void)
2593 {
2594 struct lttng_event_notifier_group *event_notifier_group;
2595
2596 list_for_each_entry(event_notifier_group, &event_notifier_groups, node) {
2597 if (lttng_event_notifier_group_has_active_event_notifiers(event_notifier_group))
2598 return true;
2599 }
2600 return false;
2601 }
2602
2603 int lttng_fix_pending_event_notifiers(void)
2604 {
2605 struct lttng_event_notifier_group *event_notifier_group;
2606
2607 list_for_each_entry(event_notifier_group, &event_notifier_groups, node)
2608 lttng_event_notifier_group_sync_enablers(event_notifier_group);
2609 return 0;
2610 }
2611
2612 struct lttng_event_recorder_enabler *lttng_event_recorder_enabler_create(
2613 enum lttng_enabler_format_type format_type,
2614 struct lttng_kernel_abi_event *event_param,
2615 struct lttng_kernel_channel_buffer *chan)
2616 {
2617 struct lttng_event_recorder_enabler *event_enabler;
2618
2619 event_enabler = kzalloc(sizeof(*event_enabler), GFP_KERNEL);
2620 if (!event_enabler)
2621 return NULL;
2622 event_enabler->parent.parent.enabler_type = LTTNG_EVENT_ENABLER_TYPE_RECORDER;
2623 event_enabler->parent.parent.format_type = format_type;
2624 INIT_LIST_HEAD(&event_enabler->parent.parent.filter_bytecode_head);
2625 memcpy(&event_enabler->parent.parent.event_param, event_param,
2626 sizeof(event_enabler->parent.parent.event_param));
2627 event_enabler->chan = chan;
2628 event_enabler->parent.chan = &chan->parent;
2629
2630 /* ctx left NULL */
2631 event_enabler->parent.parent.enabled = 0;
2632 return event_enabler;
2633 }
2634
2635 struct lttng_event_counter_enabler *lttng_event_counter_enabler_create(
2636 enum lttng_enabler_format_type format_type,
2637 struct lttng_kernel_abi_event *event_param,
2638 struct lttng_kernel_counter_key *counter_key,
2639 struct lttng_kernel_channel_counter *chan)
2640 {
2641 struct lttng_event_counter_enabler *event_enabler;
2642
2643 event_enabler = kzalloc(sizeof(*event_enabler), GFP_KERNEL);
2644 if (!event_enabler)
2645 return NULL;
2646 event_enabler->parent.parent.enabler_type = LTTNG_EVENT_ENABLER_TYPE_COUNTER;
2647 event_enabler->parent.parent.format_type = format_type;
2648 INIT_LIST_HEAD(&event_enabler->parent.parent.filter_bytecode_head);
2649 memcpy(&event_enabler->parent.parent.event_param, event_param,
2650 sizeof(event_enabler->parent.parent.event_param));
2651 event_enabler->chan = chan;
2652 event_enabler->parent.chan = &chan->parent;
2653 if (create_counter_key_from_kernel(&event_enabler->key, counter_key)) {
2654 kfree(event_enabler);
2655 return NULL;
2656 }
2657
2658 /* ctx left NULL */
2659 event_enabler->parent.parent.enabled = 0;
2660 event_enabler->parent.parent.user_token = event_param->token;
2661 return event_enabler;
2662 }
2663
2664 void lttng_event_enabler_session_add(struct lttng_kernel_session *session,
2665 struct lttng_event_enabler_session_common *event_enabler)
2666 {
2667 mutex_lock(&sessions_mutex);
2668 list_add(&event_enabler->parent.node, &session->priv->enablers_head);
2669 event_enabler->parent.published = true;
2670 lttng_session_lazy_sync_event_enablers(session);
2671 mutex_unlock(&sessions_mutex);
2672 }
2673
2674 int lttng_event_enabler_enable(struct lttng_event_enabler_common *event_enabler)
2675 {
2676 mutex_lock(&sessions_mutex);
2677 event_enabler->enabled = 1;
2678 lttng_event_enabler_sync(event_enabler);
2679 mutex_unlock(&sessions_mutex);
2680 return 0;
2681 }
2682
2683 int lttng_event_enabler_disable(struct lttng_event_enabler_common *event_enabler)
2684 {
2685 mutex_lock(&sessions_mutex);
2686 event_enabler->enabled = 0;
2687 lttng_event_enabler_sync(event_enabler);
2688 mutex_unlock(&sessions_mutex);
2689 return 0;
2690 }
2691
2692 static
2693 int lttng_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *enabler,
2694 struct lttng_kernel_abi_filter_bytecode __user *bytecode)
2695 {
2696 struct lttng_kernel_bytecode_node *bytecode_node;
2697 uint32_t bytecode_len;
2698 int ret;
2699
2700 ret = get_user(bytecode_len, &bytecode->len);
2701 if (ret)
2702 return ret;
2703 bytecode_node = lttng_kvzalloc(sizeof(*bytecode_node) + bytecode_len,
2704 GFP_KERNEL);
2705 if (!bytecode_node)
2706 return -ENOMEM;
2707 ret = copy_from_user(&bytecode_node->bc, bytecode,
2708 sizeof(*bytecode) + bytecode_len);
2709 if (ret)
2710 goto error_free;
2711
2712 bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_FILTER;
2713 bytecode_node->enabler = enabler;
2714 /* Enforce length based on allocated size */
2715 bytecode_node->bc.len = bytecode_len;
2716 list_add_tail(&bytecode_node->node, &enabler->filter_bytecode_head);
2717
2718 return 0;
2719
2720 error_free:
2721 lttng_kvfree(bytecode_node);
2722 return ret;
2723 }
2724
2725 int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *event_enabler,
2726 struct lttng_kernel_abi_filter_bytecode __user *bytecode)
2727 {
2728 int ret;
2729 ret = lttng_enabler_attach_filter_bytecode(event_enabler, bytecode);
2730 if (ret)
2731 goto error;
2732 lttng_event_enabler_sync(event_enabler);
2733 return 0;
2734
2735 error:
2736 return ret;
2737 }
2738
2739 int lttng_event_add_callsite(struct lttng_kernel_event_common *event,
2740 struct lttng_kernel_abi_event_callsite __user *callsite)
2741 {
2742
2743 switch (event->priv->instrumentation) {
2744 case LTTNG_KERNEL_ABI_UPROBE:
2745 return lttng_uprobes_event_add_callsite(event, callsite);
2746 default:
2747 return -EINVAL;
2748 }
2749 }
2750
2751 static
2752 void lttng_enabler_destroy(struct lttng_event_enabler_common *enabler)
2753 {
2754 struct lttng_kernel_bytecode_node *filter_node, *tmp_filter_node;
2755
2756 /* Destroy filter bytecode */
2757 list_for_each_entry_safe(filter_node, tmp_filter_node,
2758 &enabler->filter_bytecode_head, node) {
2759 lttng_kvfree(filter_node);
2760 }
2761 }
2762
2763 void lttng_event_enabler_destroy(struct lttng_event_enabler_common *event_enabler)
2764 {
2765 lttng_enabler_destroy(event_enabler);
2766 if (event_enabler->published)
2767 list_del(&event_enabler->node);
2768
2769 switch (event_enabler->enabler_type) {
2770 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
2771 {
2772 struct lttng_event_recorder_enabler *event_recorder_enabler =
2773 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
2774
2775 kfree(event_recorder_enabler);
2776 break;
2777 }
2778 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
2779 {
2780 struct lttng_event_notifier_enabler *event_notifier_enabler =
2781 container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
2782
2783 kfree(event_notifier_enabler);
2784 break;
2785 }
2786 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
2787 {
2788 struct lttng_event_counter_enabler *event_counter_enabler =
2789 container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
2790
2791 destroy_counter_key(event_counter_enabler->key);
2792 kfree(event_counter_enabler);
2793 break;
2794 }
2795 default:
2796 WARN_ON_ONCE(1);
2797 }
2798 }
2799
2800 struct lttng_event_notifier_enabler *lttng_event_notifier_enabler_create(
2801 enum lttng_enabler_format_type format_type,
2802 struct lttng_kernel_abi_event_notifier *event_notifier_param,
2803 struct lttng_event_notifier_group *event_notifier_group)
2804 {
2805 struct lttng_event_notifier_enabler *event_notifier_enabler;
2806
2807 event_notifier_enabler = kzalloc(sizeof(*event_notifier_enabler), GFP_KERNEL);
2808 if (!event_notifier_enabler)
2809 return NULL;
2810
2811 event_notifier_enabler->parent.enabler_type = LTTNG_EVENT_ENABLER_TYPE_NOTIFIER;
2812 event_notifier_enabler->parent.format_type = format_type;
2813 INIT_LIST_HEAD(&event_notifier_enabler->parent.filter_bytecode_head);
2814 INIT_LIST_HEAD(&event_notifier_enabler->capture_bytecode_head);
2815
2816 event_notifier_enabler->error_counter_index = event_notifier_param->error_counter_index;
2817 event_notifier_enabler->num_captures = 0;
2818
2819 memcpy(&event_notifier_enabler->parent.event_param, &event_notifier_param->event,
2820 sizeof(event_notifier_enabler->parent.event_param));
2821
2822 event_notifier_enabler->parent.enabled = 0;
2823 event_notifier_enabler->parent.user_token = event_notifier_param->event.token;
2824 event_notifier_enabler->group = event_notifier_group;
2825 return event_notifier_enabler;
2826 }
2827
2828 void lttng_event_notifier_enabler_group_add(struct lttng_event_notifier_group *event_notifier_group,
2829 struct lttng_event_notifier_enabler *event_notifier_enabler)
2830 {
2831 mutex_lock(&sessions_mutex);
2832 list_add(&event_notifier_enabler->parent.node, &event_notifier_enabler->group->enablers_head);
2833 event_notifier_enabler->parent.published = true;
2834 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
2835 mutex_unlock(&sessions_mutex);
2836 }
2837
2838 int lttng_event_notifier_enabler_attach_capture_bytecode(
2839 struct lttng_event_notifier_enabler *event_notifier_enabler,
2840 struct lttng_kernel_abi_capture_bytecode __user *bytecode)
2841 {
2842 struct lttng_kernel_bytecode_node *bytecode_node;
2843 struct lttng_event_enabler_common *enabler =
2844 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler);
2845 uint32_t bytecode_len;
2846 int ret;
2847
2848 ret = get_user(bytecode_len, &bytecode->len);
2849 if (ret)
2850 return ret;
2851
2852 bytecode_node = lttng_kvzalloc(sizeof(*bytecode_node) + bytecode_len,
2853 GFP_KERNEL);
2854 if (!bytecode_node)
2855 return -ENOMEM;
2856
2857 ret = copy_from_user(&bytecode_node->bc, bytecode,
2858 sizeof(*bytecode) + bytecode_len);
2859 if (ret)
2860 goto error_free;
2861
2862 bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_CAPTURE;
2863 bytecode_node->enabler = enabler;
2864
2865 /* Enforce length based on allocated size */
2866 bytecode_node->bc.len = bytecode_len;
2867 list_add_tail(&bytecode_node->node, &event_notifier_enabler->capture_bytecode_head);
2868
2869 event_notifier_enabler->num_captures++;
2870
2871 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
2872 goto end;
2873
2874 error_free:
2875 lttng_kvfree(bytecode_node);
2876 end:
2877 return ret;
2878 }
2879
2880 static
2881 void lttng_event_sync_filter_state(struct lttng_kernel_event_common *event)
2882 {
2883 int has_enablers_without_filter_bytecode = 0, nr_filters = 0;
2884 struct lttng_kernel_bytecode_runtime *runtime;
2885 struct lttng_enabler_ref *enabler_ref;
2886
2887 /* Check if has enablers without bytecode enabled */
2888 list_for_each_entry(enabler_ref, &event->priv->enablers_ref_head, node) {
2889 if (enabler_ref->ref->enabled
2890 && list_empty(&enabler_ref->ref->filter_bytecode_head)) {
2891 has_enablers_without_filter_bytecode = 1;
2892 break;
2893 }
2894 }
2895 event->priv->has_enablers_without_filter_bytecode = has_enablers_without_filter_bytecode;
2896
2897 /* Enable filters */
2898 list_for_each_entry(runtime, &event->priv->filter_bytecode_runtime_head, node) {
2899 lttng_bytecode_sync_state(runtime);
2900 nr_filters++;
2901 }
2902 WRITE_ONCE(event->eval_filter, !(has_enablers_without_filter_bytecode || !nr_filters));
2903 }
2904
2905 static
2906 void lttng_event_sync_capture_state(struct lttng_kernel_event_common *event)
2907 {
2908 switch (event->type) {
2909 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
2910 lttng_fallthrough;
2911 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
2912 break;
2913 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
2914 {
2915 struct lttng_kernel_event_notifier *event_notifier =
2916 container_of(event, struct lttng_kernel_event_notifier, parent);
2917 struct lttng_kernel_bytecode_runtime *runtime;
2918 int nr_captures = 0;
2919
2920 /* Enable captures */
2921 list_for_each_entry(runtime, &event_notifier->priv->capture_bytecode_runtime_head, node) {
2922 lttng_bytecode_sync_state(runtime);
2923 nr_captures++;
2924 }
2925 WRITE_ONCE(event_notifier->eval_capture, !!nr_captures);
2926 break;
2927 }
2928 default:
2929 WARN_ON_ONCE(1);
2930 }
2931 }
2932
2933 static
2934 bool lttng_get_event_enabled_state(struct lttng_kernel_event_common *event)
2935 {
2936 struct lttng_enabler_ref *enabler_ref;
2937 bool enabled = false;
2938
2939 switch (event->priv->instrumentation) {
2940 case LTTNG_KERNEL_ABI_TRACEPOINT:
2941 lttng_fallthrough;
2942 case LTTNG_KERNEL_ABI_SYSCALL:
2943 lttng_fallthrough;
2944 case LTTNG_KERNEL_ABI_KPROBE:
2945 lttng_fallthrough;
2946 case LTTNG_KERNEL_ABI_KRETPROBE:
2947 /* Enable events */
2948 list_for_each_entry(enabler_ref, &event->priv->enablers_ref_head, node) {
2949 if (enabler_ref->ref->enabled) {
2950 enabled = true;
2951 break;
2952 }
2953 }
2954 break;
2955 default:
2956 WARN_ON_ONCE(1);
2957 return false;
2958 }
2959
2960 switch (event->type) {
2961 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
2962 lttng_fallthrough;
2963 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
2964 {
2965 struct lttng_kernel_event_session_common_private *event_session_common_priv =
2966 container_of(event->priv, struct lttng_kernel_event_session_common_private, parent);
2967
2968 /*
2969 * Enabled state is based on union of enablers, with
2970 * intersection of session and channel transient enable
2971 * states.
2972 */
2973 return enabled && event_session_common_priv->chan->session->priv->tstate && event_session_common_priv->chan->priv->tstate;
2974 }
2975 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
2976 return enabled;
2977 default:
2978 WARN_ON_ONCE(1);
2979 return false;
2980 }
2981 }
2982
2983 static
2984 bool lttng_event_is_lazy_sync(struct lttng_kernel_event_common *event)
2985 {
2986 switch (event->priv->instrumentation) {
2987 case LTTNG_KERNEL_ABI_TRACEPOINT:
2988 lttng_fallthrough;
2989 case LTTNG_KERNEL_ABI_SYSCALL:
2990 lttng_fallthrough;
2991 case LTTNG_KERNEL_ABI_KPROBE:
2992 lttng_fallthrough;
2993 case LTTNG_KERNEL_ABI_KRETPROBE:
2994 return true;
2995
2996 default:
2997 /* Not handled with lazy sync. */
2998 return false;
2999 }
3000 }
3001
3002 /*
3003 * Should be called with sessions mutex held.
3004 */
3005 static
3006 void lttng_sync_event_list(struct list_head *event_enabler_list,
3007 struct list_head *event_list)
3008 {
3009 struct lttng_kernel_event_common_private *event_priv;
3010 struct lttng_event_enabler_common *event_enabler;
3011
3012 list_for_each_entry(event_enabler, event_enabler_list, node)
3013 lttng_event_enabler_ref_events(event_enabler);
3014
3015 /*
3016 * For each event, if at least one of its enablers is enabled,
3017 * and its channel and session transient states are enabled, we
3018 * enable the event, else we disable it.
3019 */
3020 list_for_each_entry(event_priv, event_list, node) {
3021 struct lttng_kernel_event_common *event = event_priv->pub;
3022 bool enabled;
3023
3024 if (!lttng_event_is_lazy_sync(event))
3025 continue;
3026
3027 enabled = lttng_get_event_enabled_state(event);
3028 WRITE_ONCE(event->enabled, enabled);
3029 /*
3030 * Sync tracepoint registration with event enabled state.
3031 */
3032 if (enabled) {
3033 if (!event_priv->registered)
3034 register_event(event);
3035 } else {
3036 if (event_priv->registered)
3037 unregister_event(event);
3038 }
3039
3040 lttng_event_sync_filter_state(event);
3041 lttng_event_sync_capture_state(event);
3042 }
3043 }
3044
3045 /*
3046 * lttng_session_sync_event_enablers should be called just before starting a
3047 * session.
3048 */
3049 static
3050 void lttng_session_sync_event_enablers(struct lttng_kernel_session *session)
3051 {
3052 lttng_sync_event_list(&session->priv->enablers_head, &session->priv->events_head);
3053 }
3054
3055 /*
3056 * Apply enablers to session events, adding events to session if need
3057 * be. It is required after each modification applied to an active
3058 * session, and right before session "start".
3059 * "lazy" sync means we only sync if required.
3060 * Should be called with sessions mutex held.
3061 */
3062 static
3063 void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session)
3064 {
3065 /* We can skip if session is not active */
3066 if (!session->active)
3067 return;
3068 lttng_session_sync_event_enablers(session);
3069 }
3070
3071 static
3072 void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group)
3073 {
3074 lttng_sync_event_list(&event_notifier_group->enablers_head, &event_notifier_group->event_notifiers_head);
3075 }
3076
3077 static
3078 void lttng_event_enabler_sync(struct lttng_event_enabler_common *event_enabler)
3079 {
3080 switch (event_enabler->enabler_type) {
3081 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
3082 lttng_fallthrough;
3083 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
3084 {
3085 struct lttng_event_enabler_session_common *event_enabler_session =
3086 container_of(event_enabler, struct lttng_event_enabler_session_common, parent);
3087 lttng_session_lazy_sync_event_enablers(event_enabler_session->chan->session);
3088 break;
3089 }
3090 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
3091 {
3092 struct lttng_event_notifier_enabler *event_notifier_enabler =
3093 container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
3094 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
3095 break;
3096 }
3097 default:
3098 WARN_ON_ONCE(1);
3099 }
3100 }
3101
3102 /*
3103 * Serialize at most one packet worth of metadata into a metadata
3104 * channel.
3105 * We grab the metadata cache mutex to get exclusive access to our metadata
3106 * buffer and to the metadata cache. Exclusive access to the metadata buffer
3107 * allows us to do racy operations such as looking for remaining space left in
3108 * packet and write, since mutual exclusion protects us from concurrent writes.
3109 * Mutual exclusion on the metadata cache allow us to read the cache content
3110 * without racing against reallocation of the cache by updates.
3111 * Returns the number of bytes written in the channel, 0 if no data
3112 * was written and a negative value on error.
3113 */
3114 int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
3115 struct lttng_kernel_ring_buffer_channel *chan, bool *coherent)
3116 {
3117 struct lttng_kernel_ring_buffer_ctx ctx;
3118 int ret = 0;
3119 size_t len, reserve_len;
3120
3121 /*
3122 * Ensure we support mutiple get_next / put sequences followed by
3123 * put_next. The metadata cache lock protects reading the metadata
3124 * cache. It can indeed be read concurrently by "get_next_subbuf" and
3125 * "flush" operations on the buffer invoked by different processes.
3126 * Moreover, since the metadata cache memory can be reallocated, we
3127 * need to have exclusive access against updates even though we only
3128 * read it.
3129 */
3130 mutex_lock(&stream->metadata_cache->lock);
3131 WARN_ON(stream->metadata_in < stream->metadata_out);
3132 if (stream->metadata_in != stream->metadata_out)
3133 goto end;
3134
3135 /* Metadata regenerated, change the version. */
3136 if (stream->metadata_cache->version != stream->version)
3137 stream->version = stream->metadata_cache->version;
3138
3139 len = stream->metadata_cache->metadata_written -
3140 stream->metadata_in;
3141 if (!len)
3142 goto end;
3143 reserve_len = min_t(size_t,
3144 stream->transport->ops.priv->packet_avail_size(chan),
3145 len);
3146 lib_ring_buffer_ctx_init(&ctx, chan, reserve_len,
3147 sizeof(char), NULL);
3148 /*
3149 * If reservation failed, return an error to the caller.
3150 */
3151 ret = stream->transport->ops.event_reserve(&ctx);
3152 if (ret != 0) {
3153 printk(KERN_WARNING "LTTng: Metadata event reservation failed\n");
3154 stream->coherent = false;
3155 goto end;
3156 }
3157 stream->transport->ops.event_write(&ctx,
3158 stream->metadata_cache->data + stream->metadata_in,
3159 reserve_len, 1);
3160 stream->transport->ops.event_commit(&ctx);
3161 stream->metadata_in += reserve_len;
3162 if (reserve_len < len)
3163 stream->coherent = false;
3164 else
3165 stream->coherent = true;
3166 ret = reserve_len;
3167
3168 end:
3169 if (coherent)
3170 *coherent = stream->coherent;
3171 mutex_unlock(&stream->metadata_cache->lock);
3172 return ret;
3173 }
3174
3175 static
3176 void lttng_metadata_begin(struct lttng_kernel_session *session)
3177 {
3178 if (atomic_inc_return(&session->priv->metadata_cache->producing) == 1)
3179 mutex_lock(&session->priv->metadata_cache->lock);
3180 }
3181
3182 static
3183 void lttng_metadata_end(struct lttng_kernel_session *session)
3184 {
3185 WARN_ON_ONCE(!atomic_read(&session->priv->metadata_cache->producing));
3186 if (atomic_dec_return(&session->priv->metadata_cache->producing) == 0) {
3187 struct lttng_metadata_stream *stream;
3188
3189 list_for_each_entry(stream, &session->priv->metadata_cache->metadata_stream, node)
3190 wake_up_interruptible(&stream->read_wait);
3191 mutex_unlock(&session->priv->metadata_cache->lock);
3192 }
3193 }
3194
3195 /*
3196 * Write the metadata to the metadata cache.
3197 * Must be called with sessions_mutex held.
3198 * The metadata cache lock protects us from concurrent read access from
3199 * thread outputting metadata content to ring buffer.
3200 * The content of the printf is printed as a single atomic metadata
3201 * transaction.
3202 */
3203 static
3204 int lttng_metadata_printf(struct lttng_kernel_session *session,
3205 const char *fmt, ...)
3206 {
3207 char *str;
3208 size_t len;
3209 va_list ap;
3210
3211 WARN_ON_ONCE(!LTTNG_READ_ONCE(session->active));
3212
3213 va_start(ap, fmt);
3214 str = kvasprintf(GFP_KERNEL, fmt, ap);
3215 va_end(ap);
3216 if (!str)
3217 return -ENOMEM;
3218
3219 len = strlen(str);
3220 WARN_ON_ONCE(!atomic_read(&session->priv->metadata_cache->producing));
3221 if (session->priv->metadata_cache->metadata_written + len >
3222 session->priv->metadata_cache->cache_alloc) {
3223 char *tmp_cache_realloc;
3224 unsigned int tmp_cache_alloc_size;
3225
3226 tmp_cache_alloc_size = max_t(unsigned int,
3227 session->priv->metadata_cache->cache_alloc + len,
3228 session->priv->metadata_cache->cache_alloc << 1);
3229 tmp_cache_realloc = vzalloc(tmp_cache_alloc_size);
3230 if (!tmp_cache_realloc)
3231 goto err;
3232 if (session->priv->metadata_cache->data) {
3233 memcpy(tmp_cache_realloc,
3234 session->priv->metadata_cache->data,
3235 session->priv->metadata_cache->cache_alloc);
3236 vfree(session->priv->metadata_cache->data);
3237 }
3238
3239 session->priv->metadata_cache->cache_alloc = tmp_cache_alloc_size;
3240 session->priv->metadata_cache->data = tmp_cache_realloc;
3241 }
3242 memcpy(session->priv->metadata_cache->data +
3243 session->priv->metadata_cache->metadata_written,
3244 str, len);
3245 session->priv->metadata_cache->metadata_written += len;
3246 kfree(str);
3247
3248 return 0;
3249
3250 err:
3251 kfree(str);
3252 return -ENOMEM;
3253 }
3254
3255 static
3256 int print_tabs(struct lttng_kernel_session *session, size_t nesting)
3257 {
3258 size_t i;
3259
3260 for (i = 0; i < nesting; i++) {
3261 int ret;
3262
3263 ret = lttng_metadata_printf(session, " ");
3264 if (ret) {
3265 return ret;
3266 }
3267 }
3268 return 0;
3269 }
3270
3271 static
3272 int lttng_field_name_statedump(struct lttng_kernel_session *session,
3273 const struct lttng_kernel_event_field *field,
3274 size_t nesting)
3275 {
3276 return lttng_metadata_printf(session, " _%s;\n", field->name);
3277 }
3278
3279 static
3280 int _lttng_integer_type_statedump(struct lttng_kernel_session *session,
3281 const struct lttng_kernel_type_integer *type,
3282 enum lttng_kernel_string_encoding parent_encoding,
3283 size_t nesting)
3284 {
3285 int ret;
3286
3287 ret = print_tabs(session, nesting);
3288 if (ret)
3289 return ret;
3290 ret = lttng_metadata_printf(session,
3291 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s }",
3292 type->size,
3293 type->alignment,
3294 type->signedness,
3295 (parent_encoding == lttng_kernel_string_encoding_none)
3296 ? "none"
3297 : (parent_encoding == lttng_kernel_string_encoding_UTF8)
3298 ? "UTF8"
3299 : "ASCII",
3300 type->base,
3301 #if __BYTE_ORDER == __BIG_ENDIAN
3302 type->reverse_byte_order ? " byte_order = le;" : ""
3303 #else
3304 type->reverse_byte_order ? " byte_order = be;" : ""
3305 #endif
3306 );
3307 return ret;
3308 }
3309
3310 /*
3311 * Must be called with sessions_mutex held.
3312 */
3313 static
3314 int _lttng_struct_type_statedump(struct lttng_kernel_session *session,
3315 const struct lttng_kernel_type_struct *type,
3316 size_t nesting)
3317 {
3318 const char *prev_field_name = NULL;
3319 int ret;
3320 uint32_t i, nr_fields;
3321 unsigned int alignment;
3322
3323 ret = print_tabs(session, nesting);
3324 if (ret)
3325 return ret;
3326 ret = lttng_metadata_printf(session,
3327 "struct {\n");
3328 if (ret)
3329 return ret;
3330 nr_fields = type->nr_fields;
3331 for (i = 0; i < nr_fields; i++) {
3332 const struct lttng_kernel_event_field *iter_field;
3333
3334 iter_field = type->fields[i];
3335 ret = _lttng_field_statedump(session, iter_field, nesting + 1, &prev_field_name);
3336 if (ret)
3337 return ret;
3338 }
3339 ret = print_tabs(session, nesting);
3340 if (ret)
3341 return ret;
3342 alignment = type->alignment;
3343 if (alignment) {
3344 ret = lttng_metadata_printf(session,
3345 "} align(%u)",
3346 alignment);
3347 } else {
3348 ret = lttng_metadata_printf(session,
3349 "}");
3350 }
3351 return ret;
3352 }
3353
3354 /*
3355 * Must be called with sessions_mutex held.
3356 */
3357 static
3358 int _lttng_struct_field_statedump(struct lttng_kernel_session *session,
3359 const struct lttng_kernel_event_field *field,
3360 size_t nesting)
3361 {
3362 int ret;
3363
3364 ret = _lttng_struct_type_statedump(session,
3365 lttng_kernel_get_type_struct(field->type), nesting);
3366 if (ret)
3367 return ret;
3368 return lttng_field_name_statedump(session, field, nesting);
3369 }
3370
3371 /*
3372 * Must be called with sessions_mutex held.
3373 */
3374 static
3375 int _lttng_variant_type_statedump(struct lttng_kernel_session *session,
3376 const struct lttng_kernel_type_variant *type,
3377 size_t nesting,
3378 const char *prev_field_name)
3379 {
3380 const char *tag_name;
3381 int ret;
3382 uint32_t i, nr_choices;
3383
3384 tag_name = type->tag_name;
3385 if (!tag_name)
3386 tag_name = prev_field_name;
3387 if (!tag_name)
3388 return -EINVAL;
3389 /*
3390 * CTF 1.8 does not allow expressing nonzero variant alignment in a nestable way.
3391 */
3392 if (type->alignment != 0)
3393 return -EINVAL;
3394 ret = print_tabs(session, nesting);
3395 if (ret)
3396 return ret;
3397 ret = lttng_metadata_printf(session,
3398 "variant <_%s> {\n",
3399 tag_name);
3400 if (ret)
3401 return ret;
3402 nr_choices = type->nr_choices;
3403 for (i = 0; i < nr_choices; i++) {
3404 const struct lttng_kernel_event_field *iter_field;
3405
3406 iter_field = type->choices[i];
3407 ret = _lttng_field_statedump(session, iter_field, nesting + 1, NULL);
3408 if (ret)
3409 return ret;
3410 }
3411 ret = print_tabs(session, nesting);
3412 if (ret)
3413 return ret;
3414 ret = lttng_metadata_printf(session,
3415 "}");
3416 return ret;
3417 }
3418
3419 /*
3420 * Must be called with sessions_mutex held.
3421 */
3422 static
3423 int _lttng_variant_field_statedump(struct lttng_kernel_session *session,
3424 const struct lttng_kernel_event_field *field,
3425 size_t nesting,
3426 const char *prev_field_name)
3427 {
3428 int ret;
3429
3430 ret = _lttng_variant_type_statedump(session,
3431 lttng_kernel_get_type_variant(field->type), nesting,
3432 prev_field_name);
3433 if (ret)
3434 return ret;
3435 return lttng_field_name_statedump(session, field, nesting);
3436 }
3437
3438 /*
3439 * Must be called with sessions_mutex held.
3440 */
3441 static
3442 int _lttng_array_field_statedump(struct lttng_kernel_session *session,
3443 const struct lttng_kernel_event_field *field,
3444 size_t nesting)
3445 {
3446 int ret;
3447 const struct lttng_kernel_type_array *array_type;
3448 const struct lttng_kernel_type_common *elem_type;
3449
3450 array_type = lttng_kernel_get_type_array(field->type);
3451 WARN_ON_ONCE(!array_type);
3452
3453 if (array_type->alignment) {
3454 ret = print_tabs(session, nesting);
3455 if (ret)
3456 return ret;
3457 ret = lttng_metadata_printf(session,
3458 "struct { } align(%u) _%s_padding;\n",
3459 array_type->alignment * CHAR_BIT,
3460 field->name);
3461 if (ret)
3462 return ret;
3463 }
3464 /*
3465 * Nested compound types: Only array of structures and variants are
3466 * currently supported.
3467 */
3468 elem_type = array_type->elem_type;
3469 switch (elem_type->type) {
3470 case lttng_kernel_type_integer:
3471 case lttng_kernel_type_struct:
3472 case lttng_kernel_type_variant:
3473 ret = _lttng_type_statedump(session, elem_type,
3474 array_type->encoding, nesting);
3475 if (ret)
3476 return ret;
3477 break;
3478
3479 default:
3480 return -EINVAL;
3481 }
3482 ret = lttng_metadata_printf(session,
3483 " _%s[%u];\n",
3484 field->name,
3485 array_type->length);
3486 return ret;
3487 }
3488
3489 /*
3490 * Must be called with sessions_mutex held.
3491 */
3492 static
3493 int _lttng_sequence_field_statedump(struct lttng_kernel_session *session,
3494 const struct lttng_kernel_event_field *field,
3495 size_t nesting,
3496 const char *prev_field_name)
3497 {
3498 int ret;
3499 const char *length_name;
3500 const struct lttng_kernel_type_sequence *sequence_type;
3501 const struct lttng_kernel_type_common *elem_type;
3502
3503 sequence_type = lttng_kernel_get_type_sequence(field->type);
3504 WARN_ON_ONCE(!sequence_type);
3505
3506 length_name = sequence_type->length_name;
3507 if (!length_name)
3508 length_name = prev_field_name;
3509 if (!length_name)
3510 return -EINVAL;
3511
3512 if (sequence_type->alignment) {
3513 ret = print_tabs(session, nesting);
3514 if (ret)
3515 return ret;
3516 ret = lttng_metadata_printf(session,
3517 "struct { } align(%u) _%s_padding;\n",
3518 sequence_type->alignment * CHAR_BIT,
3519 field->name);
3520 if (ret)
3521 return ret;
3522 }
3523
3524 /*
3525 * Nested compound types: Only array of structures and variants are
3526 * currently supported.
3527 */
3528 elem_type = sequence_type->elem_type;
3529 switch (elem_type->type) {
3530 case lttng_kernel_type_integer:
3531 case lttng_kernel_type_struct:
3532 case lttng_kernel_type_variant:
3533 ret = _lttng_type_statedump(session, elem_type,
3534 sequence_type->encoding, nesting);
3535 if (ret)
3536 return ret;
3537 break;
3538
3539 default:
3540 return -EINVAL;
3541 }
3542 ret = lttng_metadata_printf(session,
3543 " _%s[ _%s ];\n",
3544 field->name,
3545 length_name);
3546 return ret;
3547 }
3548
3549 /*
3550 * Must be called with sessions_mutex held.
3551 */
3552 static
3553 int _lttng_enum_type_statedump(struct lttng_kernel_session *session,
3554 const struct lttng_kernel_type_enum *type,
3555 size_t nesting)
3556 {
3557 const struct lttng_kernel_enum_desc *enum_desc;
3558 const struct lttng_kernel_type_common *container_type;
3559 int ret;
3560 unsigned int i, nr_entries;
3561
3562 container_type = type->container_type;
3563 if (container_type->type != lttng_kernel_type_integer) {
3564 ret = -EINVAL;
3565 goto end;
3566 }
3567 enum_desc = type->desc;
3568 nr_entries = enum_desc->nr_entries;
3569
3570 ret = print_tabs(session, nesting);
3571 if (ret)
3572 goto end;
3573 ret = lttng_metadata_printf(session, "enum : ");
3574 if (ret)
3575 goto end;
3576 ret = _lttng_integer_type_statedump(session, lttng_kernel_get_type_integer(container_type),
3577 lttng_kernel_string_encoding_none, 0);
3578 if (ret)
3579 goto end;
3580 ret = lttng_metadata_printf(session, " {\n");
3581 if (ret)
3582 goto end;
3583 /* Dump all entries */
3584 for (i = 0; i < nr_entries; i++) {
3585 const struct lttng_kernel_enum_entry *entry = enum_desc->entries[i];
3586 int j, len;
3587
3588 ret = print_tabs(session, nesting + 1);
3589 if (ret)
3590 goto end;
3591 ret = lttng_metadata_printf(session,
3592 "\"");
3593 if (ret)
3594 goto end;
3595 len = strlen(entry->string);
3596 /* Escape the character '"' */
3597 for (j = 0; j < len; j++) {
3598 char c = entry->string[j];
3599
3600 switch (c) {
3601 case '"':
3602 ret = lttng_metadata_printf(session,
3603 "\\\"");
3604 break;
3605 case '\\':
3606 ret = lttng_metadata_printf(session,
3607 "\\\\");
3608 break;
3609 default:
3610 ret = lttng_metadata_printf(session,
3611 "%c", c);
3612 break;
3613 }
3614 if (ret)
3615 goto end;
3616 }
3617 ret = lttng_metadata_printf(session, "\"");
3618 if (ret)
3619 goto end;
3620
3621 if (entry->options.is_auto) {
3622 ret = lttng_metadata_printf(session, ",\n");
3623 if (ret)
3624 goto end;
3625 } else {
3626 ret = lttng_metadata_printf(session,
3627 " = ");
3628 if (ret)
3629 goto end;
3630 if (entry->start.signedness)
3631 ret = lttng_metadata_printf(session,
3632 "%lld", (long long) entry->start.value);
3633 else
3634 ret = lttng_metadata_printf(session,
3635 "%llu", entry->start.value);
3636 if (ret)
3637 goto end;
3638 if (entry->start.signedness == entry->end.signedness &&
3639 entry->start.value
3640 == entry->end.value) {
3641 ret = lttng_metadata_printf(session,
3642 ",\n");
3643 } else {
3644 if (entry->end.signedness) {
3645 ret = lttng_metadata_printf(session,
3646 " ... %lld,\n",
3647 (long long) entry->end.value);
3648 } else {
3649 ret = lttng_metadata_printf(session,
3650 " ... %llu,\n",
3651 entry->end.value);
3652 }
3653 }
3654 if (ret)
3655 goto end;
3656 }
3657 }
3658 ret = print_tabs(session, nesting);
3659 if (ret)
3660 goto end;
3661 ret = lttng_metadata_printf(session, "}");
3662 end:
3663 return ret;
3664 }
3665
3666 /*
3667 * Must be called with sessions_mutex held.
3668 */
3669 static
3670 int _lttng_enum_field_statedump(struct lttng_kernel_session *session,
3671 const struct lttng_kernel_event_field *field,
3672 size_t nesting)
3673 {
3674 int ret;
3675 const struct lttng_kernel_type_enum *enum_type;
3676
3677 enum_type = lttng_kernel_get_type_enum(field->type);
3678 WARN_ON_ONCE(!enum_type);
3679 ret = _lttng_enum_type_statedump(session, enum_type, nesting);
3680 if (ret)
3681 return ret;
3682 return lttng_field_name_statedump(session, field, nesting);
3683 }
3684
3685 static
3686 int _lttng_integer_field_statedump(struct lttng_kernel_session *session,
3687 const struct lttng_kernel_event_field *field,
3688 size_t nesting)
3689 {
3690 int ret;
3691
3692 ret = _lttng_integer_type_statedump(session, lttng_kernel_get_type_integer(field->type),
3693 lttng_kernel_string_encoding_none, nesting);
3694 if (ret)
3695 return ret;
3696 return lttng_field_name_statedump(session, field, nesting);
3697 }
3698
3699 static
3700 int _lttng_string_type_statedump(struct lttng_kernel_session *session,
3701 const struct lttng_kernel_type_string *type,
3702 size_t nesting)
3703 {
3704 int ret;
3705
3706 /* Default encoding is UTF8 */
3707 ret = print_tabs(session, nesting);
3708 if (ret)
3709 return ret;
3710 ret = lttng_metadata_printf(session,
3711 "string%s",
3712 type->encoding == lttng_kernel_string_encoding_ASCII ?
3713 " { encoding = ASCII; }" : "");
3714 return ret;
3715 }
3716
3717 static
3718 int _lttng_string_field_statedump(struct lttng_kernel_session *session,
3719 const struct lttng_kernel_event_field *field,
3720 size_t nesting)
3721 {
3722 const struct lttng_kernel_type_string *string_type;
3723 int ret;
3724
3725 string_type = lttng_kernel_get_type_string(field->type);
3726 WARN_ON_ONCE(!string_type);
3727 ret = _lttng_string_type_statedump(session, string_type, nesting);
3728 if (ret)
3729 return ret;
3730 return lttng_field_name_statedump(session, field, nesting);
3731 }
3732
3733 /*
3734 * Must be called with sessions_mutex held.
3735 */
3736 static
3737 int _lttng_type_statedump(struct lttng_kernel_session *session,
3738 const struct lttng_kernel_type_common *type,
3739 enum lttng_kernel_string_encoding parent_encoding,
3740 size_t nesting)
3741 {
3742 int ret = 0;
3743
3744 switch (type->type) {
3745 case lttng_kernel_type_integer:
3746 ret = _lttng_integer_type_statedump(session,
3747 lttng_kernel_get_type_integer(type),
3748 parent_encoding, nesting);
3749 break;
3750 case lttng_kernel_type_enum:
3751 ret = _lttng_enum_type_statedump(session,
3752 lttng_kernel_get_type_enum(type),
3753 nesting);
3754 break;
3755 case lttng_kernel_type_string:
3756 ret = _lttng_string_type_statedump(session,
3757 lttng_kernel_get_type_string(type),
3758 nesting);
3759 break;
3760 case lttng_kernel_type_struct:
3761 ret = _lttng_struct_type_statedump(session,
3762 lttng_kernel_get_type_struct(type),
3763 nesting);
3764 break;
3765 case lttng_kernel_type_variant:
3766 ret = _lttng_variant_type_statedump(session,
3767 lttng_kernel_get_type_variant(type),
3768 nesting, NULL);
3769 break;
3770
3771 /* Nested arrays and sequences are not supported yet. */
3772 case lttng_kernel_type_array:
3773 case lttng_kernel_type_sequence:
3774 default:
3775 WARN_ON_ONCE(1);
3776 return -EINVAL;
3777 }
3778 return ret;
3779 }
3780
3781 /*
3782 * Must be called with sessions_mutex held.
3783 */
3784 static
3785 int _lttng_field_statedump(struct lttng_kernel_session *session,
3786 const struct lttng_kernel_event_field *field,
3787 size_t nesting,
3788 const char **prev_field_name_p)
3789 {
3790 const char *prev_field_name = NULL;
3791 int ret = 0;
3792
3793 if (prev_field_name_p)
3794 prev_field_name = *prev_field_name_p;
3795 switch (field->type->type) {
3796 case lttng_kernel_type_integer:
3797 ret = _lttng_integer_field_statedump(session, field, nesting);
3798 break;
3799 case lttng_kernel_type_enum:
3800 ret = _lttng_enum_field_statedump(session, field, nesting);
3801 break;
3802 case lttng_kernel_type_string:
3803 ret = _lttng_string_field_statedump(session, field, nesting);
3804 break;
3805 case lttng_kernel_type_struct:
3806 ret = _lttng_struct_field_statedump(session, field, nesting);
3807 break;
3808 case lttng_kernel_type_array:
3809 ret = _lttng_array_field_statedump(session, field, nesting);
3810 break;
3811 case lttng_kernel_type_sequence:
3812 ret = _lttng_sequence_field_statedump(session, field, nesting, prev_field_name);
3813 break;
3814 case lttng_kernel_type_variant:
3815 ret = _lttng_variant_field_statedump(session, field, nesting, prev_field_name);
3816 break;
3817
3818 default:
3819 WARN_ON_ONCE(1);
3820 return -EINVAL;
3821 }
3822 if (prev_field_name_p)
3823 *prev_field_name_p = field->name;
3824 return ret;
3825 }
3826
3827 static
3828 int _lttng_context_metadata_statedump(struct lttng_kernel_session *session,
3829 struct lttng_kernel_ctx *ctx)
3830 {
3831 const char *prev_field_name = NULL;
3832 int ret = 0;
3833 int i;
3834
3835 if (!ctx)
3836 return 0;
3837 for (i = 0; i < ctx->nr_fields; i++) {
3838 const struct lttng_kernel_ctx_field *field = &ctx->fields[i];
3839
3840 ret = _lttng_field_statedump(session, field->event_field, 2, &prev_field_name);
3841 if (ret)
3842 return ret;
3843 }
3844 return ret;
3845 }
3846
3847 static
3848 int _lttng_fields_metadata_statedump(struct lttng_kernel_session *session,
3849 struct lttng_kernel_event_recorder *event_recorder)
3850 {
3851 const char *prev_field_name = NULL;
3852 const struct lttng_kernel_event_desc *desc = event_recorder->priv->parent.parent.desc;
3853 int ret = 0;
3854 int i;
3855
3856 for (i = 0; i < desc->tp_class->nr_fields; i++) {
3857 const struct lttng_kernel_event_field *field = desc->tp_class->fields[i];
3858
3859 ret = _lttng_field_statedump(session, field, 2, &prev_field_name);
3860 if (ret)
3861 return ret;
3862 }
3863 return ret;
3864 }
3865
3866 /*
3867 * Must be called with sessions_mutex held.
3868 * The entire event metadata is printed as a single atomic metadata
3869 * transaction.
3870 */
3871 static
3872 int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common *event)
3873 {
3874 struct lttng_kernel_event_recorder *event_recorder;
3875 struct lttng_kernel_channel_buffer *chan;
3876 struct lttng_kernel_session *session;
3877 int ret = 0;
3878
3879 if (event->type != LTTNG_KERNEL_EVENT_TYPE_RECORDER)
3880 return 0;
3881 event_recorder = container_of(event, struct lttng_kernel_event_recorder, parent);
3882 chan = event_recorder->chan;
3883 session = chan->parent.session;
3884
3885 if (event_recorder->priv->metadata_dumped || !LTTNG_READ_ONCE(session->active))
3886 return 0;
3887 if (chan->priv->channel_type == METADATA_CHANNEL)
3888 return 0;
3889
3890 lttng_metadata_begin(session);
3891
3892 ret = lttng_metadata_printf(session,
3893 "event {\n"
3894 " name = \"%s\";\n"
3895 " id = %llu;\n"
3896 " stream_id = %u;\n",
3897 event_recorder->priv->parent.parent.desc->event_name,
3898 event_recorder->priv->parent.id,
3899 event_recorder->chan->priv->id);
3900 if (ret)
3901 goto end;
3902
3903 ret = lttng_metadata_printf(session,
3904 " fields := struct {\n"
3905 );
3906 if (ret)
3907 goto end;
3908
3909 ret = _lttng_fields_metadata_statedump(session, event_recorder);
3910 if (ret)
3911 goto end;
3912
3913 /*
3914 * LTTng space reservation can only reserve multiples of the
3915 * byte size.
3916 */
3917 ret = lttng_metadata_printf(session,
3918 " };\n"
3919 "};\n\n");
3920 if (ret)
3921 goto end;
3922
3923 event_recorder->priv->metadata_dumped = 1;
3924 end:
3925 lttng_metadata_end(session);
3926 return ret;
3927
3928 }
3929
3930 /*
3931 * Must be called with sessions_mutex held.
3932 * The entire channel metadata is printed as a single atomic metadata
3933 * transaction.
3934 */
3935 static
3936 int _lttng_channel_metadata_statedump(struct lttng_kernel_session *session,
3937 struct lttng_kernel_channel_buffer *chan)
3938 {
3939 int ret = 0;
3940
3941 if (chan->priv->metadata_dumped || !LTTNG_READ_ONCE(session->active))
3942 return 0;
3943
3944 if (chan->priv->channel_type == METADATA_CHANNEL)
3945 return 0;
3946
3947 lttng_metadata_begin(session);
3948
3949 WARN_ON_ONCE(!chan->priv->header_type);
3950 ret = lttng_metadata_printf(session,
3951 "stream {\n"
3952 " id = %u;\n"
3953 " event.header := %s;\n"
3954 " packet.context := struct packet_context;\n",
3955 chan->priv->id,
3956 chan->priv->header_type == 1 ? "struct event_header_compact" :
3957 "struct event_header_large");
3958 if (ret)
3959 goto end;
3960
3961 if (chan->priv->ctx) {
3962 ret = lttng_metadata_printf(session,
3963 " event.context := struct {\n");
3964 if (ret)
3965 goto end;
3966 }
3967 ret = _lttng_context_metadata_statedump(session, chan->priv->ctx);
3968 if (ret)
3969 goto end;
3970 if (chan->priv->ctx) {
3971 ret = lttng_metadata_printf(session,
3972 " };\n");
3973 if (ret)
3974 goto end;
3975 }
3976
3977 ret = lttng_metadata_printf(session,
3978 "};\n\n");
3979
3980 chan->priv->metadata_dumped = 1;
3981 end:
3982 lttng_metadata_end(session);
3983 return ret;
3984 }
3985
3986 /*
3987 * Must be called with sessions_mutex held.
3988 */
3989 static
3990 int _lttng_stream_packet_context_declare(struct lttng_kernel_session *session)
3991 {
3992 return lttng_metadata_printf(session,
3993 "struct packet_context {\n"
3994 " uint64_clock_monotonic_t timestamp_begin;\n"
3995 " uint64_clock_monotonic_t timestamp_end;\n"
3996 " uint64_t content_size;\n"
3997 " uint64_t packet_size;\n"
3998 " uint64_t packet_seq_num;\n"
3999 " unsigned long events_discarded;\n"
4000 " uint32_t cpu_id;\n"
4001 "};\n\n"
4002 );
4003 }
4004
4005 /*
4006 * Compact header:
4007 * id: range: 0 - 30.
4008 * id 31 is reserved to indicate an extended header.
4009 *
4010 * Large header:
4011 * id: range: 0 - 65534.
4012 * id 65535 is reserved to indicate an extended header.
4013 *
4014 * Must be called with sessions_mutex held.
4015 */
4016 static
4017 int _lttng_event_header_declare(struct lttng_kernel_session *session)
4018 {
4019 return lttng_metadata_printf(session,
4020 "struct event_header_compact {\n"
4021 " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
4022 " variant <id> {\n"
4023 " struct {\n"
4024 " uint27_clock_monotonic_t timestamp;\n"
4025 " } compact;\n"
4026 " struct {\n"
4027 " uint32_t id;\n"
4028 " uint64_clock_monotonic_t timestamp;\n"
4029 " } extended;\n"
4030 " } v;\n"
4031 "} align(%u);\n"
4032 "\n"
4033 "struct event_header_large {\n"
4034 " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
4035 " variant <id> {\n"
4036 " struct {\n"
4037 " uint32_clock_monotonic_t timestamp;\n"
4038 " } compact;\n"
4039 " struct {\n"
4040 " uint32_t id;\n"
4041 " uint64_clock_monotonic_t timestamp;\n"
4042 " } extended;\n"
4043 " } v;\n"
4044 "} align(%u);\n\n",
4045 lttng_alignof(uint32_t) * CHAR_BIT,
4046 lttng_alignof(uint16_t) * CHAR_BIT
4047 );
4048 }
4049
4050 /*
4051 * Approximation of NTP time of day to clock monotonic correlation,
4052 * taken at start of trace.
4053 * Yes, this is only an approximation. Yes, we can (and will) do better
4054 * in future versions.
4055 * This function may return a negative offset. It may happen if the
4056 * system sets the REALTIME clock to 0 after boot.
4057 *
4058 * Use 64bit timespec on kernels that have it, this makes 32bit arch
4059 * y2038 compliant.
4060 */
4061 static
4062 int64_t measure_clock_offset(void)
4063 {
4064 uint64_t monotonic_avg, monotonic[2], realtime;
4065 uint64_t tcf = trace_clock_freq();
4066 int64_t offset;
4067 unsigned long flags;
4068 struct timespec64 rts = { 0, 0 };
4069
4070 /* Disable interrupts to increase correlation precision. */
4071 local_irq_save(flags);
4072 monotonic[0] = trace_clock_read64();
4073 ktime_get_real_ts64(&rts);
4074 monotonic[1] = trace_clock_read64();
4075 local_irq_restore(flags);
4076
4077 monotonic_avg = (monotonic[0] + monotonic[1]) >> 1;
4078 realtime = (uint64_t) rts.tv_sec * tcf;
4079 if (tcf == NSEC_PER_SEC) {
4080 realtime += rts.tv_nsec;
4081 } else {
4082 uint64_t n = rts.tv_nsec * tcf;
4083
4084 do_div(n, NSEC_PER_SEC);
4085 realtime += n;
4086 }
4087 offset = (int64_t) realtime - monotonic_avg;
4088 return offset;
4089 }
4090
4091 static
4092 int print_escaped_ctf_string(struct lttng_kernel_session *session, const char *string)
4093 {
4094 int ret = 0;
4095 size_t i;
4096 char cur;
4097
4098 i = 0;
4099 cur = string[i];
4100 while (cur != '\0') {
4101 switch (cur) {
4102 case '\n':
4103 ret = lttng_metadata_printf(session, "%s", "\\n");
4104 break;
4105 case '\\':
4106 case '"':
4107 ret = lttng_metadata_printf(session, "%c", '\\');
4108 if (ret)
4109 goto error;
4110 /* We still print the current char */
4111 lttng_fallthrough;
4112 default:
4113 ret = lttng_metadata_printf(session, "%c", cur);
4114 break;
4115 }
4116
4117 if (ret)
4118 goto error;
4119
4120 cur = string[++i];
4121 }
4122 error:
4123 return ret;
4124 }
4125
4126 static
4127 int print_metadata_escaped_field(struct lttng_kernel_session *session, const char *field,
4128 const char *field_value)
4129 {
4130 int ret;
4131
4132 ret = lttng_metadata_printf(session, " %s = \"", field);
4133 if (ret)
4134 goto error;
4135
4136 ret = print_escaped_ctf_string(session, field_value);
4137 if (ret)
4138 goto error;
4139
4140 ret = lttng_metadata_printf(session, "\";\n");
4141
4142 error:
4143 return ret;
4144 }
4145
4146 /*
4147 * Output metadata into this session's metadata buffers.
4148 * Must be called with sessions_mutex held.
4149 */
4150 static
4151 int _lttng_session_metadata_statedump(struct lttng_kernel_session *session)
4152 {
4153 unsigned char *uuid_c = session->priv->uuid.b;
4154 unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN];
4155 const char *product_uuid;
4156 struct lttng_kernel_channel_common_private *chan_priv;
4157 struct lttng_kernel_event_recorder_private *event_recorder_priv;
4158 int ret = 0;
4159
4160 if (!LTTNG_READ_ONCE(session->active))
4161 return 0;
4162
4163 lttng_metadata_begin(session);
4164
4165 if (session->priv->metadata_dumped)
4166 goto skip_session;
4167
4168 snprintf(uuid_s, sizeof(uuid_s),
4169 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
4170 uuid_c[0], uuid_c[1], uuid_c[2], uuid_c[3],
4171 uuid_c[4], uuid_c[5], uuid_c[6], uuid_c[7],
4172 uuid_c[8], uuid_c[9], uuid_c[10], uuid_c[11],
4173 uuid_c[12], uuid_c[13], uuid_c[14], uuid_c[15]);
4174
4175 ret = lttng_metadata_printf(session,
4176 "typealias integer { size = 8; align = %u; signed = false; } := uint8_t;\n"
4177 "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n"
4178 "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n"
4179 "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n"
4180 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
4181 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
4182 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
4183 "\n"
4184 "trace {\n"
4185 " major = %u;\n"
4186 " minor = %u;\n"
4187 " uuid = \"%s\";\n"
4188 " byte_order = %s;\n"
4189 " packet.header := struct {\n"
4190 " uint32_t magic;\n"
4191 " uint8_t uuid[16];\n"
4192 " uint32_t stream_id;\n"
4193 " uint64_t stream_instance_id;\n"
4194 " };\n"
4195 "};\n\n",
4196 lttng_alignof(uint8_t) * CHAR_BIT,
4197 lttng_alignof(uint16_t) * CHAR_BIT,
4198 lttng_alignof(uint32_t) * CHAR_BIT,
4199 lttng_alignof(uint64_t) * CHAR_BIT,
4200 sizeof(unsigned long) * CHAR_BIT,
4201 lttng_alignof(unsigned long) * CHAR_BIT,
4202 CTF_SPEC_MAJOR,
4203 CTF_SPEC_MINOR,
4204 uuid_s,
4205 #if __BYTE_ORDER == __BIG_ENDIAN
4206 "be"
4207 #else
4208 "le"
4209 #endif
4210 );
4211 if (ret)
4212 goto end;
4213
4214 ret = lttng_metadata_printf(session,
4215 "env {\n"
4216 " hostname = \"%s\";\n"
4217 " domain = \"kernel\";\n"
4218 " sysname = \"%s\";\n"
4219 " kernel_release = \"%s\";\n"
4220 " kernel_version = \"%s\";\n"
4221 " tracer_name = \"lttng-modules\";\n"
4222 " tracer_major = %d;\n"
4223 " tracer_minor = %d;\n"
4224 " tracer_patchlevel = %d;\n"
4225 " trace_buffering_scheme = \"global\";\n",
4226 current->nsproxy->uts_ns->name.nodename,
4227 utsname()->sysname,
4228 utsname()->release,
4229 utsname()->version,
4230 LTTNG_MODULES_MAJOR_VERSION,
4231 LTTNG_MODULES_MINOR_VERSION,
4232 LTTNG_MODULES_PATCHLEVEL_VERSION
4233 );
4234 if (ret)
4235 goto end;
4236
4237 ret = print_metadata_escaped_field(session, "trace_name", session->priv->name);
4238 if (ret)
4239 goto end;
4240 ret = print_metadata_escaped_field(session, "trace_creation_datetime",
4241 session->priv->creation_time);
4242 if (ret)
4243 goto end;
4244
4245 /* Add the product UUID to the 'env' section */
4246 product_uuid = dmi_get_system_info(DMI_PRODUCT_UUID);
4247 if (product_uuid) {
4248 ret = lttng_metadata_printf(session,
4249 " product_uuid = \"%s\";\n",
4250 product_uuid
4251 );
4252 if (ret)
4253 goto end;
4254 }
4255
4256 /* Close the 'env' section */
4257 ret = lttng_metadata_printf(session, "};\n\n");
4258 if (ret)
4259 goto end;
4260
4261 ret = lttng_metadata_printf(session,
4262 "clock {\n"
4263 " name = \"%s\";\n",
4264 trace_clock_name()
4265 );
4266 if (ret)
4267 goto end;
4268
4269 if (!trace_clock_uuid(clock_uuid_s)) {
4270 ret = lttng_metadata_printf(session,
4271 " uuid = \"%s\";\n",
4272 clock_uuid_s
4273 );
4274 if (ret)
4275 goto end;
4276 }
4277
4278 ret = lttng_metadata_printf(session,
4279 " description = \"%s\";\n"
4280 " freq = %llu; /* Frequency, in Hz */\n"
4281 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
4282 " offset = %lld;\n"
4283 "};\n\n",
4284 trace_clock_description(),
4285 (unsigned long long) trace_clock_freq(),
4286 (long long) measure_clock_offset()
4287 );
4288 if (ret)
4289 goto end;
4290
4291 ret = lttng_metadata_printf(session,
4292 "typealias integer {\n"
4293 " size = 27; align = 1; signed = false;\n"
4294 " map = clock.%s.value;\n"
4295 "} := uint27_clock_monotonic_t;\n"
4296 "\n"
4297 "typealias integer {\n"
4298 " size = 32; align = %u; signed = false;\n"
4299 " map = clock.%s.value;\n"
4300 "} := uint32_clock_monotonic_t;\n"
4301 "\n"
4302 "typealias integer {\n"
4303 " size = 64; align = %u; signed = false;\n"
4304 " map = clock.%s.value;\n"
4305 "} := uint64_clock_monotonic_t;\n\n",
4306 trace_clock_name(),
4307 lttng_alignof(uint32_t) * CHAR_BIT,
4308 trace_clock_name(),
4309 lttng_alignof(uint64_t) * CHAR_BIT,
4310 trace_clock_name()
4311 );
4312 if (ret)
4313 goto end;
4314
4315 ret = _lttng_stream_packet_context_declare(session);
4316 if (ret)
4317 goto end;
4318
4319 ret = _lttng_event_header_declare(session);
4320 if (ret)
4321 goto end;
4322
4323 skip_session:
4324 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
4325 struct lttng_kernel_channel_buffer_private *chan_buf_priv;
4326
4327 if (chan_priv->pub->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER)
4328 continue;
4329 chan_buf_priv = container_of(chan_priv, struct lttng_kernel_channel_buffer_private, parent);
4330 ret = _lttng_channel_metadata_statedump(session, chan_buf_priv->pub);
4331 if (ret)
4332 goto end;
4333 }
4334
4335 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node) {
4336 ret = _lttng_event_recorder_metadata_statedump(&event_recorder_priv->pub->parent);
4337 if (ret)
4338 goto end;
4339 }
4340 session->priv->metadata_dumped = 1;
4341 end:
4342 lttng_metadata_end(session);
4343 return ret;
4344 }
4345
4346 /**
4347 * lttng_transport_register - LTT transport registration
4348 * @transport: transport structure
4349 *
4350 * Registers a transport which can be used as output to extract the data out of
4351 * LTTng. The module calling this registration function must ensure that no
4352 * trap-inducing code will be executed by the transport functions. E.g.
4353 * vmalloc_sync_mappings() must be called between a vmalloc and the moment the memory
4354 * is made visible to the transport function. This registration acts as a
4355 * vmalloc_sync_mappings. Therefore, only if the module allocates virtual memory
4356 * after its registration must it synchronize the TLBs.
4357 */
4358 void lttng_transport_register(struct lttng_transport *transport)
4359 {
4360 /*
4361 * Make sure no page fault can be triggered by the module about to be
4362 * registered. We deal with this here so we don't have to call
4363 * vmalloc_sync_mappings() in each module's init.
4364 */
4365 wrapper_vmalloc_sync_mappings();
4366
4367 mutex_lock(&sessions_mutex);
4368 list_add_tail(&transport->node, &lttng_transport_list);
4369 mutex_unlock(&sessions_mutex);
4370 }
4371 EXPORT_SYMBOL_GPL(lttng_transport_register);
4372
4373 /**
4374 * lttng_transport_unregister - LTT transport unregistration
4375 * @transport: transport structure
4376 */
4377 void lttng_transport_unregister(struct lttng_transport *transport)
4378 {
4379 mutex_lock(&sessions_mutex);
4380 list_del(&transport->node);
4381 mutex_unlock(&sessions_mutex);
4382 }
4383 EXPORT_SYMBOL_GPL(lttng_transport_unregister);
4384
4385 void lttng_counter_transport_register(struct lttng_counter_transport *transport)
4386 {
4387 /*
4388 * Make sure no page fault can be triggered by the module about to be
4389 * registered. We deal with this here so we don't have to call
4390 * vmalloc_sync_mappings() in each module's init.
4391 */
4392 wrapper_vmalloc_sync_mappings();
4393
4394 mutex_lock(&sessions_mutex);
4395 list_add_tail(&transport->node, &lttng_counter_transport_list);
4396 mutex_unlock(&sessions_mutex);
4397 }
4398 EXPORT_SYMBOL_GPL(lttng_counter_transport_register);
4399
4400 void lttng_counter_transport_unregister(struct lttng_counter_transport *transport)
4401 {
4402 mutex_lock(&sessions_mutex);
4403 list_del(&transport->node);
4404 mutex_unlock(&sessions_mutex);
4405 }
4406 EXPORT_SYMBOL_GPL(lttng_counter_transport_unregister);
4407
4408 struct lttng_kernel_channel_buffer *lttng_kernel_alloc_channel_buffer(void)
4409 {
4410 struct lttng_kernel_channel_buffer *lttng_chan_buf;
4411 struct lttng_kernel_channel_common *lttng_chan_common;
4412 struct lttng_kernel_channel_buffer_private *lttng_chan_buf_priv;
4413
4414 lttng_chan_buf = kzalloc(sizeof(struct lttng_kernel_channel_buffer), GFP_KERNEL);
4415 if (!lttng_chan_buf)
4416 goto nomem;
4417 lttng_chan_buf_priv = kzalloc(sizeof(struct lttng_kernel_channel_buffer_private), GFP_KERNEL);
4418 if (!lttng_chan_buf_priv)
4419 goto nomem_priv;
4420 lttng_chan_common = &lttng_chan_buf->parent;
4421 lttng_chan_common->type = LTTNG_KERNEL_CHANNEL_TYPE_BUFFER;
4422 lttng_chan_buf->priv = lttng_chan_buf_priv;
4423 lttng_chan_common->priv = &lttng_chan_buf_priv->parent;
4424 lttng_chan_buf_priv->pub = lttng_chan_buf;
4425 lttng_chan_buf_priv->parent.pub = lttng_chan_common;
4426 return lttng_chan_buf;
4427
4428 nomem_priv:
4429 kfree(lttng_chan_buf);
4430 nomem:
4431 return NULL;
4432 }
4433 EXPORT_SYMBOL_GPL(lttng_kernel_alloc_channel_buffer);
4434
4435 struct lttng_kernel_channel_counter *lttng_kernel_alloc_channel_counter(void)
4436 {
4437 struct lttng_kernel_channel_counter *lttng_chan_counter;
4438 struct lttng_kernel_channel_common *lttng_chan_common;
4439 struct lttng_kernel_channel_counter_private *lttng_chan_counter_priv;
4440
4441 lttng_chan_counter = kzalloc(sizeof(struct lttng_kernel_channel_counter), GFP_KERNEL);
4442 if (!lttng_chan_counter)
4443 goto nomem;
4444 lttng_chan_counter_priv = kzalloc(sizeof(struct lttng_kernel_channel_counter_private), GFP_KERNEL);
4445 if (!lttng_chan_counter_priv)
4446 goto nomem_priv;
4447 lttng_chan_common = &lttng_chan_counter->parent;
4448 lttng_chan_common->type = LTTNG_KERNEL_CHANNEL_TYPE_COUNTER;
4449 lttng_chan_counter->priv = lttng_chan_counter_priv;
4450 lttng_chan_common->priv = &lttng_chan_counter_priv->parent;
4451 lttng_chan_counter_priv->pub = lttng_chan_counter;
4452 lttng_chan_counter_priv->parent.pub = lttng_chan_common;
4453 return lttng_chan_counter;
4454
4455 nomem_priv:
4456 kfree(lttng_chan_counter);
4457 nomem:
4458 return NULL;
4459 }
4460 EXPORT_SYMBOL_GPL(lttng_kernel_alloc_channel_counter);
4461
4462 void lttng_kernel_free_channel_common(struct lttng_kernel_channel_common *chan)
4463 {
4464 switch (chan->type) {
4465 case LTTNG_KERNEL_CHANNEL_TYPE_BUFFER:
4466 {
4467 struct lttng_kernel_channel_buffer *chan_buf = container_of(chan,
4468 struct lttng_kernel_channel_buffer, parent);
4469
4470 kfree(chan_buf->priv);
4471 kfree(chan_buf);
4472 break;
4473 }
4474 case LTTNG_KERNEL_CHANNEL_TYPE_COUNTER:
4475 {
4476 struct lttng_kernel_channel_counter *chan_counter = container_of(chan,
4477 struct lttng_kernel_channel_counter, parent);
4478
4479 kfree(chan_counter->priv);
4480 kfree(chan_counter);
4481 break;
4482 }
4483 default:
4484 WARN_ON_ONCE(1);
4485 }
4486 }
4487 EXPORT_SYMBOL_GPL(lttng_kernel_free_channel_common);
4488
4489 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0))
4490
4491 enum cpuhp_state lttng_hp_prepare;
4492 enum cpuhp_state lttng_hp_online;
4493
4494 static int lttng_hotplug_prepare(unsigned int cpu, struct hlist_node *node)
4495 {
4496 struct lttng_cpuhp_node *lttng_node;
4497
4498 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
4499 switch (lttng_node->component) {
4500 case LTTNG_RING_BUFFER_FRONTEND:
4501 return 0;
4502 case LTTNG_RING_BUFFER_BACKEND:
4503 return lttng_cpuhp_rb_backend_prepare(cpu, lttng_node);
4504 case LTTNG_RING_BUFFER_ITER:
4505 return 0;
4506 case LTTNG_CONTEXT_PERF_COUNTERS:
4507 return 0;
4508 default:
4509 return -EINVAL;
4510 }
4511 }
4512
4513 static int lttng_hotplug_dead(unsigned int cpu, struct hlist_node *node)
4514 {
4515 struct lttng_cpuhp_node *lttng_node;
4516
4517 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
4518 switch (lttng_node->component) {
4519 case LTTNG_RING_BUFFER_FRONTEND:
4520 return lttng_cpuhp_rb_frontend_dead(cpu, lttng_node);
4521 case LTTNG_RING_BUFFER_BACKEND:
4522 return 0;
4523 case LTTNG_RING_BUFFER_ITER:
4524 return 0;
4525 case LTTNG_CONTEXT_PERF_COUNTERS:
4526 return lttng_cpuhp_perf_counter_dead(cpu, lttng_node);
4527 default:
4528 return -EINVAL;
4529 }
4530 }
4531
4532 static int lttng_hotplug_online(unsigned int cpu, struct hlist_node *node)
4533 {
4534 struct lttng_cpuhp_node *lttng_node;
4535
4536 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
4537 switch (lttng_node->component) {
4538 case LTTNG_RING_BUFFER_FRONTEND:
4539 return lttng_cpuhp_rb_frontend_online(cpu, lttng_node);
4540 case LTTNG_RING_BUFFER_BACKEND:
4541 return 0;
4542 case LTTNG_RING_BUFFER_ITER:
4543 return lttng_cpuhp_rb_iter_online(cpu, lttng_node);
4544 case LTTNG_CONTEXT_PERF_COUNTERS:
4545 return lttng_cpuhp_perf_counter_online(cpu, lttng_node);
4546 default:
4547 return -EINVAL;
4548 }
4549 }
4550
4551 static int lttng_hotplug_offline(unsigned int cpu, struct hlist_node *node)
4552 {
4553 struct lttng_cpuhp_node *lttng_node;
4554
4555 lttng_node = container_of(node, struct lttng_cpuhp_node, node);
4556 switch (lttng_node->component) {
4557 case LTTNG_RING_BUFFER_FRONTEND:
4558 return lttng_cpuhp_rb_frontend_offline(cpu, lttng_node);
4559 case LTTNG_RING_BUFFER_BACKEND:
4560 return 0;
4561 case LTTNG_RING_BUFFER_ITER:
4562 return 0;
4563 case LTTNG_CONTEXT_PERF_COUNTERS:
4564 return 0;
4565 default:
4566 return -EINVAL;
4567 }
4568 }
4569
4570 static int __init lttng_init_cpu_hotplug(void)
4571 {
4572 int ret;
4573
4574 ret = cpuhp_setup_state_multi(CPUHP_BP_PREPARE_DYN, "lttng:prepare",
4575 lttng_hotplug_prepare,
4576 lttng_hotplug_dead);
4577 if (ret < 0) {
4578 return ret;
4579 }
4580 lttng_hp_prepare = ret;
4581 lttng_rb_set_hp_prepare(ret);
4582
4583 ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "lttng:online",
4584 lttng_hotplug_online,
4585 lttng_hotplug_offline);
4586 if (ret < 0) {
4587 cpuhp_remove_multi_state(lttng_hp_prepare);
4588 lttng_hp_prepare = 0;
4589 return ret;
4590 }
4591 lttng_hp_online = ret;
4592 lttng_rb_set_hp_online(ret);
4593
4594 return 0;
4595 }
4596
4597 static void __exit lttng_exit_cpu_hotplug(void)
4598 {
4599 lttng_rb_set_hp_online(0);
4600 cpuhp_remove_multi_state(lttng_hp_online);
4601 lttng_rb_set_hp_prepare(0);
4602 cpuhp_remove_multi_state(lttng_hp_prepare);
4603 }
4604
4605 #else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
4606 static int lttng_init_cpu_hotplug(void)
4607 {
4608 return 0;
4609 }
4610 static void lttng_exit_cpu_hotplug(void)
4611 {
4612 }
4613 #endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
4614
4615 static int __init lttng_events_init(void)
4616 {
4617 int ret;
4618
4619 ret = wrapper_get_pfnblock_flags_mask_init();
4620 if (ret)
4621 return ret;
4622 ret = lttng_probes_init();
4623 if (ret)
4624 return ret;
4625 ret = lttng_context_init();
4626 if (ret)
4627 return ret;
4628 ret = lttng_tracepoint_init();
4629 if (ret)
4630 goto error_tp;
4631 event_recorder_cache = KMEM_CACHE(lttng_kernel_event_recorder, 0);
4632 if (!event_recorder_cache) {
4633 ret = -ENOMEM;
4634 goto error_kmem_event_recorder;
4635 }
4636 event_recorder_private_cache = KMEM_CACHE(lttng_kernel_event_recorder_private, 0);
4637 if (!event_recorder_private_cache) {
4638 ret = -ENOMEM;
4639 goto error_kmem_event_recorder_private;
4640 }
4641 event_counter_cache = KMEM_CACHE(lttng_kernel_event_counter, 0);
4642 if (!event_counter_cache) {
4643 ret = -ENOMEM;
4644 goto error_kmem_event_counter;
4645 }
4646 event_counter_private_cache = KMEM_CACHE(lttng_kernel_event_counter_private, 0);
4647 if (!event_counter_private_cache) {
4648 ret = -ENOMEM;
4649 goto error_kmem_event_counter_private;
4650 }
4651 event_notifier_cache = KMEM_CACHE(lttng_kernel_event_notifier, 0);
4652 if (!event_notifier_cache) {
4653 ret = -ENOMEM;
4654 goto error_kmem_event_notifier;
4655 }
4656 event_notifier_private_cache = KMEM_CACHE(lttng_kernel_event_notifier_private, 0);
4657 if (!event_notifier_private_cache) {
4658 ret = -ENOMEM;
4659 goto error_kmem_event_notifier_private;
4660 }
4661 ret = lttng_abi_init();
4662 if (ret)
4663 goto error_abi;
4664 ret = lttng_logger_init();
4665 if (ret)
4666 goto error_logger;
4667 ret = lttng_init_cpu_hotplug();
4668 if (ret)
4669 goto error_hotplug;
4670 printk(KERN_NOTICE "LTTng: Loaded modules v%s.%s.%s%s (%s)%s%s\n",
4671 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4672 __stringify(LTTNG_MODULES_MINOR_VERSION),
4673 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4674 LTTNG_MODULES_EXTRAVERSION,
4675 LTTNG_VERSION_NAME,
4676 #ifdef LTTNG_EXTRA_VERSION_GIT
4677 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
4678 #else
4679 "",
4680 #endif
4681 #ifdef LTTNG_EXTRA_VERSION_NAME
4682 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
4683 #else
4684 "");
4685 #endif
4686 #ifdef CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM
4687 printk(KERN_NOTICE "LTTng: Experimental bitwise enum enabled.\n");
4688 #endif /* CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM */
4689 return 0;
4690
4691 error_hotplug:
4692 lttng_logger_exit();
4693 error_logger:
4694 lttng_abi_exit();
4695 error_abi:
4696 kmem_cache_destroy(event_notifier_private_cache);
4697 error_kmem_event_notifier_private:
4698 kmem_cache_destroy(event_notifier_cache);
4699 error_kmem_event_notifier:
4700 kmem_cache_destroy(event_counter_private_cache);
4701 error_kmem_event_counter_private:
4702 kmem_cache_destroy(event_counter_cache);
4703 error_kmem_event_counter:
4704 kmem_cache_destroy(event_recorder_private_cache);
4705 error_kmem_event_recorder_private:
4706 kmem_cache_destroy(event_recorder_cache);
4707 error_kmem_event_recorder:
4708 lttng_tracepoint_exit();
4709 error_tp:
4710 lttng_context_exit();
4711 printk(KERN_NOTICE "LTTng: Failed to load modules v%s.%s.%s%s (%s)%s%s\n",
4712 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4713 __stringify(LTTNG_MODULES_MINOR_VERSION),
4714 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4715 LTTNG_MODULES_EXTRAVERSION,
4716 LTTNG_VERSION_NAME,
4717 #ifdef LTTNG_EXTRA_VERSION_GIT
4718 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
4719 #else
4720 "",
4721 #endif
4722 #ifdef LTTNG_EXTRA_VERSION_NAME
4723 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
4724 #else
4725 "");
4726 #endif
4727 return ret;
4728 }
4729
4730 module_init(lttng_events_init);
4731
4732 static void __exit lttng_events_exit(void)
4733 {
4734 struct lttng_kernel_session_private *session_priv, *tmpsession_priv;
4735
4736 lttng_exit_cpu_hotplug();
4737 lttng_logger_exit();
4738 lttng_abi_exit();
4739 list_for_each_entry_safe(session_priv, tmpsession_priv, &sessions, node)
4740 lttng_session_destroy(session_priv->pub);
4741 kmem_cache_destroy(event_recorder_cache);
4742 kmem_cache_destroy(event_recorder_private_cache);
4743 kmem_cache_destroy(event_counter_cache);
4744 kmem_cache_destroy(event_counter_private_cache);
4745 kmem_cache_destroy(event_notifier_cache);
4746 kmem_cache_destroy(event_notifier_private_cache);
4747 lttng_tracepoint_exit();
4748 lttng_context_exit();
4749 printk(KERN_NOTICE "LTTng: Unloaded modules v%s.%s.%s%s (%s)%s%s\n",
4750 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4751 __stringify(LTTNG_MODULES_MINOR_VERSION),
4752 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4753 LTTNG_MODULES_EXTRAVERSION,
4754 LTTNG_VERSION_NAME,
4755 #ifdef LTTNG_EXTRA_VERSION_GIT
4756 LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
4757 #else
4758 "",
4759 #endif
4760 #ifdef LTTNG_EXTRA_VERSION_NAME
4761 LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
4762 #else
4763 "");
4764 #endif
4765 }
4766
4767 module_exit(lttng_events_exit);
4768
4769 #include <generated/patches.h>
4770 #ifdef LTTNG_EXTRA_VERSION_GIT
4771 MODULE_INFO(extra_version_git, LTTNG_EXTRA_VERSION_GIT);
4772 #endif
4773 #ifdef LTTNG_EXTRA_VERSION_NAME
4774 MODULE_INFO(extra_version_name, LTTNG_EXTRA_VERSION_NAME);
4775 #endif
4776 MODULE_LICENSE("GPL and additional rights");
4777 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
4778 MODULE_DESCRIPTION("LTTng tracer");
4779 MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
4780 __stringify(LTTNG_MODULES_MINOR_VERSION) "."
4781 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
4782 LTTNG_MODULES_EXTRAVERSION);
This page took 0.144307 seconds and 5 git commands to generate.