Fix: scsi: sd: Atomic write support added in 6.11-rc1
[lttng-modules.git] / src / lttng-events.c
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
9f36eaed 2 *
a90917c3 3 * lttng-events.c
4e3c1b9b 4 *
4e3c1b9b 5 * Holds LTTng per-session event registry.
17baffe2 6 *
886d51a3 7 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4e3c1b9b
MD
8 */
9
389d7070
MD
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
4e3c1b9b 16#include <linux/module.h>
c0e31d2e
MD
17#include <linux/mutex.h>
18#include <linux/sched.h>
11b5a3c2 19#include <linux/slab.h>
c099397a 20#include <linux/jiffies.h>
99dc9597 21#include <linux/utsname.h>
abc0446a 22#include <linux/err.h>
7e6f9ef6
MD
23#include <linux/seq_file.h>
24#include <linux/file.h>
25#include <linux/anon_inodes.h>
8c6e7f13 26#include <linux/uaccess.h>
a606b6e8 27#include <linux/vmalloc.h>
c88f762e 28#include <linux/dmi.h>
3c997079 29
c190d76e 30#include <wrapper/compiler_attributes.h>
a7008254 31#include <wrapper/uuid.h>
263b6c88 32#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
241ae9a8
MD
33#include <wrapper/random.h>
34#include <wrapper/tracepoint.h>
35#include <wrapper/list.h>
cbc19040 36#include <wrapper/types.h>
2df37e95
MD
37#include <lttng/kernel-version.h>
38#include <lttng/events.h>
92bc1e23 39#include <lttng/events-internal.h>
0b365677 40#include <lttng/lttng-bytecode.h>
2df37e95 41#include <lttng/tracer.h>
21f58fb7 42#include <lttng/event-notifier-notification.h>
2df37e95
MD
43#include <lttng/abi-old.h>
44#include <lttng/endian.h>
45#include <lttng/string-utils.h>
4a11ef1c 46#include <lttng/utils.h>
1cabf4f1 47#include <counter/counter.h>
24591303
MD
48#include <ringbuffer/backend.h>
49#include <ringbuffer/frontend.h>
4e3c1b9b 50
9f2d2694
MJ
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))
5987e66c
MJ
53#include <linux/stdarg.h>
54#else
55#include <stdarg.h>
56#endif
57
d83004aa
JD
58#define METADATA_CACHE_DEFAULT_SIZE 4096
59
4e3c1b9b 60static LIST_HEAD(sessions);
750b05f2 61static LIST_HEAD(event_notifier_groups);
a90917c3 62static LIST_HEAD(lttng_transport_list);
a101fa10 63static LIST_HEAD(lttng_counter_transport_list);
d83004aa
JD
64/*
65 * Protect the sessions and metadata caches.
66 */
4e3c1b9b 67static DEFINE_MUTEX(sessions_mutex);
a67ba386
MD
68static struct kmem_cache *event_recorder_cache;
69static struct kmem_cache *event_recorder_private_cache;
062a5f00
MD
70static struct kmem_cache *event_counter_cache;
71static struct kmem_cache *event_counter_private_cache;
dffef45d 72static struct kmem_cache *event_notifier_cache;
a67ba386 73static struct kmem_cache *event_notifier_private_cache;
4e3c1b9b 74
8cdc1a81
MD
75static void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session);
76static void lttng_session_sync_event_enablers(struct lttng_kernel_session *session);
b01155ba 77static void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group);
7b25ab0e 78static void lttng_event_enabler_sync(struct lttng_event_enabler_common *event_enabler);
3c997079 79
0648898e 80static void _lttng_event_destroy(struct lttng_kernel_event_common *event);
2ff86ce2 81static void _lttng_channel_destroy(struct lttng_kernel_channel_common *chan);
6a338ba4 82static void _lttng_event_unregister(struct lttng_kernel_event_common *event);
c099397a 83static
ee7e9a18 84int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common *event);
c099397a 85static
8cdc1a81 86int _lttng_session_metadata_statedump(struct lttng_kernel_session *session);
d83004aa
JD
87static
88void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream);
f513b2bf 89static
8cdc1a81 90int _lttng_type_statedump(struct lttng_kernel_session *session,
437d5aa5
MD
91 const struct lttng_kernel_type_common *type,
92 enum lttng_kernel_string_encoding parent_encoding,
ceabb767
MD
93 size_t nesting);
94static
8cdc1a81 95int _lttng_field_statedump(struct lttng_kernel_session *session,
437d5aa5 96 const struct lttng_kernel_event_field *field,
51ef4536 97 size_t nesting, const char **prev_field_name_p);
c099397a 98
c099397a 99void synchronize_trace(void)
abcca994 100{
05355f0b
MJ
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))
92da05ce
MJ
103 synchronize_rcu();
104#else
abcca994 105 synchronize_sched();
92da05ce
MJ
106#endif
107
b8590f40
MD
108#ifdef CONFIG_PREEMPT_RT_FULL
109 synchronize_rcu();
110#endif
abcca994
MD
111}
112
3c997079
MD
113void lttng_lock_sessions(void)
114{
115 mutex_lock(&sessions_mutex);
116}
117
118void lttng_unlock_sessions(void)
119{
120 mutex_unlock(&sessions_mutex);
121}
122
9fe593d2
FD
123static 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
3c997079
MD
134/*
135 * Called with sessions lock held.
136 */
137int lttng_session_active(void)
138{
8cdc1a81 139 struct lttng_kernel_session_private *iter;
3c997079 140
24909af2 141 list_for_each_entry(iter, &sessions, node) {
8cdc1a81 142 if (iter->pub->active)
3c997079
MD
143 return 1;
144 }
145 return 0;
146}
147
8cdc1a81 148struct lttng_kernel_session *lttng_session_create(void)
4e3c1b9b 149{
8cdc1a81
MD
150 struct lttng_kernel_session *session;
151 struct lttng_kernel_session_private *session_priv;
d83004aa 152 struct lttng_metadata_cache *metadata_cache;
3c997079 153 int i;
4e3c1b9b
MD
154
155 mutex_lock(&sessions_mutex);
8cdc1a81 156 session = lttng_kvzalloc(sizeof(*session), GFP_KERNEL);
4e3c1b9b 157 if (!session)
d83004aa 158 goto err;
8cdc1a81
MD
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
0d5e5f34 165 INIT_LIST_HEAD(&session_priv->chan_head);
ba5ed2bc 166 INIT_LIST_HEAD(&session_priv->events_head);
8cdc1a81 167 lttng_guid_gen(&session_priv->uuid);
d83004aa
JD
168
169 metadata_cache = kzalloc(sizeof(struct lttng_metadata_cache),
170 GFP_KERNEL);
171 if (!metadata_cache)
8cdc1a81 172 goto err_free_session_private;
0ca42eb7 173 metadata_cache->data = vzalloc(METADATA_CACHE_DEFAULT_SIZE);
d83004aa
JD
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);
92d9f5e6 178 mutex_init(&metadata_cache->lock);
8cdc1a81 179 session_priv->metadata_cache = metadata_cache;
d83004aa 180 INIT_LIST_HEAD(&metadata_cache->metadata_stream);
8cdc1a81 181 memcpy(&metadata_cache->uuid, &session_priv->uuid,
a36580d5 182 sizeof(metadata_cache->uuid));
8cdc1a81 183 INIT_LIST_HEAD(&session_priv->enablers_head);
3c997079 184 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
095a9bf0 185 INIT_HLIST_HEAD(&session_priv->events_name_ht.table[i]);
49b1a300
MD
186 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
187 INIT_HLIST_HEAD(&session_priv->events_key_ht.table[i]);
24909af2 188 list_add(&session_priv->node, &sessions);
8cdc1a81 189
8c0393c3
MD
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
4e3c1b9b 203 mutex_unlock(&sessions_mutex);
8cdc1a81 204
4e3c1b9b 205 return session;
d83004aa 206
8c0393c3
MD
207tracker_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);
d83004aa
JD
214err_free_cache:
215 kfree(metadata_cache);
8cdc1a81
MD
216err_free_session_private:
217 lttng_kvfree(session_priv);
d83004aa 218err_free_session:
48f5e0b5 219 lttng_kvfree(session);
d83004aa
JD
220err:
221 mutex_unlock(&sessions_mutex);
222 return NULL;
223}
224
99f52fcc
FD
225static
226struct 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
76ba9cee 237struct lttng_kernel_channel_counter *lttng_kernel_counter_create(
99f52fcc 238 const char *counter_transport_name,
76ba9cee 239 size_t number_dimensions,
81ab5b77 240 const struct lttng_kernel_counter_dimension *dimensions,
76ba9cee
MD
241 int64_t global_sum_step,
242 bool coalesce_hits)
99f52fcc 243{
99f52fcc 244 struct lttng_counter_transport *counter_transport = NULL;
76ba9cee 245 struct lttng_kernel_channel_counter *counter = NULL;
99f52fcc
FD
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
76ba9cee
MD
258 counter = counter_transport->ops.priv->counter_create(number_dimensions, dimensions,
259 global_sum_step);
99f52fcc 260 if (!counter)
76ba9cee 261 goto create_error;
99f52fcc
FD
262
263 /* Create event notifier error counter. */
264 counter->ops = &counter_transport->ops;
76ba9cee
MD
265 counter->priv->parent.coalesce_hits = coalesce_hits;
266 counter->priv->transport = counter_transport;
4a6c2fbf 267 mutex_init(&counter->priv->map.lock);
99f52fcc
FD
268
269 return counter;
270
271create_error:
99f52fcc
FD
272 if (counter_transport)
273 module_put(counter_transport->owner);
274notransport:
275 return NULL;
276}
277
76ba9cee
MD
278static
279void lttng_kernel_counter_destroy(struct lttng_kernel_channel_counter *counter)
280{
281 struct lttng_counter_transport *counter_transport = counter->priv->transport;
282
4a6c2fbf 283 lttng_kvfree(counter->priv->map.descriptors);
7b0f1e69 284 counter->ops->priv->counter_destroy(counter);
76ba9cee
MD
285 module_put(counter_transport->owner);
286}
287
750b05f2
FD
288struct 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;
dffef45d 297 int i;
750b05f2
FD
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;
4a399b76 323 event_notifier_group->chan = transport->ops.priv->channel_create(
750b05f2
FD
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;
dffef45d
FD
331
332 INIT_LIST_HEAD(&event_notifier_group->enablers_head);
333 INIT_LIST_HEAD(&event_notifier_group->event_notifiers_head);
33af697f 334 for (i = 0; i < LTTNG_EVENT_HT_SIZE; i++)
f8d37df1 335 INIT_HLIST_HEAD(&event_notifier_group->events_name_ht.table[i]);
dffef45d 336
750b05f2
FD
337 list_add(&event_notifier_group->node, &event_notifier_groups);
338
339 mutex_unlock(&sessions_mutex);
340
341 return event_notifier_group;
342
343create_error:
344 lttng_kvfree(event_notifier_group);
345nomem:
346 if (transport)
347 module_put(transport->owner);
348notransport:
349 mutex_unlock(&sessions_mutex);
350 return NULL;
351}
352
d83004aa
JD
353void metadata_cache_destroy(struct kref *kref)
354{
355 struct lttng_metadata_cache *cache =
356 container_of(kref, struct lttng_metadata_cache, refcount);
a606b6e8 357 vfree(cache->data);
d83004aa 358 kfree(cache);
4e3c1b9b
MD
359}
360
8cdc1a81 361void lttng_session_destroy(struct lttng_kernel_session *session)
4e3c1b9b 362{
2ff86ce2 363 struct lttng_kernel_channel_common_private *chan_priv, *tmpchan_priv;
a67ba386 364 struct lttng_kernel_event_recorder_private *event_recorder_priv, *tmpevent_recorder_priv;
d83004aa 365 struct lttng_metadata_stream *metadata_stream;
09710b83 366 struct lttng_event_enabler_common *event_enabler, *tmp_event_enabler;
dda6a249 367 int ret;
4e3c1b9b
MD
368
369 mutex_lock(&sessions_mutex);
a8f2d0c7 370 WRITE_ONCE(session->active, 0);
0d5e5f34 371 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2 372 ret = lttng_syscalls_unregister_syscall_table(&chan_priv->syscall_table);
1ec65de1
MD
373 WARN_ON(ret);
374 }
ba5ed2bc 375 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node)
6a338ba4 376 _lttng_event_unregister(&event_recorder_priv->pub->parent);
abcca994 377 synchronize_trace(); /* Wait for in-flight events to complete */
0d5e5f34 378 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2 379 ret = lttng_syscalls_destroy_syscall_table(&chan_priv->syscall_table);
badfe9f5
MD
380 WARN_ON(ret);
381 }
09710b83
MD
382 list_for_each_entry_safe(event_enabler, tmp_event_enabler, &session->priv->enablers_head, node)
383 lttng_event_enabler_destroy(event_enabler);
ba5ed2bc 384 list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv, &session->priv->events_head, parent.parent.node)
0648898e 385 _lttng_event_destroy(&event_recorder_priv->pub->parent);
0d5e5f34 386 list_for_each_entry_safe(chan_priv, tmpchan_priv, &session->priv->chan_head, node) {
f7d06400 387 _lttng_channel_destroy(chan_priv->pub);
d83004aa 388 }
8cdc1a81 389 mutex_lock(&session->priv->metadata_cache->lock);
94ac1e17 390 list_for_each_entry(metadata_stream, &session->priv->metadata_cache->metadata_stream, node)
d83004aa 391 _lttng_metadata_channel_hangup(metadata_stream);
8cdc1a81 392 mutex_unlock(&session->priv->metadata_cache->lock);
8c0393c3
MD
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);
8cdc1a81 399 kref_put(&session->priv->metadata_cache->refcount, metadata_cache_destroy);
24909af2 400 list_del(&session->priv->node);
4e3c1b9b 401 mutex_unlock(&sessions_mutex);
8cdc1a81 402 lttng_kvfree(session->priv);
48f5e0b5 403 lttng_kvfree(session);
4e3c1b9b
MD
404}
405
dffef45d
FD
406void lttng_event_notifier_group_destroy(
407 struct lttng_event_notifier_group *event_notifier_group)
750b05f2 408{
09710b83 409 struct lttng_event_enabler_common *event_enabler, *tmp_event_enabler;
a67ba386 410 struct lttng_kernel_event_notifier_private *event_notifier_priv, *tmpevent_notifier_priv;
dffef45d
FD
411 int ret;
412
750b05f2
FD
413 if (!event_notifier_group)
414 return;
415
416 mutex_lock(&sessions_mutex);
dffef45d 417
6053e75e 418 ret = lttng_syscalls_unregister_syscall_table(&event_notifier_group->syscall_table);
8a8ac9a8
FD
419 WARN_ON(ret);
420
a67ba386 421 list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
6a338ba4
MD
422 &event_notifier_group->event_notifiers_head, parent.node)
423 _lttng_event_unregister(&event_notifier_priv->pub->parent);
dffef45d 424
b01155ba
FD
425 /* Wait for in-flight event notifier to complete */
426 synchronize_trace();
427
21f58fb7
FD
428 irq_work_sync(&event_notifier_group->wakeup_pending);
429
6053e75e
MD
430 ret = lttng_syscalls_destroy_syscall_table(&event_notifier_group->syscall_table);
431 WARN_ON(ret);
8a8ac9a8 432
09710b83 433 list_for_each_entry_safe(event_enabler, tmp_event_enabler,
dffef45d 434 &event_notifier_group->enablers_head, node)
09710b83 435 lttng_event_enabler_destroy(event_enabler);
dffef45d 436
a67ba386 437 list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
f237aef8 438 &event_notifier_group->event_notifiers_head, parent.node)
0648898e 439 _lttng_event_destroy(&event_notifier_priv->pub->parent);
dffef45d 440
76ba9cee
MD
441 if (event_notifier_group->error_counter)
442 lttng_kernel_counter_destroy(event_notifier_group->error_counter);
99f52fcc 443
4a399b76 444 event_notifier_group->ops->priv->channel_destroy(event_notifier_group->chan);
750b05f2
FD
445 module_put(event_notifier_group->transport->owner);
446 list_del(&event_notifier_group->node);
dffef45d 447
750b05f2
FD
448 mutex_unlock(&sessions_mutex);
449 lttng_kvfree(event_notifier_group);
450}
451
8cdc1a81 452int lttng_session_statedump(struct lttng_kernel_session *session)
601252cf
MD
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
8cdc1a81 462int lttng_session_enable(struct lttng_kernel_session *session)
c0e31d2e
MD
463{
464 int ret = 0;
2ff86ce2 465 struct lttng_kernel_channel_common_private *chan_priv;
c0e31d2e
MD
466
467 mutex_lock(&sessions_mutex);
468 if (session->active) {
469 ret = -EBUSY;
470 goto end;
471 }
c099397a 472
3c997079 473 /* Set transient enabler state to "enabled" */
8cdc1a81 474 session->priv->tstate = 1;
3c997079 475
4ef81e4a 476 /* We need to sync enablers with session before activation. */
b2bc0bc8 477 lttng_session_sync_event_enablers(session);
4ef81e4a 478
c099397a
MD
479 /*
480 * Snapshot the number of events per channel to know the type of header
481 * we need to use.
482 */
0d5e5f34 483 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2
MD
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)
f7d06400 490 continue; /* don't change it if session stop/restart */
2ff86ce2
MD
491 if (chan_buf_priv->free_event_id < 31)
492 chan_buf_priv->header_type = 1; /* compact */
c099397a 493 else
2ff86ce2 494 chan_buf_priv->header_type = 2; /* large */
c099397a
MD
495 }
496
64af2437 497 /* Clear each stream's quiescent state. */
0d5e5f34 498 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2
MD
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);
09b93db9 506 }
64af2437 507
a8f2d0c7 508 WRITE_ONCE(session->active, 1);
8cdc1a81 509 WRITE_ONCE(session->priv->been_active, 1);
a90917c3 510 ret = _lttng_session_metadata_statedump(session);
c337ddc2 511 if (ret) {
a8f2d0c7 512 WRITE_ONCE(session->active, 0);
c337ddc2
MD
513 goto end;
514 }
515 ret = lttng_statedump_start(session);
360f38ea 516 if (ret)
a8f2d0c7 517 WRITE_ONCE(session->active, 0);
c0e31d2e
MD
518end:
519 mutex_unlock(&sessions_mutex);
11b5a3c2 520 return ret;
c0e31d2e
MD
521}
522
8cdc1a81 523int lttng_session_disable(struct lttng_kernel_session *session)
c0e31d2e
MD
524{
525 int ret = 0;
2ff86ce2 526 struct lttng_kernel_channel_common_private *chan_priv;
c0e31d2e
MD
527
528 mutex_lock(&sessions_mutex);
529 if (!session->active) {
530 ret = -EBUSY;
531 goto end;
532 }
a8f2d0c7 533 WRITE_ONCE(session->active, 0);
3c997079
MD
534
535 /* Set transient enabler state to "disabled" */
8cdc1a81 536 session->priv->tstate = 0;
b2bc0bc8 537 lttng_session_sync_event_enablers(session);
64af2437
MD
538
539 /* Set each stream's quiescent state. */
0d5e5f34 540 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2
MD
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);
09b93db9 548 }
c0e31d2e
MD
549end:
550 mutex_unlock(&sessions_mutex);
11b5a3c2 551 return ret;
c0e31d2e
MD
552}
553
8cdc1a81 554int lttng_session_metadata_regenerate(struct lttng_kernel_session *session)
9616f0bf
JD
555{
556 int ret = 0;
2ff86ce2 557 struct lttng_kernel_channel_common_private *chan_priv;
a67ba386 558 struct lttng_kernel_event_recorder_private *event_recorder_priv;
8cdc1a81 559 struct lttng_metadata_cache *cache = session->priv->metadata_cache;
9616f0bf
JD
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++;
94ac1e17 572 list_for_each_entry(stream, &session->priv->metadata_cache->metadata_stream, node) {
9616f0bf
JD
573 stream->metadata_out = 0;
574 stream->metadata_in = 0;
575 }
576 mutex_unlock(&cache->lock);
577
8cdc1a81 578 session->priv->metadata_dumped = 0;
0d5e5f34 579 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2
MD
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;
9616f0bf
JD
586 }
587
ba5ed2bc 588 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node) {
a67ba386 589 event_recorder_priv->metadata_dumped = 0;
9616f0bf
JD
590 }
591
592 ret = _lttng_session_metadata_statedump(session);
593
594end:
595 mutex_unlock(&sessions_mutex);
596 return ret;
597}
598
6b757027
MD
599static
600bool 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
612int lttng_channel_enable(struct lttng_kernel_channel_common *channel)
e64957da 613{
3c997079 614 int ret = 0;
e64957da 615
3c997079 616 mutex_lock(&sessions_mutex);
6b757027 617 if (is_channel_buffer_metadata(channel)) {
3c997079
MD
618 ret = -EPERM;
619 goto end;
620 }
6b757027 621 if (channel->enabled) {
3c997079
MD
622 ret = -EEXIST;
623 goto end;
624 }
625 /* Set transient enabler state to "enabled" */
6b757027
MD
626 channel->priv->tstate = 1;
627 lttng_session_sync_event_enablers(channel->session);
3c997079 628 /* Set atomically the state to "enabled" */
6b757027 629 WRITE_ONCE(channel->enabled, 1);
3c997079
MD
630end:
631 mutex_unlock(&sessions_mutex);
632 return ret;
e64957da
MD
633}
634
6b757027 635int lttng_channel_disable(struct lttng_kernel_channel_common *channel)
e64957da 636{
3c997079 637 int ret = 0;
e64957da 638
3c997079 639 mutex_lock(&sessions_mutex);
6b757027 640 if (is_channel_buffer_metadata(channel)) {
3c997079
MD
641 ret = -EPERM;
642 goto end;
643 }
6b757027 644 if (!channel->enabled) {
3c997079
MD
645 ret = -EEXIST;
646 goto end;
647 }
648 /* Set atomically the state to "disabled" */
6b757027 649 WRITE_ONCE(channel->enabled, 0);
3c997079 650 /* Set transient enabler state to "enabled" */
6b757027
MD
651 channel->priv->tstate = 0;
652 lttng_session_sync_event_enablers(channel->session);
3c997079
MD
653end:
654 mutex_unlock(&sessions_mutex);
655 return ret;
e64957da
MD
656}
657
9d993668 658int lttng_event_enable(struct lttng_kernel_event_common *event)
e64957da 659{
3c997079 660 int ret = 0;
e64957da 661
3c997079 662 mutex_lock(&sessions_mutex);
9d993668
MD
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
f7d06400 669 if (event_recorder->chan->priv->channel_type == METADATA_CHANNEL) {
9d993668
MD
670 ret = -EPERM;
671 goto end;
672 }
a0493bef 673 break;
9d993668
MD
674 }
675 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
e5457479 676 lttng_fallthrough;
4fa39e4e
MD
677 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
678 break;
a0493bef 679 default:
9d993668 680 break;
a0493bef 681 }
e64957da 682
9d993668 683 if (event->enabled) {
3c997079
MD
684 ret = -EEXIST;
685 goto end;
686 }
a67ba386 687 switch (event->priv->instrumentation) {
c190d76e
MJ
688 case LTTNG_KERNEL_ABI_TRACEPOINT:
689 lttng_fallthrough;
606828e4 690 case LTTNG_KERNEL_ABI_SYSCALL:
fd0402f3
MD
691 lttng_fallthrough;
692 case LTTNG_KERNEL_ABI_KPROBE:
99414eaf
MD
693 lttng_fallthrough;
694 case LTTNG_KERNEL_ABI_KRETPROBE:
a0493bef
MD
695 ret = -EINVAL;
696 break;
b4a75708 697
606828e4 698 case LTTNG_KERNEL_ABI_UPROBE:
9d993668 699 WRITE_ONCE(event->enabled, 1);
a0493bef 700 break;
b4a75708 701
c190d76e
MJ
702 case LTTNG_KERNEL_ABI_FUNCTION:
703 lttng_fallthrough;
704 case LTTNG_KERNEL_ABI_NOOP:
705 lttng_fallthrough;
a0493bef
MD
706 default:
707 WARN_ON_ONCE(1);
708 ret = -EINVAL;
709 }
3c997079
MD
710end:
711 mutex_unlock(&sessions_mutex);
712 return ret;
e64957da
MD
713}
714
9d993668 715int lttng_event_disable(struct lttng_kernel_event_common *event)
dffef45d
FD
716{
717 int ret = 0;
718
719 mutex_lock(&sessions_mutex);
9d993668
MD
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
f7d06400 726 if (event_recorder->chan->priv->channel_type == METADATA_CHANNEL) {
9d993668
MD
727 ret = -EPERM;
728 goto end;
729 }
b01155ba 730 break;
9d993668
MD
731 }
732 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
e5457479 733 lttng_fallthrough;
4fa39e4e
MD
734 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
735 break;
dffef45d 736 default:
9d993668 737 break;
dffef45d 738 }
dffef45d 739
a67ba386 740 if (!event->enabled) {
dffef45d
FD
741 ret = -EEXIST;
742 goto end;
743 }
a67ba386 744 switch (event->priv->instrumentation) {
c190d76e
MJ
745 case LTTNG_KERNEL_ABI_TRACEPOINT:
746 lttng_fallthrough;
606828e4 747 case LTTNG_KERNEL_ABI_SYSCALL:
fd0402f3
MD
748 lttng_fallthrough;
749 case LTTNG_KERNEL_ABI_KPROBE:
99414eaf
MD
750 lttng_fallthrough;
751 case LTTNG_KERNEL_ABI_KRETPROBE:
b01155ba
FD
752 ret = -EINVAL;
753 break;
b4a75708 754
606828e4 755 case LTTNG_KERNEL_ABI_UPROBE:
a67ba386 756 WRITE_ONCE(event->enabled, 0);
2b16f0c9 757 break;
b4a75708 758
c190d76e
MJ
759 case LTTNG_KERNEL_ABI_FUNCTION:
760 lttng_fallthrough;
761 case LTTNG_KERNEL_ABI_NOOP:
762 lttng_fallthrough;
dffef45d
FD
763 default:
764 WARN_ON_ONCE(1);
765 ret = -EINVAL;
766 }
767end:
768 mutex_unlock(&sessions_mutex);
769 return ret;
770}
771
4e252d1e 772struct lttng_kernel_channel_buffer *lttng_channel_buffer_create(struct lttng_kernel_session *session,
5dbbdb43
MD
773 const char *transport_name,
774 void *buf_addr,
4e3c1b9b
MD
775 size_t subbuf_size, size_t num_subbuf,
776 unsigned int switch_timer_interval,
d83004aa
JD
777 unsigned int read_timer_interval,
778 enum channel_type channel_type)
4e3c1b9b 779{
f7d06400 780 struct lttng_kernel_channel_buffer *chan;
a90917c3 781 struct lttng_transport *transport = NULL;
4e3c1b9b
MD
782
783 mutex_lock(&sessions_mutex);
8cdc1a81 784 if (session->priv->been_active && channel_type != METADATA_CHANNEL)
e5382b6d 785 goto active; /* Refuse to add channel to active session */
a90917c3 786 transport = lttng_transport_find(transport_name);
f3d01b96 787 if (!transport) {
5a15f70c 788 printk(KERN_WARNING "LTTng: transport %s not found\n",
f3d01b96 789 transport_name);
c0e31d2e 790 goto notransport;
f3d01b96 791 }
a33c9927 792 if (!try_module_get(transport->owner)) {
5a15f70c 793 printk(KERN_WARNING "LTTng: Can't lock transport module.\n");
a33c9927
MD
794 goto notransport;
795 }
76ba9cee 796 chan = lttng_kernel_alloc_channel_buffer();
4e3c1b9b 797 if (!chan)
c0e31d2e 798 goto nomem;
f7d06400
MD
799 chan->parent.session = session;
800 chan->priv->id = session->priv->free_chan_id++;
3b731ab1 801 chan->ops = &transport->ops;
125b4df4
MD
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 */
f7d06400 807 chan->priv->rb_chan = transport->ops.priv->channel_create(transport_name,
5f5ddf01
MD
808 chan, buf_addr, subbuf_size, num_subbuf,
809 switch_timer_interval, read_timer_interval);
f7d06400 810 if (!chan->priv->rb_chan)
f3d01b96 811 goto create_error;
f7d06400
MD
812 chan->priv->parent.tstate = 1;
813 chan->parent.enabled = 1;
814 chan->priv->transport = transport;
815 chan->priv->channel_type = channel_type;
2ff86ce2 816 list_add(&chan->priv->parent.node, &session->priv->chan_head);
4e3c1b9b
MD
817 mutex_unlock(&sessions_mutex);
818 return chan;
819
f3d01b96 820create_error:
76ba9cee 821 lttng_kernel_free_channel_common(&chan->parent);
c0e31d2e 822nomem:
a33c9927
MD
823 if (transport)
824 module_put(transport->owner);
c0e31d2e 825notransport:
e5382b6d 826active:
4e3c1b9b
MD
827 mutex_unlock(&sessions_mutex);
828 return NULL;
829}
830
831/*
d83004aa
JD
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.
4e3c1b9b 835 */
aa7c23a9 836static
2ff86ce2 837void lttng_kernel_buffer_destroy(struct lttng_kernel_channel_buffer *chan)
4e3c1b9b 838{
f7d06400
MD
839 chan->ops->priv->channel_destroy(chan->priv->rb_chan);
840 module_put(chan->priv->transport->owner);
f7d06400
MD
841 lttng_kernel_destroy_context(chan->priv->ctx);
842 kfree(chan->priv);
4e3c1b9b
MD
843 kfree(chan);
844}
845
2ff86ce2
MD
846static
847void _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
871void lttng_metadata_channel_buffer_destroy(struct lttng_kernel_channel_buffer *chan)
d83004aa 872{
f7d06400 873 BUG_ON(chan->priv->channel_type != METADATA_CHANNEL);
d83004aa
JD
874
875 /* Protect the metadata cache with the sessions_mutex. */
876 mutex_lock(&sessions_mutex);
2ff86ce2 877 _lttng_channel_destroy(&chan->parent);
d83004aa
JD
878 mutex_unlock(&sessions_mutex);
879}
2ff86ce2 880EXPORT_SYMBOL_GPL(lttng_metadata_channel_buffer_destroy);
d83004aa
JD
881
882static
883void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream)
884{
885 stream->finalized = 1;
886 wake_up_interruptible(&stream->read_wait);
887}
888
51d248b5
MD
889static
890bool 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 =
4a46ca39 899 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
51d248b5
MD
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 }
1cabf4f1
MD
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;
1cabf4f1
MD
928 size_t nr_dimensions, max_nr_elem;
929
dc1f2f73 930 if (lttng_kernel_counter_get_nr_dimensions(chan, &nr_dimensions))
1cabf4f1
MD
931 return false;
932 WARN_ON_ONCE(nr_dimensions != 1);
933 if (nr_dimensions != 1)
934 return false;
dc1f2f73 935 if (lttng_kernel_counter_get_max_nr_elem(chan, &max_nr_elem))
1cabf4f1
MD
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 }
51d248b5
MD
958 case LTTNG_EVENT_ENABLER_TYPE_NOTIFIER:
959 return true;
960 default:
961 WARN_ON_ONCE(1);
962 return false;
963 }
964}
965
756a020c 966static
8f13d95d 967struct lttng_kernel_event_common *lttng_kernel_event_alloc(struct lttng_event_enabler_common *event_enabler,
49b1a300 968 struct hlist_head *key_head,
8f13d95d 969 const char *key_string)
756a020c
MD
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 =
4a46ca39 978 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
756a020c
MD
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
49b1a300 983 WARN_ON_ONCE(key_head); /* not implemented. */
756a020c
MD
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;
6b4e37a3 993 event_recorder_priv->parent.parent.pub = &event_recorder->parent;
756a020c 994 event_recorder->priv = event_recorder_priv;
6b4e37a3 995 event_recorder->parent.priv = &event_recorder_priv->parent.parent;
756a020c
MD
996
997 event_recorder->parent.type = LTTNG_KERNEL_EVENT_TYPE_RECORDER;
998 event_recorder->parent.run_filter = lttng_kernel_interpret_event_filter;
6b4e37a3
MD
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);
756a020c
MD
1002
1003 event_recorder->chan = chan;
6b4e37a3
MD
1004 event_recorder->priv->parent.chan = &chan->parent;
1005 event_recorder->priv->parent.id = chan->priv->free_event_id++;
756a020c
MD
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
49b1a300 1015 WARN_ON_ONCE(key_head); /* not implemented. */
756a020c
MD
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 }
8f13d95d
MD
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;
49b1a300 1050 bool key_found = false;
8f13d95d
MD
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);
d9a337ba 1076 event_counter_priv->action = event_counter_enabler->action;
49b1a300
MD
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++;
8f13d95d
MD
1091 return &event_counter->parent;
1092 }
756a020c
MD
1093 default:
1094 return NULL;
1095 }
1096}
1097
1098static
1099void 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 }
062a5f00
MD
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 }
756a020c
MD
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}
a101fa10 1133
ccefc7ab
MD
1134static
1135int 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:
76ba9cee
MD
1139 lttng_fallthrough;
1140 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
ccefc7ab 1141 return 0;
76ba9cee 1142
ccefc7ab
MD
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);
76ba9cee 1147 struct lttng_kernel_channel_counter *error_counter;
ccefc7ab
MD
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;
76ba9cee 1171 ret = error_counter->ops->priv->counter_clear(error_counter, dimension_index);
ccefc7ab
MD
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
15521f02
MD
1184int 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;
7b0f1e69
MD
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;
15521f02 1191
7b0f1e69 1192 if (event_enabler->enabler_type != LTTNG_EVENT_ENABLER_TYPE_COUNTER)
15521f02 1193 return 0;
15521f02 1194 event_counter_enabler = container_of(event_enabler, struct lttng_event_counter_enabler, parent.parent);
7b0f1e69 1195 key = event_counter_enabler->key;
15521f02
MD
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;
7b0f1e69 1201 dim = &key->dimension_array[0];
15521f02 1202 for (i = 0; i < dim->nr_key_tokens; i++) {
7b0f1e69 1203 const struct lttng_key_token *token = &dim->token_array[i];
15521f02
MD
1204 size_t token_len;
1205 const char *str;
1206
1207 switch (token->type) {
1208 case LTTNG_KEY_TOKEN_STRING:
7b0f1e69 1209 str = token->str;
15521f02
MD
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
1226static
1227bool match_event_key(struct lttng_kernel_event_common *event, const char *key_string)
1228{
1229 switch (event->type) {
4fa39e4e
MD
1230 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
1231 lttng_fallthrough;
15521f02
MD
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
1251static
1252bool 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
15521f02
MD
1262bool 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
4a6c2fbf
MD
1309static
1310int 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
345beadc 1319 if (strlen(key) >= LTTNG_KERNEL_COUNTER_KEY_LEN) {
4a6c2fbf
MD
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);
1348unlock:
1349 mutex_unlock(&map->lock);
1350 return ret;
1351}
1352
1353static
1354int 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
e5382b6d
MD
1376/*
1377 * Supports event creation while tracing session is active.
3c997079 1378 * Needs to be called with sessions mutex held.
e5382b6d 1379 */
13a2dfca 1380struct lttng_kernel_event_common *_lttng_kernel_event_create(struct lttng_event_enabler_common *event_enabler,
44d1600b
MD
1381 const struct lttng_kernel_event_desc *event_desc,
1382 struct lttng_kernel_event_pair *event_pair)
4e3c1b9b 1383{
7b0f1e69 1384 char key_string[LTTNG_KERNEL_COUNTER_KEY_LEN] = { 0 };
49b1a300
MD
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);
13a2dfca
MD
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;
def1e304 1389 enum lttng_kernel_abi_instrumentation itype = event_param->instrumentation;
15521f02 1390 struct lttng_kernel_event_common_private *event_priv_iter;
756a020c 1391 struct lttng_kernel_event_common *event;
49b1a300 1392 struct hlist_head *name_head, *key_head = NULL;
15521f02 1393 const char *event_name;
3d084699 1394 int ret;
4e3c1b9b 1395
99414eaf 1396 if (event_pair == NULL || event_pair->check_ids) {
44d1600b
MD
1397 if (!lttng_kernel_event_id_available(event_enabler)) {
1398 ret = -EMFILE;
1399 goto full;
1400 }
abc0446a 1401 }
3c997079
MD
1402
1403 switch (itype) {
606828e4 1404 case LTTNG_KERNEL_ABI_TRACEPOINT:
437d5aa5 1405 event_name = event_desc->event_name;
3c997079 1406 break;
b4a75708 1407
c190d76e
MJ
1408 case LTTNG_KERNEL_ABI_KPROBE:
1409 lttng_fallthrough;
1410 case LTTNG_KERNEL_ABI_UPROBE:
1411 lttng_fallthrough;
606828e4 1412 case LTTNG_KERNEL_ABI_SYSCALL:
3c997079
MD
1413 event_name = event_param->name;
1414 break;
b4a75708 1415
44d1600b
MD
1416 case LTTNG_KERNEL_ABI_KRETPROBE:
1417 event_name = event_pair->name;
1418 break;
1419
c190d76e
MJ
1420 case LTTNG_KERNEL_ABI_FUNCTION:
1421 lttng_fallthrough;
1422 case LTTNG_KERNEL_ABI_NOOP:
1423 lttng_fallthrough;
3c997079
MD
1424 default:
1425 WARN_ON_ONCE(1);
1426 ret = -EINVAL;
1427 goto type_error;
1428 }
4a11ef1c 1429
15521f02
MD
1430 if (format_event_key(event_enabler, key_string, event_name)) {
1431 ret = -EINVAL;
1432 goto type_error;
1433 }
1434
49b1a300
MD
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) {
15521f02
MD
1437 if (lttng_event_enabler_event_name_key_match_event(event_enabler,
1438 event_name, key_string, event_priv_iter->pub)) {
3c997079
MD
1439 ret = -EEXIST;
1440 goto exist;
abc0446a
MD
1441 }
1442 }
3c997079 1443
49b1a300
MD
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);
756a020c 1448 if (!event) {
4cf0bf51 1449 ret = -ENOMEM;
756a020c 1450 goto alloc_error;
abc0446a 1451 }
3c997079
MD
1452
1453 switch (itype) {
606828e4 1454 case LTTNG_KERNEL_ABI_TRACEPOINT:
3c997079 1455 /* Event will be enabled by enabler sync. */
7cd0f696
MD
1456 event->enabled = 0;
1457 event->priv->registered = 0;
1458 event->priv->desc = lttng_event_desc_get(event_name);
1459 if (!event->priv->desc) {
4cf0bf51 1460 ret = -ENOENT;
d3dbe23c 1461 goto register_error;
abc0446a 1462 }
3c997079
MD
1463 /* Populate lttng_event structure before event registration. */
1464 smp_wmb();
baf20995 1465 break;
b4a75708 1466
606828e4 1467 case LTTNG_KERNEL_ABI_KPROBE:
fd0402f3 1468 /* Event will be enabled by enabler sync. */
7cd0f696 1469 event->enabled = 0;
fd0402f3
MD
1470 event->priv->registered = 0;
1471 ret = lttng_kprobes_init_event(event_name,
f17701fb
MD
1472 event_param->u.kprobe.symbol_name,
1473 event_param->u.kprobe.offset,
1474 event_param->u.kprobe.addr,
7cd0f696 1475 event);
abc0446a 1476 if (ret) {
4cf0bf51 1477 ret = -EINVAL;
d6d808f3 1478 goto register_error;
abc0446a 1479 }
fd0402f3
MD
1480 /*
1481 * Populate lttng_event structure before event
1482 * registration.
1483 */
1484 smp_wmb();
7cd0f696 1485 ret = try_module_get(event->priv->desc->owner);
edeb3137 1486 WARN_ON_ONCE(!ret);
d6d808f3 1487 break;
b4a75708 1488
606828e4 1489 case LTTNG_KERNEL_ABI_KRETPROBE:
7371f44c 1490 {
99414eaf 1491 /* Event will be enabled by enabler sync. */
756a020c 1492 event->enabled = 0;
99414eaf
MD
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;
44d1600b 1499 goto register_error;
a67ba386 1500 }
756a020c 1501 ret = try_module_get(event->priv->desc->owner);
7371f44c 1502 WARN_ON_ONCE(!ret);
7371f44c
MD
1503 break;
1504 }
b4a75708 1505
606828e4 1506 case LTTNG_KERNEL_ABI_SYSCALL:
6ef1e2f5 1507 /* Event will be enabled by enabler sync. */
7cd0f696
MD
1508 event->enabled = 0;
1509 event->priv->registered = 0;
1510 event->priv->desc = event_desc;
badfe9f5 1511 switch (event_param->u.syscall.entryexit) {
606828e4 1512 case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT:
badfe9f5
MD
1513 ret = -EINVAL;
1514 goto register_error;
606828e4 1515 case LTTNG_KERNEL_ABI_SYSCALL_ENTRY:
7cd0f696 1516 event->priv->u.syscall.entryexit = LTTNG_SYSCALL_ENTRY;
badfe9f5 1517 break;
606828e4 1518 case LTTNG_KERNEL_ABI_SYSCALL_EXIT:
7cd0f696 1519 event->priv->u.syscall.entryexit = LTTNG_SYSCALL_EXIT;
badfe9f5
MD
1520 break;
1521 }
1522 switch (event_param->u.syscall.abi) {
606828e4 1523 case LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL:
badfe9f5
MD
1524 ret = -EINVAL;
1525 goto register_error;
606828e4 1526 case LTTNG_KERNEL_ABI_SYSCALL_ABI_NATIVE:
7cd0f696 1527 event->priv->u.syscall.abi = LTTNG_SYSCALL_ABI_NATIVE;
badfe9f5 1528 break;
606828e4 1529 case LTTNG_KERNEL_ABI_SYSCALL_ABI_COMPAT:
7cd0f696 1530 event->priv->u.syscall.abi = LTTNG_SYSCALL_ABI_COMPAT;
badfe9f5
MD
1531 break;
1532 }
7cd0f696 1533 if (!event->priv->desc) {
4cf0bf51 1534 ret = -EINVAL;
259b6cb3 1535 goto register_error;
abc0446a 1536 }
1ec65de1 1537 break;
b4a75708 1538
606828e4 1539 case LTTNG_KERNEL_ABI_UPROBE:
a344f64b
FD
1540 /*
1541 * Needs to be explicitly enabled after creation, since
1542 * we may want to apply filters.
1543 */
7cd0f696
MD
1544 event->enabled = 0;
1545 event->priv->registered = 1;
3aed4dca 1546
a344f64b
FD
1547 /*
1548 * Populate lttng_event structure before event
1549 * registration.
1550 */
1551 smp_wmb();
149b9a9d 1552
83b802dc 1553 ret = lttng_uprobes_register_event(event_param->name,
56377c91 1554 event_param->u.uprobe.fd,
7cd0f696 1555 event);
149b9a9d
YB
1556 if (ret)
1557 goto register_error;
7cd0f696 1558 ret = try_module_get(event->priv->desc->owner);
149b9a9d 1559 WARN_ON_ONCE(!ret);
4a6c2fbf
MD
1560 ret = lttng_append_event_to_channel_map(event_enabler, event, event_name);
1561 WARN_ON_ONCE(ret);
149b9a9d 1562 break;
b4a75708 1563
baf20995
MD
1564 default:
1565 WARN_ON_ONCE(1);
4cf0bf51 1566 ret = -EINVAL;
df07930b 1567 goto register_error;
baf20995 1568 }
13a2dfca 1569
ee7e9a18 1570 ret = _lttng_event_recorder_metadata_statedump(event);
abc0446a
MD
1571 WARN_ON_ONCE(ret > 0);
1572 if (ret) {
c099397a 1573 goto statedump_error;
abc0446a 1574 }
dffef45d 1575
ccefc7ab 1576 ret = lttng_kernel_event_notifier_clear_error_counter(event);
2ff86ce2 1577 if (ret) {
ccefc7ab 1578 goto register_error;
2ff86ce2 1579 }
c4e31059 1580
49b1a300
MD
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 }
13a2dfca 1587 list_add(&event->priv->node, event_list_head);
c4e31059 1588
13a2dfca 1589 return event;
dffef45d 1590
13a2dfca
MD
1591statedump_error:
1592 /* If a statedump error occurs, events will not be readable. */
dffef45d 1593register_error:
756a020c
MD
1594 lttng_kernel_event_free(event);
1595alloc_error:
dffef45d
FD
1596exist:
1597type_error:
13a2dfca 1598full:
dffef45d
FD
1599 return ERR_PTR(ret);
1600}
1601
83006ee0 1602struct lttng_kernel_event_common *lttng_kernel_event_create(struct lttng_event_enabler_common *event_enabler,
44d1600b
MD
1603 const struct lttng_kernel_event_desc *event_desc,
1604 struct lttng_kernel_event_pair *event_pair)
83006ee0
MD
1605{
1606 struct lttng_kernel_event_common *event;
1607
1608 mutex_lock(&sessions_mutex);
44d1600b 1609 event = _lttng_kernel_event_create(event_enabler, event_desc, event_pair);
83006ee0
MD
1610 mutex_unlock(&sessions_mutex);
1611 return event;
1612}
1613
76ba9cee 1614int lttng_kernel_counter_read(struct lttng_kernel_channel_counter *counter,
99f52fcc
FD
1615 const size_t *dim_indexes, int32_t cpu,
1616 int64_t *val, bool *overflow, bool *underflow)
1617{
76ba9cee 1618 return counter->ops->priv->counter_read(counter, dim_indexes,
99f52fcc
FD
1619 cpu, val, overflow, underflow);
1620}
1621
76ba9cee 1622int lttng_kernel_counter_aggregate(struct lttng_kernel_channel_counter *counter,
99f52fcc
FD
1623 const size_t *dim_indexes, int64_t *val,
1624 bool *overflow, bool *underflow)
1625{
76ba9cee 1626 return counter->ops->priv->counter_aggregate(counter, dim_indexes,
99f52fcc
FD
1627 val, overflow, underflow);
1628}
1629
76ba9cee 1630int lttng_kernel_counter_clear(struct lttng_kernel_channel_counter *counter,
99f52fcc
FD
1631 const size_t *dim_indexes)
1632{
76ba9cee 1633 return counter->ops->priv->counter_clear(counter, dim_indexes);
99f52fcc
FD
1634}
1635
dc1f2f73
MD
1636int 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
1642int 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
fd0402f3 1648/* Used for tracepoints, system calls, and kprobe. */
3c997079 1649static
0c851fa0 1650void register_event(struct lttng_kernel_event_common *event)
3c997079 1651{
437d5aa5 1652 const struct lttng_kernel_event_desc *desc;
f127e61e 1653 int ret = -EINVAL;
3c997079 1654
6a338ba4 1655 WARN_ON_ONCE(event->priv->registered);
4ecb5ad5 1656
0c851fa0
MD
1657 desc = event->priv->desc;
1658 switch (event->priv->instrumentation) {
606828e4 1659 case LTTNG_KERNEL_ABI_TRACEPOINT:
a6837bed 1660 ret = lttng_tracepoint_probe_register(desc->event_kname,
6c8c025b 1661 desc->tp_class->probe_callback,
0c851fa0 1662 event);
4ecb5ad5 1663 break;
b4a75708 1664
606828e4 1665 case LTTNG_KERNEL_ABI_SYSCALL:
0c851fa0 1666 ret = lttng_syscall_filter_enable_event(event);
4ecb5ad5 1667 break;
b4a75708 1668
c190d76e 1669 case LTTNG_KERNEL_ABI_KPROBE:
fd0402f3
MD
1670 ret = lttng_kprobes_register_event(event);
1671 break;
1672
c190d76e 1673 case LTTNG_KERNEL_ABI_UPROBE:
4ecb5ad5 1674 ret = 0;
f0bcc14c 1675 break;
0c851fa0
MD
1676
1677 case LTTNG_KERNEL_ABI_KRETPROBE:
99414eaf 1678 ret = lttng_kretprobes_register_event(event);
4ecb5ad5 1679 break;
b4a75708 1680
c190d76e
MJ
1681 case LTTNG_KERNEL_ABI_FUNCTION:
1682 lttng_fallthrough;
1683 case LTTNG_KERNEL_ABI_NOOP:
1684 lttng_fallthrough;
4ecb5ad5
MD
1685 default:
1686 WARN_ON_ONCE(1);
1687 }
6a338ba4 1688 WARN_ON_ONCE(ret);
3c997079 1689 if (!ret)
0c851fa0 1690 event->priv->registered = 1;
3c997079
MD
1691}
1692
6a338ba4
MD
1693static
1694void unregister_event(struct lttng_kernel_event_common *event)
4e3c1b9b 1695{
f0bcc14c 1696 struct lttng_kernel_event_common_private *event_priv = event->priv;
437d5aa5 1697 const struct lttng_kernel_event_desc *desc;
11b5a3c2
MD
1698 int ret = -EINVAL;
1699
6a338ba4 1700 WARN_ON_ONCE(!event->priv->registered);
3c997079 1701
a67ba386
MD
1702 desc = event_priv->desc;
1703 switch (event_priv->instrumentation) {
606828e4 1704 case LTTNG_KERNEL_ABI_TRACEPOINT:
a6837bed 1705 ret = lttng_tracepoint_probe_unregister(event_priv->desc->event_kname,
6c8c025b 1706 event_priv->desc->tp_class->probe_callback,
f0bcc14c 1707 event);
baf20995 1708 break;
b4a75708 1709
606828e4 1710 case LTTNG_KERNEL_ABI_KPROBE:
f0bcc14c 1711 lttng_kprobes_unregister_event(event);
d6d808f3
MD
1712 ret = 0;
1713 break;
b4a75708 1714
606828e4 1715 case LTTNG_KERNEL_ABI_KRETPROBE:
99414eaf
MD
1716 lttng_kretprobes_unregister_event(event);
1717 ret = 0;
7371f44c 1718 break;
b4a75708 1719
606828e4 1720 case LTTNG_KERNEL_ABI_SYSCALL:
f0bcc14c 1721 ret = lttng_syscall_filter_disable_event(event);
4ecb5ad5 1722 break;
b4a75708 1723
606828e4 1724 case LTTNG_KERNEL_ABI_NOOP:
f0bcc14c
MD
1725 switch (event->type) {
1726 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
4fa39e4e 1727 lttng_fallthrough;
062a5f00 1728 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
f0bcc14c
MD
1729 ret = 0;
1730 break;
1731 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
1732 WARN_ON_ONCE(1);
1733 break;
1734 }
259b6cb3 1735 break;
b4a75708 1736
606828e4 1737 case LTTNG_KERNEL_ABI_UPROBE:
f0bcc14c 1738 lttng_uprobes_unregister_event(event);
149b9a9d
YB
1739 ret = 0;
1740 break;
b4a75708 1741
c190d76e
MJ
1742 case LTTNG_KERNEL_ABI_FUNCTION:
1743 lttng_fallthrough;
baf20995
MD
1744 default:
1745 WARN_ON_ONCE(1);
1746 }
6a338ba4 1747 WARN_ON_ONCE(ret);
3c997079 1748 if (!ret)
a67ba386 1749 event_priv->registered = 0;
6a338ba4
MD
1750}
1751
1752static
1753void _lttng_event_unregister(struct lttng_kernel_event_common *event)
1754{
1755 if (event->priv->registered)
1756 unregister_event(event);
dda6a249
MD
1757}
1758
1759/*
1760 * Only used internally at session destruction.
1761 */
be066e6c 1762static
0648898e 1763void _lttng_event_destroy(struct lttng_kernel_event_common *event)
dda6a249 1764{
966ad253
MD
1765 struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref;
1766
0648898e
MD
1767 lttng_free_event_filter_runtime(event);
1768 /* Free event enabler refs */
1769 list_for_each_entry_safe(enabler_ref, tmp_enabler_ref,
cad07129 1770 &event->priv->enablers_ref_head, node)
0648898e 1771 kfree(enabler_ref);
b4a75708 1772
cad07129
MD
1773 /* Remove from event list. */
1774 list_del(&event->priv->node);
1775 /* Remove from event hash table. */
49b1a300
MD
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 }
3ef5cc03 1794
cad07129
MD
1795 switch (event->priv->instrumentation) {
1796 case LTTNG_KERNEL_ABI_TRACEPOINT:
1797 lttng_event_desc_put(event->priv->desc);
b01155ba 1798 break;
b4a75708 1799
cad07129
MD
1800 case LTTNG_KERNEL_ABI_KPROBE:
1801 module_put(event->priv->desc->owner);
1802 lttng_kprobes_destroy_event_private(event);
1803 break;
b4a75708 1804
cad07129
MD
1805 case LTTNG_KERNEL_ABI_KRETPROBE:
1806 module_put(event->priv->desc->owner);
99414eaf 1807 lttng_kretprobes_destroy_event_private(event);
cad07129 1808 break;
b4a75708 1809
cad07129
MD
1810 case LTTNG_KERNEL_ABI_SYSCALL:
1811 break;
0648898e 1812
cad07129
MD
1813 case LTTNG_KERNEL_ABI_UPROBE:
1814 module_put(event->priv->desc->owner);
1815 lttng_uprobes_destroy_event_private(event);
0648898e 1816 break;
cad07129
MD
1817
1818 case LTTNG_KERNEL_ABI_FUNCTION:
1819 lttng_fallthrough;
1820 case LTTNG_KERNEL_ABI_NOOP:
1821 lttng_fallthrough;
dffef45d
FD
1822 default:
1823 WARN_ON_ONCE(1);
1824 }
cad07129
MD
1825
1826 lttng_kernel_event_free(event);
dffef45d
FD
1827}
1828
435454a7 1829static
8c0393c3 1830struct lttng_kernel_id_tracker *get_tracker(struct lttng_kernel_session *session,
d1f652f8 1831 enum tracker_type tracker_type)
e0130fab 1832{
d1f652f8
MD
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
8cdc1a81 1852int lttng_session_track_id(struct lttng_kernel_session *session,
d1f652f8
MD
1853 enum tracker_type tracker_type, int id)
1854{
8c0393c3 1855 struct lttng_kernel_id_tracker *tracker;
e0130fab
MD
1856 int ret;
1857
d1f652f8
MD
1858 tracker = get_tracker(session, tracker_type);
1859 if (!tracker)
1860 return -EINVAL;
1861 if (id < -1)
e0130fab
MD
1862 return -EINVAL;
1863 mutex_lock(&sessions_mutex);
d1f652f8
MD
1864 if (id == -1) {
1865 /* track all ids: destroy tracker. */
1866 lttng_id_tracker_destroy(tracker, true);
e0130fab
MD
1867 ret = 0;
1868 } else {
d1f652f8 1869 ret = lttng_id_tracker_add(tracker, id);
e0130fab 1870 }
e0130fab
MD
1871 mutex_unlock(&sessions_mutex);
1872 return ret;
1873}
1874
8cdc1a81 1875int lttng_session_untrack_id(struct lttng_kernel_session *session,
d1f652f8 1876 enum tracker_type tracker_type, int id)
e0130fab 1877{
8c0393c3 1878 struct lttng_kernel_id_tracker *tracker;
e0130fab
MD
1879 int ret;
1880
d1f652f8
MD
1881 tracker = get_tracker(session, tracker_type);
1882 if (!tracker)
1883 return -EINVAL;
1884 if (id < -1)
e0130fab
MD
1885 return -EINVAL;
1886 mutex_lock(&sessions_mutex);
d1f652f8
MD
1887 if (id == -1) {
1888 /* untrack all ids: replace by empty tracker. */
1889 ret = lttng_id_tracker_empty_set(tracker);
e0130fab 1890 } else {
d1f652f8 1891 ret = lttng_id_tracker_del(tracker, id);
e0130fab 1892 }
e0130fab
MD
1893 mutex_unlock(&sessions_mutex);
1894 return ret;
1895}
1896
7e6f9ef6 1897static
d1f652f8 1898void *id_list_start(struct seq_file *m, loff_t *pos)
7e6f9ef6 1899{
8c0393c3
MD
1900 struct lttng_kernel_id_tracker *id_tracker = m->private;
1901 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
d1f652f8 1902 struct lttng_id_hash_node *e;
7e6f9ef6
MD
1903 int iter = 0, i;
1904
1905 mutex_lock(&sessions_mutex);
d1f652f8
MD
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];
7e6f9ef6 1909
f934e302 1910 lttng_hlist_for_each_entry(e, head, hlist) {
7e6f9ef6
MD
1911 if (iter++ >= *pos)
1912 return e;
1913 }
1914 }
1915 } else {
d1f652f8 1916 /* ID tracker disabled. */
7e6f9ef6 1917 if (iter >= *pos && iter == 0) {
d1f652f8 1918 return id_tracker_p; /* empty tracker */
7e6f9ef6
MD
1919 }
1920 iter++;
1921 }
1922 /* End of list */
1923 return NULL;
1924}
1925
1926/* Called with sessions_mutex held. */
1927static
d1f652f8 1928void *id_list_next(struct seq_file *m, void *p, loff_t *ppos)
7e6f9ef6 1929{
8c0393c3
MD
1930 struct lttng_kernel_id_tracker *id_tracker = m->private;
1931 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
d1f652f8 1932 struct lttng_id_hash_node *e;
7e6f9ef6
MD
1933 int iter = 0, i;
1934
1935 (*ppos)++;
d1f652f8
MD
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];
7e6f9ef6 1939
f934e302 1940 lttng_hlist_for_each_entry(e, head, hlist) {
7e6f9ef6
MD
1941 if (iter++ >= *ppos)
1942 return e;
1943 }
1944 }
1945 } else {
d1f652f8 1946 /* ID tracker disabled. */
7e6f9ef6 1947 if (iter >= *ppos && iter == 0)
d1f652f8 1948 return p; /* empty tracker */
7e6f9ef6
MD
1949 iter++;
1950 }
1951
1952 /* End of list */
1953 return NULL;
1954}
1955
1956static
d1f652f8 1957void id_list_stop(struct seq_file *m, void *p)
7e6f9ef6
MD
1958{
1959 mutex_unlock(&sessions_mutex);
1960}
1961
1962static
d1f652f8 1963int id_list_show(struct seq_file *m, void *p)
7e6f9ef6 1964{
8c0393c3
MD
1965 struct lttng_kernel_id_tracker *id_tracker = m->private;
1966 struct lttng_kernel_id_tracker_rcu *id_tracker_p = id_tracker->p;
d1f652f8 1967 int id;
7e6f9ef6 1968
d1f652f8 1969 if (p == id_tracker_p) {
7e6f9ef6 1970 /* Tracker disabled. */
d1f652f8 1971 id = -1;
7e6f9ef6 1972 } else {
d1f652f8 1973 const struct lttng_id_hash_node *e = p;
7e6f9ef6 1974
d1f652f8
MD
1975 id = lttng_id_tracker_get_node_id(e);
1976 }
8c0393c3 1977 switch (id_tracker->priv->tracker_type) {
d1f652f8
MD
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);
7e6f9ef6 1998 }
7e6f9ef6
MD
1999 return 0;
2000}
2001
2002static
d1f652f8
MD
2003const 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,
7e6f9ef6
MD
2008};
2009
2010static
d1f652f8 2011int lttng_tracker_ids_list_open(struct inode *inode, struct file *file)
7e6f9ef6 2012{
d1f652f8 2013 return seq_open(file, &lttng_tracker_ids_list_seq_ops);
7e6f9ef6
MD
2014}
2015
2016static
d1f652f8 2017int lttng_tracker_ids_list_release(struct inode *inode, struct file *file)
7e6f9ef6
MD
2018{
2019 struct seq_file *m = file->private_data;
8c0393c3 2020 struct lttng_kernel_id_tracker *id_tracker = m->private;
7e6f9ef6
MD
2021 int ret;
2022
d1f652f8 2023 WARN_ON_ONCE(!id_tracker);
7e6f9ef6 2024 ret = seq_release(inode, file);
d1f652f8 2025 if (!ret)
8c0393c3 2026 fput(id_tracker->priv->session->priv->file);
7e6f9ef6
MD
2027 return ret;
2028}
2029
d1f652f8 2030const struct file_operations lttng_tracker_ids_list_fops = {
7e6f9ef6 2031 .owner = THIS_MODULE,
d1f652f8 2032 .open = lttng_tracker_ids_list_open,
7e6f9ef6
MD
2033 .read = seq_read,
2034 .llseek = seq_lseek,
d1f652f8 2035 .release = lttng_tracker_ids_list_release,
7e6f9ef6
MD
2036};
2037
8cdc1a81 2038int lttng_session_list_tracker_ids(struct lttng_kernel_session *session,
d1f652f8 2039 enum tracker_type tracker_type)
7e6f9ef6 2040{
d1f652f8 2041 struct file *tracker_ids_list_file;
7e6f9ef6
MD
2042 struct seq_file *m;
2043 int file_fd, ret;
2044
2a059b14 2045 file_fd = get_unused_fd_flags(0);
7e6f9ef6
MD
2046 if (file_fd < 0) {
2047 ret = file_fd;
2048 goto fd_error;
2049 }
2050
d1f652f8
MD
2051 tracker_ids_list_file = anon_inode_getfile("[lttng_tracker_ids_list]",
2052 &lttng_tracker_ids_list_fops,
7e6f9ef6 2053 NULL, O_RDWR);
d1f652f8
MD
2054 if (IS_ERR(tracker_ids_list_file)) {
2055 ret = PTR_ERR(tracker_ids_list_file);
7e6f9ef6
MD
2056 goto file_error;
2057 }
8cdc1a81 2058 if (!atomic_long_add_unless(&session->priv->file->f_count, 1, LONG_MAX)) {
98d7281c 2059 ret = -EOVERFLOW;
9c1f4643
MD
2060 goto refcount_error;
2061 }
d1f652f8 2062 ret = lttng_tracker_ids_list_fops.open(NULL, tracker_ids_list_file);
7e6f9ef6
MD
2063 if (ret < 0)
2064 goto open_error;
d1f652f8
MD
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);
7e6f9ef6
MD
2070
2071 return file_fd;
2072
2073open_error:
8cdc1a81 2074 atomic_long_dec(&session->priv->file->f_count);
9c1f4643 2075refcount_error:
d1f652f8 2076 fput(tracker_ids_list_file);
7e6f9ef6
MD
2077file_error:
2078 put_unused_fd(file_fd);
2079fd_error:
2080 return ret;
2081}
2082
3c997079
MD
2083/*
2084 * Enabler management.
2085 */
2086static
4993071a
PP
2087int lttng_match_enabler_star_glob(const char *desc_name,
2088 const char *pattern)
3c997079 2089{
cbc19040
MD
2090 if (!strutils_star_glob_match(pattern, LTTNG_SIZE_MAX,
2091 desc_name, LTTNG_SIZE_MAX))
3c997079
MD
2092 return 0;
2093 return 1;
2094}
2095
2096static
4ecb5ad5
MD
2097int lttng_match_enabler_name(const char *desc_name,
2098 const char *name)
3c997079 2099{
4ecb5ad5 2100 if (strcmp(desc_name, name))
3c997079
MD
2101 return 0;
2102 return 1;
2103}
2104
8bff0fc3
MD
2105static
2106int lttng_desc_match_enabler_check(const struct lttng_kernel_event_desc *desc,
8d554755 2107 struct lttng_event_enabler_common *enabler)
3c997079 2108{
4ecb5ad5 2109 const char *desc_name, *enabler_name;
badfe9f5 2110 bool compat = false, entry = false;
4ecb5ad5
MD
2111
2112 enabler_name = enabler->event_param.name;
2113 switch (enabler->event_param.instrumentation) {
606828e4 2114 case LTTNG_KERNEL_ABI_TRACEPOINT:
437d5aa5 2115 desc_name = desc->event_name;
3b861b22
FD
2116 switch (enabler->format_type) {
2117 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
badfe9f5 2118 return lttng_match_enabler_star_glob(desc_name, enabler_name);
3b861b22 2119 case LTTNG_ENABLER_FORMAT_NAME:
badfe9f5
MD
2120 return lttng_match_enabler_name(desc_name, enabler_name);
2121 default:
2122 return -EINVAL;
2123 }
4ecb5ad5 2124 break;
b4a75708 2125
606828e4 2126 case LTTNG_KERNEL_ABI_SYSCALL:
437d5aa5 2127 desc_name = desc->event_name;
badfe9f5 2128 if (!strncmp(desc_name, "compat_", strlen("compat_"))) {
4ecb5ad5 2129 desc_name += strlen("compat_");
badfe9f5
MD
2130 compat = true;
2131 }
4ecb5ad5
MD
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_");
badfe9f5 2138 entry = true;
4ecb5ad5
MD
2139 } else {
2140 WARN_ON_ONCE(1);
2141 return -EINVAL;
2142 }
badfe9f5 2143 switch (enabler->event_param.u.syscall.entryexit) {
606828e4 2144 case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT:
badfe9f5 2145 break;
606828e4 2146 case LTTNG_KERNEL_ABI_SYSCALL_ENTRY:
badfe9f5
MD
2147 if (!entry)
2148 return 0;
2149 break;
606828e4 2150 case LTTNG_KERNEL_ABI_SYSCALL_EXIT:
badfe9f5
MD
2151 if (entry)
2152 return 0;
2153 break;
2154 default:
2155 return -EINVAL;
2156 }
2157 switch (enabler->event_param.u.syscall.abi) {
606828e4 2158 case LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL:
badfe9f5 2159 break;
606828e4 2160 case LTTNG_KERNEL_ABI_SYSCALL_ABI_NATIVE:
badfe9f5
MD
2161 if (compat)
2162 return 0;
2163 break;
606828e4 2164 case LTTNG_KERNEL_ABI_SYSCALL_ABI_COMPAT:
badfe9f5
MD
2165 if (!compat)
2166 return 0;
2167 break;
2168 default:
2169 return -EINVAL;
2170 }
2171 switch (enabler->event_param.u.syscall.match) {
606828e4 2172 case LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME:
3b861b22
FD
2173 switch (enabler->format_type) {
2174 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
badfe9f5 2175 return lttng_match_enabler_star_glob(desc_name, enabler_name);
3b861b22 2176 case LTTNG_ENABLER_FORMAT_NAME:
badfe9f5
MD
2177 return lttng_match_enabler_name(desc_name, enabler_name);
2178 default:
2179 return -EINVAL;
2180 }
2181 break;
606828e4 2182 case LTTNG_KERNEL_ABI_SYSCALL_MATCH_NR:
badfe9f5
MD
2183 return -EINVAL; /* Not implemented. */
2184 default:
2185 return -EINVAL;
2186 }
4ecb5ad5 2187 break;
b4a75708 2188
fd0402f3
MD
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
99414eaf
MD
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 }
fd0402f3 2248
4ecb5ad5
MD
2249 default:
2250 WARN_ON_ONCE(1);
2251 return -EINVAL;
2252 }
3c997079
MD
2253}
2254
8bff0fc3
MD
2255bool 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
48c210a7
MD
2268static
2269bool 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
2280static
2281int 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
5c6ec66a
MD
2295bool lttng_event_enabler_match_event(struct lttng_event_enabler_common *event_enabler,
2296 struct lttng_kernel_event_common *event)
3c997079 2297{
5c6ec66a
MD
2298 if (event_enabler->event_param.instrumentation != event->priv->instrumentation)
2299 return false;
b2bc0bc8 2300
5c6ec66a
MD
2301 switch (event_enabler->enabler_type) {
2302 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
48c210a7
MD
2303 lttng_fallthrough;
2304 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
5c6ec66a 2305 {
48c210a7
MD
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);
5c6ec66a
MD
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);
48c210a7
MD
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);
5c6ec66a
MD
2319 }
2320 default:
2321 WARN_ON_ONCE(1);
2322 return false;
2323 }
3c997079
MD
2324}
2325
2326static
b2bc0bc8
FD
2327struct lttng_enabler_ref *lttng_enabler_ref(
2328 struct list_head *enablers_ref_list,
8d554755 2329 struct lttng_event_enabler_common *enabler)
3c997079
MD
2330{
2331 struct lttng_enabler_ref *enabler_ref;
2332
b2bc0bc8 2333 list_for_each_entry(enabler_ref, enablers_ref_list, node) {
3c997079
MD
2334 if (enabler_ref->ref == enabler)
2335 return enabler_ref;
2336 }
2337 return NULL;
2338}
2339
3c997079 2340static
b2f63bde 2341void lttng_event_enabler_create_tracepoint_events_if_missing(struct lttng_event_enabler_common *event_enabler)
3c997079 2342{
437d5aa5
MD
2343 struct lttng_kernel_probe_desc *probe_desc;
2344 const struct lttng_kernel_event_desc *desc;
3c997079 2345 struct list_head *probe_list;
c8e14380 2346 int i;
3c997079
MD
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++) {
83006ee0 2356 struct lttng_kernel_event_common *event;
3c997079
MD
2357
2358 desc = probe_desc->event_desc[i];
c8e14380 2359 if (!lttng_desc_match_enabler(desc, event_enabler))
3c997079 2360 continue;
3c997079 2361 /*
83006ee0 2362 * We need to create an event for this event probe.
3c997079 2363 */
44d1600b 2364 event = _lttng_kernel_event_create(event_enabler, desc, NULL);
c3fb484e 2365 if (IS_ERR(event)) {
3e60037b
MD
2366 /* Skip if already found. */
2367 if (PTR_ERR(event) == -EEXIST)
2368 continue;
5a15f70c 2369 printk(KERN_INFO "LTTng: Unable to create event %s\n",
437d5aa5 2370 probe_desc->event_desc[i]->event_name);
3c997079
MD
2371 }
2372 }
2373 }
2374}
2375
fd0402f3
MD
2376/* Try to create the event associated with this kprobe enabler. */
2377static
2378void 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
99414eaf
MD
2391/* Try to create the event associated with this kretprobe enabler. */
2392static
2393void 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
33a39a3c 2438/*
8839618b 2439 * Create event if it is missing and present in the list of tracepoint probes.
33a39a3c
MD
2440 * Should be called with sessions mutex held.
2441 */
2442static
b2f63bde 2443void lttng_event_enabler_create_events_if_missing(struct lttng_event_enabler_common *event_enabler)
33a39a3c 2444{
b2f63bde
MD
2445 int ret;
2446
8839618b 2447 switch (event_enabler->event_param.instrumentation) {
606828e4 2448 case LTTNG_KERNEL_ABI_TRACEPOINT:
b2f63bde 2449 lttng_event_enabler_create_tracepoint_events_if_missing(event_enabler);
33a39a3c 2450 break;
b4a75708 2451
606828e4 2452 case LTTNG_KERNEL_ABI_SYSCALL:
b2f63bde
MD
2453 ret = lttng_event_enabler_create_syscall_events_if_missing(event_enabler);
2454 WARN_ON_ONCE(ret);
33a39a3c 2455 break;
b4a75708 2456
fd0402f3
MD
2457 case LTTNG_KERNEL_ABI_KPROBE:
2458 lttng_event_enabler_create_kprobe_event_if_missing(event_enabler);
2459 break;
2460
99414eaf
MD
2461 case LTTNG_KERNEL_ABI_KRETPROBE:
2462 lttng_event_enabler_create_kretprobe_event_if_missing(event_enabler);
2463 break;
2464
33a39a3c
MD
2465 default:
2466 WARN_ON_ONCE(1);
2467 break;
2468 }
2469}
2470
d619fae9
MD
2471static
2472void 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
1e06b222
MD
2480static
2481void 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:
48c210a7
MD
2486 lttng_fallthrough;
2487 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
1e06b222
MD
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
3c997079 2508/*
b2bc0bc8 2509 * Create events associated with an event_enabler (if not already present),
3c997079
MD
2510 * and add backward reference from the event to the enabler.
2511 * Should be called with sessions mutex held.
2512 */
2513static
3622cd47 2514int lttng_event_enabler_ref_events(struct lttng_event_enabler_common *event_enabler)
3c997079 2515{
3622cd47
MD
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;
3c997079 2518
f245bc9f
MD
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
3622cd47 2526 lttng_syscall_table_set_wildcard_all(event_enabler);
badfe9f5 2527
3c997079 2528 /* First ensure that probe events are created for this enabler. */
b2f63bde 2529 lttng_event_enabler_create_events_if_missing(event_enabler);
3c997079 2530
3622cd47
MD
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;
b01155ba
FD
2534 struct lttng_enabler_ref *enabler_ref;
2535
3622cd47 2536 if (!lttng_event_enabler_match_event(event_enabler, event))
b01155ba
FD
2537 continue;
2538
3622cd47 2539 enabler_ref = lttng_enabler_ref(&event_priv->enablers_ref_head, event_enabler);
b01155ba 2540 if (!enabler_ref) {
4a6c2fbf
MD
2541 int ret;
2542
b01155ba
FD
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
3622cd47
MD
2551 enabler_ref->ref = event_enabler;
2552 list_add(&enabler_ref->node, &event_priv->enablers_ref_head);
4a6c2fbf
MD
2553
2554 ret = lttng_append_event_to_channel_map(event_enabler, event,
2555 event->priv->desc->event_name);
2556 WARN_ON_ONCE(ret);
b01155ba
FD
2557 }
2558
3622cd47
MD
2559 lttng_event_enabler_init_event_filter(event_enabler, event);
2560 lttng_event_enabler_init_event_capture(event_enabler, event);
b01155ba 2561 }
f245bc9f 2562end:
b01155ba
FD
2563 return 0;
2564}
2565
3c997079
MD
2566/*
2567 * Called at module load: connect the probe on all enablers matching
2568 * this event.
2569 * Called with sessions lock held.
2570 */
2571int lttng_fix_pending_events(void)
2572{
8cdc1a81 2573 struct lttng_kernel_session_private *session_priv;
3c997079 2574
24909af2 2575 list_for_each_entry(session_priv, &sessions, node)
8cdc1a81 2576 lttng_session_lazy_sync_event_enablers(session_priv->pub);
3c997079
MD
2577 return 0;
2578}
2579
b01155ba
FD
2580static bool lttng_event_notifier_group_has_active_event_notifiers(
2581 struct lttng_event_notifier_group *event_notifier_group)
2582{
09710b83 2583 struct lttng_event_enabler_common *event_enabler;
b01155ba 2584
09710b83
MD
2585 list_for_each_entry(event_enabler, &event_notifier_group->enablers_head, node) {
2586 if (event_enabler->enabled)
b01155ba
FD
2587 return true;
2588 }
2589 return false;
2590}
2591
2592bool 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
2603int 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
1ae083ba 2612struct lttng_event_recorder_enabler *lttng_event_recorder_enabler_create(
b2bc0bc8 2613 enum lttng_enabler_format_type format_type,
606828e4 2614 struct lttng_kernel_abi_event *event_param,
f7d06400 2615 struct lttng_kernel_channel_buffer *chan)
3c997079 2616{
1ae083ba 2617 struct lttng_event_recorder_enabler *event_enabler;
3c997079 2618
b2bc0bc8
FD
2619 event_enabler = kzalloc(sizeof(*event_enabler), GFP_KERNEL);
2620 if (!event_enabler)
3c997079 2621 return NULL;
4a46ca39
MD
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));
b2bc0bc8 2627 event_enabler->chan = chan;
4a46ca39
MD
2628 event_enabler->parent.chan = &chan->parent;
2629
3c997079 2630 /* ctx left NULL */
4a46ca39 2631 event_enabler->parent.parent.enabled = 0;
def1e304
MD
2632 return event_enabler;
2633}
2634
6ef1e2f5
MD
2635struct 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,
7b0f1e69 2638 struct lttng_kernel_counter_key *counter_key,
6ef1e2f5
MD
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;
7b0f1e69
MD
2653 if (create_counter_key_from_kernel(&event_enabler->key, counter_key)) {
2654 kfree(event_enabler);
2655 return NULL;
6ef1e2f5
MD
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
def1e304 2664void lttng_event_enabler_session_add(struct lttng_kernel_session *session,
6ef1e2f5 2665 struct lttng_event_enabler_session_common *event_enabler)
def1e304 2666{
3c997079 2667 mutex_lock(&sessions_mutex);
6ef1e2f5
MD
2668 list_add(&event_enabler->parent.node, &session->priv->enablers_head);
2669 event_enabler->parent.published = true;
def1e304 2670 lttng_session_lazy_sync_event_enablers(session);
3c997079 2671 mutex_unlock(&sessions_mutex);
3c997079
MD
2672}
2673
7b25ab0e 2674int lttng_event_enabler_enable(struct lttng_event_enabler_common *event_enabler)
3c997079
MD
2675{
2676 mutex_lock(&sessions_mutex);
7b25ab0e
MD
2677 event_enabler->enabled = 1;
2678 lttng_event_enabler_sync(event_enabler);
3c997079
MD
2679 mutex_unlock(&sessions_mutex);
2680 return 0;
2681}
2682
7b25ab0e 2683int lttng_event_enabler_disable(struct lttng_event_enabler_common *event_enabler)
3c997079
MD
2684{
2685 mutex_lock(&sessions_mutex);
7b25ab0e
MD
2686 event_enabler->enabled = 0;
2687 lttng_event_enabler_sync(event_enabler);
3c997079
MD
2688 mutex_unlock(&sessions_mutex);
2689 return 0;
2690}
2691
b2bc0bc8 2692static
8d554755 2693int lttng_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *enabler,
606828e4 2694 struct lttng_kernel_abi_filter_bytecode __user *bytecode)
07dfc1d0 2695{
d64ca521 2696 struct lttng_kernel_bytecode_node *bytecode_node;
07dfc1d0
MD
2697 uint32_t bytecode_len;
2698 int ret;
2699
2700 ret = get_user(bytecode_len, &bytecode->len);
2701 if (ret)
2702 return ret;
52cfcdf3 2703 bytecode_node = lttng_kvzalloc(sizeof(*bytecode_node) + bytecode_len,
07dfc1d0
MD
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;
b2bc0bc8 2711
8a445457 2712 bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_FILTER;
07dfc1d0
MD
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);
b2bc0bc8 2717
07dfc1d0
MD
2718 return 0;
2719
2720error_free:
52cfcdf3 2721 lttng_kvfree(bytecode_node);
07dfc1d0
MD
2722 return ret;
2723}
2724
6048044f 2725int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler_common *event_enabler,
606828e4 2726 struct lttng_kernel_abi_filter_bytecode __user *bytecode)
b2bc0bc8
FD
2727{
2728 int ret;
6048044f 2729 ret = lttng_enabler_attach_filter_bytecode(event_enabler, bytecode);
b2bc0bc8
FD
2730 if (ret)
2731 goto error;
7b25ab0e 2732 lttng_event_enabler_sync(event_enabler);
b2bc0bc8
FD
2733 return 0;
2734
2735error:
2736 return ret;
2737}
2738
e2d5dbc7 2739int lttng_event_add_callsite(struct lttng_kernel_event_common *event,
606828e4 2740 struct lttng_kernel_abi_event_callsite __user *callsite)
3aed4dca
FD
2741{
2742
e2d5dbc7 2743 switch (event->priv->instrumentation) {
606828e4 2744 case LTTNG_KERNEL_ABI_UPROBE:
e2d5dbc7 2745 return lttng_uprobes_event_add_callsite(event, callsite);
3aed4dca
FD
2746 default:
2747 return -EINVAL;
2748 }
2749}
2750
3c997079 2751static
8d554755 2752void lttng_enabler_destroy(struct lttng_event_enabler_common *enabler)
3c997079 2753{
d64ca521 2754 struct lttng_kernel_bytecode_node *filter_node, *tmp_filter_node;
07dfc1d0
MD
2755
2756 /* Destroy filter bytecode */
2757 list_for_each_entry_safe(filter_node, tmp_filter_node,
2758 &enabler->filter_bytecode_head, node) {
52cfcdf3 2759 lttng_kvfree(filter_node);
07dfc1d0 2760 }
b2bc0bc8
FD
2761}
2762
44b1abdc 2763void lttng_event_enabler_destroy(struct lttng_event_enabler_common *event_enabler)
b2bc0bc8 2764{
09710b83
MD
2765 lttng_enabler_destroy(event_enabler);
2766 if (event_enabler->published)
2767 list_del(&event_enabler->node);
2768
44b1abdc
MD
2769 switch (event_enabler->enabler_type) {
2770 case LTTNG_EVENT_ENABLER_TYPE_RECORDER:
2771 {
2772 struct lttng_event_recorder_enabler *event_recorder_enabler =
4a46ca39 2773 container_of(event_enabler, struct lttng_event_recorder_enabler, parent.parent);
44b1abdc 2774
44b1abdc
MD
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);
07dfc1d0 2782
44b1abdc
MD
2783 kfree(event_notifier_enabler);
2784 break;
2785 }
48c210a7
MD
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
7b0f1e69 2791 destroy_counter_key(event_counter_enabler->key);
48c210a7
MD
2792 kfree(event_counter_enabler);
2793 break;
2794 }
44b1abdc
MD
2795 default:
2796 WARN_ON_ONCE(1);
2797 }
3c997079
MD
2798}
2799
dffef45d 2800struct lttng_event_notifier_enabler *lttng_event_notifier_enabler_create(
dffef45d 2801 enum lttng_enabler_format_type format_type,
1bbb5b2d
MD
2802 struct lttng_kernel_abi_event_notifier *event_notifier_param,
2803 struct lttng_event_notifier_group *event_notifier_group)
dffef45d
FD
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
0bb716a8 2811 event_notifier_enabler->parent.enabler_type = LTTNG_EVENT_ENABLER_TYPE_NOTIFIER;
5b9817ae
MD
2812 event_notifier_enabler->parent.format_type = format_type;
2813 INIT_LIST_HEAD(&event_notifier_enabler->parent.filter_bytecode_head);
99d223ad
FD
2814 INIT_LIST_HEAD(&event_notifier_enabler->capture_bytecode_head);
2815
99f52fcc 2816 event_notifier_enabler->error_counter_index = event_notifier_param->error_counter_index;
99d223ad 2817 event_notifier_enabler->num_captures = 0;
dffef45d 2818
5b9817ae
MD
2819 memcpy(&event_notifier_enabler->parent.event_param, &event_notifier_param->event,
2820 sizeof(event_notifier_enabler->parent.event_param));
dffef45d 2821
5b9817ae
MD
2822 event_notifier_enabler->parent.enabled = 0;
2823 event_notifier_enabler->parent.user_token = event_notifier_param->event.token;
dffef45d 2824 event_notifier_enabler->group = event_notifier_group;
1bbb5b2d
MD
2825 return event_notifier_enabler;
2826}
dffef45d 2827
1bbb5b2d
MD
2828void lttng_event_notifier_enabler_group_add(struct lttng_event_notifier_group *event_notifier_group,
2829 struct lttng_event_notifier_enabler *event_notifier_enabler)
2830{
dffef45d 2831 mutex_lock(&sessions_mutex);
09710b83
MD
2832 list_add(&event_notifier_enabler->parent.node, &event_notifier_enabler->group->enablers_head);
2833 event_notifier_enabler->parent.published = true;
b01155ba 2834 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
dffef45d 2835 mutex_unlock(&sessions_mutex);
dffef45d
FD
2836}
2837
99d223ad
FD
2838int lttng_event_notifier_enabler_attach_capture_bytecode(
2839 struct lttng_event_notifier_enabler *event_notifier_enabler,
606828e4 2840 struct lttng_kernel_abi_capture_bytecode __user *bytecode)
99d223ad 2841{
d64ca521 2842 struct lttng_kernel_bytecode_node *bytecode_node;
8d554755 2843 struct lttng_event_enabler_common *enabler =
99d223ad
FD
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
8a445457 2862 bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_CAPTURE;
99d223ad
FD
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
2874error_free:
2875 lttng_kvfree(bytecode_node);
2876end:
2877 return ret;
2878}
2879
cc5719b1
MD
2880static
2881void 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
2905static
2906void lttng_event_sync_capture_state(struct lttng_kernel_event_common *event)
2907{
2908 switch (event->type) {
2909 case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
4fa39e4e
MD
2910 lttng_fallthrough;
2911 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
cc5719b1
MD
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
a0c6ad2e
MD
2933static
2934bool 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:
fd0402f3
MD
2943 lttng_fallthrough;
2944 case LTTNG_KERNEL_ABI_KPROBE:
99414eaf
MD
2945 lttng_fallthrough;
2946 case LTTNG_KERNEL_ABI_KRETPROBE:
a0c6ad2e
MD
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:
4fa39e4e
MD
2962 lttng_fallthrough;
2963 case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
a0c6ad2e 2964 {
4fa39e4e
MD
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);
a0c6ad2e
MD
2967
2968 /*
2969 * Enabled state is based on union of enablers, with
2970 * intersection of session and channel transient enable
2971 * states.
2972 */
4fa39e4e 2973 return enabled && event_session_common_priv->chan->session->priv->tstate && event_session_common_priv->chan->priv->tstate;
a0c6ad2e
MD
2974 }
2975 case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
2976 return enabled;
2977 default:
2978 WARN_ON_ONCE(1);
2979 return false;
2980 }
2981}
2982
2983static
2984bool 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:
fd0402f3
MD
2990 lttng_fallthrough;
2991 case LTTNG_KERNEL_ABI_KPROBE:
99414eaf
MD
2992 lttng_fallthrough;
2993 case LTTNG_KERNEL_ABI_KRETPROBE:
a0c6ad2e
MD
2994 return true;
2995
2996 default:
2997 /* Not handled with lazy sync. */
2998 return false;
2999 }
3000}
3001
3c997079 3002/*
3c997079
MD
3003 * Should be called with sessions mutex held.
3004 */
3005static
a0c6ad2e
MD
3006void lttng_sync_event_list(struct list_head *event_enabler_list,
3007 struct list_head *event_list)
3c997079 3008{
a0c6ad2e 3009 struct lttng_kernel_event_common_private *event_priv;
09710b83 3010 struct lttng_event_enabler_common *event_enabler;
3c997079 3011
a0c6ad2e 3012 list_for_each_entry(event_enabler, event_enabler_list, node)
09710b83 3013 lttng_event_enabler_ref_events(event_enabler);
a0c6ad2e 3014
3c997079
MD
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 */
a0c6ad2e
MD
3020 list_for_each_entry(event_priv, event_list, node) {
3021 struct lttng_kernel_event_common *event = event_priv->pub;
3022 bool enabled;
b4a75708 3023
a0c6ad2e 3024 if (!lttng_event_is_lazy_sync(event))
3c997079 3025 continue;
3c997079 3026
a0c6ad2e
MD
3027 enabled = lttng_get_event_enabled_state(event);
3028 WRITE_ONCE(event->enabled, enabled);
3c997079 3029 /*
a0c6ad2e 3030 * Sync tracepoint registration with event enabled state.
3c997079
MD
3031 */
3032 if (enabled) {
6a338ba4
MD
3033 if (!event_priv->registered)
3034 register_event(event);
3c997079 3035 } else {
6a338ba4
MD
3036 if (event_priv->registered)
3037 unregister_event(event);
3c997079 3038 }
07dfc1d0 3039
a0c6ad2e
MD
3040 lttng_event_sync_filter_state(event);
3041 lttng_event_sync_capture_state(event);
3c997079
MD
3042 }
3043}
3044
a0c6ad2e
MD
3045/*
3046 * lttng_session_sync_event_enablers should be called just before starting a
3047 * session.
3048 */
3049static
3050void lttng_session_sync_event_enablers(struct lttng_kernel_session *session)
3051{
ba5ed2bc 3052 lttng_sync_event_list(&session->priv->enablers_head, &session->priv->events_head);
a0c6ad2e
MD
3053}
3054
3c997079
MD
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 */
3062static
8cdc1a81 3063void lttng_session_lazy_sync_event_enablers(struct lttng_kernel_session *session)
3c997079
MD
3064{
3065 /* We can skip if session is not active */
3066 if (!session->active)
3067 return;
b2bc0bc8 3068 lttng_session_sync_event_enablers(session);
3c997079
MD
3069}
3070
b01155ba
FD
3071static
3072void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group)
3073{
a0c6ad2e 3074 lttng_sync_event_list(&event_notifier_group->enablers_head, &event_notifier_group->event_notifiers_head);
b01155ba
FD
3075}
3076
7b25ab0e
MD
3077static
3078void 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:
48c210a7
MD
3082 lttng_fallthrough;
3083 case LTTNG_EVENT_ENABLER_TYPE_COUNTER:
7b25ab0e 3084 {
48c210a7
MD
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);
7b25ab0e
MD
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
1ec3f75a 3102/*
d83004aa
JD
3103 * Serialize at most one packet worth of metadata into a metadata
3104 * channel.
92d9f5e6
MD
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.
35097f36
JD
3111 * Returns the number of bytes written in the channel, 0 if no data
3112 * was written and a negative value on error.
1ec3f75a 3113 */
b3b8072b 3114int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
860c213b 3115 struct lttng_kernel_ring_buffer_channel *chan, bool *coherent)
d83004aa 3116{
8a57ec02 3117 struct lttng_kernel_ring_buffer_ctx ctx;
d83004aa
JD
3118 int ret = 0;
3119 size_t len, reserve_len;
3120
f613e3e6 3121 /*
92d9f5e6
MD
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.
f613e3e6 3129 */
92d9f5e6 3130 mutex_lock(&stream->metadata_cache->lock);
f613e3e6
MD
3131 WARN_ON(stream->metadata_in < stream->metadata_out);
3132 if (stream->metadata_in != stream->metadata_out)
de23d59d 3133 goto end;
f613e3e6 3134
9616f0bf
JD
3135 /* Metadata regenerated, change the version. */
3136 if (stream->metadata_cache->version != stream->version)
3137 stream->version = stream->metadata_cache->version;
3138
d83004aa 3139 len = stream->metadata_cache->metadata_written -
f613e3e6 3140 stream->metadata_in;
9de2c215 3141 if (!len)
de23d59d 3142 goto end;
d83004aa 3143 reserve_len = min_t(size_t,
4a399b76 3144 stream->transport->ops.priv->packet_avail_size(chan),
d83004aa 3145 len);
a775608d 3146 lib_ring_buffer_ctx_init(&ctx, chan, reserve_len,
b1199bd3 3147 sizeof(char), NULL);
d83004aa
JD
3148 /*
3149 * If reservation failed, return an error to the caller.
3150 */
c2fb9c1c 3151 ret = stream->transport->ops.event_reserve(&ctx);
d83004aa
JD
3152 if (ret != 0) {
3153 printk(KERN_WARNING "LTTng: Metadata event reservation failed\n");
8b97fd42 3154 stream->coherent = false;
d83004aa
JD
3155 goto end;
3156 }
b3b8072b 3157 stream->transport->ops.event_write(&ctx,
f613e3e6 3158 stream->metadata_cache->data + stream->metadata_in,
f5ffbd77 3159 reserve_len, 1);
b3b8072b 3160 stream->transport->ops.event_commit(&ctx);
f613e3e6 3161 stream->metadata_in += reserve_len;
3e75e2a7 3162 if (reserve_len < len)
8b97fd42
MD
3163 stream->coherent = false;
3164 else
3165 stream->coherent = true;
d83004aa
JD
3166 ret = reserve_len;
3167
3168end:
8b97fd42
MD
3169 if (coherent)
3170 *coherent = stream->coherent;
92d9f5e6 3171 mutex_unlock(&stream->metadata_cache->lock);
d83004aa
JD
3172 return ret;
3173}
3174
8b97fd42 3175static
8cdc1a81 3176void lttng_metadata_begin(struct lttng_kernel_session *session)
8b97fd42 3177{
8cdc1a81
MD
3178 if (atomic_inc_return(&session->priv->metadata_cache->producing) == 1)
3179 mutex_lock(&session->priv->metadata_cache->lock);
8b97fd42
MD
3180}
3181
3182static
8cdc1a81 3183void lttng_metadata_end(struct lttng_kernel_session *session)
8b97fd42 3184{
8cdc1a81
MD
3185 WARN_ON_ONCE(!atomic_read(&session->priv->metadata_cache->producing));
3186 if (atomic_dec_return(&session->priv->metadata_cache->producing) == 0) {
3e75e2a7
MD
3187 struct lttng_metadata_stream *stream;
3188
94ac1e17 3189 list_for_each_entry(stream, &session->priv->metadata_cache->metadata_stream, node)
3e75e2a7 3190 wake_up_interruptible(&stream->read_wait);
8cdc1a81 3191 mutex_unlock(&session->priv->metadata_cache->lock);
3e75e2a7 3192 }
8b97fd42
MD
3193}
3194
d83004aa
JD
3195/*
3196 * Write the metadata to the metadata cache.
3197 * Must be called with sessions_mutex held.
92d9f5e6
MD
3198 * The metadata cache lock protects us from concurrent read access from
3199 * thread outputting metadata content to ring buffer.
8b97fd42
MD
3200 * The content of the printf is printed as a single atomic metadata
3201 * transaction.
d83004aa 3202 */
435454a7 3203static
8cdc1a81 3204int lttng_metadata_printf(struct lttng_kernel_session *session,
c099397a
MD
3205 const char *fmt, ...)
3206{
c099397a 3207 char *str;
d83004aa 3208 size_t len;
c099397a
MD
3209 va_list ap;
3210
585e5dcc 3211 WARN_ON_ONCE(!LTTNG_READ_ONCE(session->active));
c099397a
MD
3212
3213 va_start(ap, fmt);
3214 str = kvasprintf(GFP_KERNEL, fmt, ap);
3215 va_end(ap);
3216 if (!str)
3217 return -ENOMEM;
3218
1ec3f75a 3219 len = strlen(str);
8cdc1a81
MD
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) {
d83004aa
JD
3223 char *tmp_cache_realloc;
3224 unsigned int tmp_cache_alloc_size;
3225
3226 tmp_cache_alloc_size = max_t(unsigned int,
8cdc1a81
MD
3227 session->priv->metadata_cache->cache_alloc + len,
3228 session->priv->metadata_cache->cache_alloc << 1);
0ca42eb7 3229 tmp_cache_realloc = vzalloc(tmp_cache_alloc_size);
d83004aa
JD
3230 if (!tmp_cache_realloc)
3231 goto err;
8cdc1a81 3232 if (session->priv->metadata_cache->data) {
a606b6e8 3233 memcpy(tmp_cache_realloc,
8cdc1a81
MD
3234 session->priv->metadata_cache->data,
3235 session->priv->metadata_cache->cache_alloc);
3236 vfree(session->priv->metadata_cache->data);
a606b6e8
ML
3237 }
3238
8cdc1a81
MD
3239 session->priv->metadata_cache->cache_alloc = tmp_cache_alloc_size;
3240 session->priv->metadata_cache->data = tmp_cache_realloc;
c099397a 3241 }
8cdc1a81
MD
3242 memcpy(session->priv->metadata_cache->data +
3243 session->priv->metadata_cache->metadata_written,
d83004aa 3244 str, len);
8cdc1a81 3245 session->priv->metadata_cache->metadata_written += len;
c099397a 3246 kfree(str);
d83004aa 3247
d83004aa
JD
3248 return 0;
3249
3250err:
3251 kfree(str);
3252 return -ENOMEM;
c099397a
MD
3253}
3254
f513b2bf 3255static
8cdc1a81 3256int print_tabs(struct lttng_kernel_session *session, size_t nesting)
f513b2bf
MD
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
ceabb767 3271static
8cdc1a81 3272int lttng_field_name_statedump(struct lttng_kernel_session *session,
437d5aa5 3273 const struct lttng_kernel_event_field *field,
ceabb767
MD
3274 size_t nesting)
3275{
3276 return lttng_metadata_printf(session, " _%s;\n", field->name);
3277}
3278
3279static
8cdc1a81 3280int _lttng_integer_type_statedump(struct lttng_kernel_session *session,
437d5aa5
MD
3281 const struct lttng_kernel_type_integer *type,
3282 enum lttng_kernel_string_encoding parent_encoding,
ceabb767
MD
3283 size_t nesting)
3284{
3285 int ret;
3286
ceabb767
MD
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 }",
437d5aa5
MD
3292 type->size,
3293 type->alignment,
3294 type->signedness,
3295 (parent_encoding == lttng_kernel_string_encoding_none)
ceabb767 3296 ? "none"
437d5aa5 3297 : (parent_encoding == lttng_kernel_string_encoding_UTF8)
ceabb767
MD
3298 ? "UTF8"
3299 : "ASCII",
437d5aa5 3300 type->base,
ceabb767 3301#if __BYTE_ORDER == __BIG_ENDIAN
437d5aa5 3302 type->reverse_byte_order ? " byte_order = le;" : ""
ceabb767 3303#else
437d5aa5 3304 type->reverse_byte_order ? " byte_order = be;" : ""
ceabb767
MD
3305#endif
3306 );
3307 return ret;
3308}
3309
f513b2bf
MD
3310/*
3311 * Must be called with sessions_mutex held.
3312 */
3313static
8cdc1a81 3314int _lttng_struct_type_statedump(struct lttng_kernel_session *session,
437d5aa5 3315 const struct lttng_kernel_type_struct *type,
f513b2bf
MD
3316 size_t nesting)
3317{
51ef4536 3318 const char *prev_field_name = NULL;
f513b2bf
MD
3319 int ret;
3320 uint32_t i, nr_fields;
ceabb767
MD
3321 unsigned int alignment;
3322
f513b2bf
MD
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;
437d5aa5 3330 nr_fields = type->nr_fields;
f513b2bf 3331 for (i = 0; i < nr_fields; i++) {
437d5aa5 3332 const struct lttng_kernel_event_field *iter_field;
f513b2bf 3333
437d5aa5 3334 iter_field = type->fields[i];
51ef4536 3335 ret = _lttng_field_statedump(session, iter_field, nesting + 1, &prev_field_name);
f513b2bf
MD
3336 if (ret)
3337 return ret;
3338 }
3339 ret = print_tabs(session, nesting);
3340 if (ret)
3341 return ret;
437d5aa5 3342 alignment = type->alignment;
ceabb767
MD
3343 if (alignment) {
3344 ret = lttng_metadata_printf(session,
3345 "} align(%u)",
3346 alignment);
3347 } else {
3348 ret = lttng_metadata_printf(session,
3349 "}");
3350 }
f513b2bf
MD
3351 return ret;
3352}
3353
3354/*
3355 * Must be called with sessions_mutex held.
3356 */
3357static
8cdc1a81 3358int _lttng_struct_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3359 const struct lttng_kernel_event_field *field,
f513b2bf
MD
3360 size_t nesting)
3361{
3362 int ret;
3363
3364 ret = _lttng_struct_type_statedump(session,
437d5aa5 3365 lttng_kernel_get_type_struct(field->type), nesting);
f513b2bf
MD
3366 if (ret)
3367 return ret;
ceabb767 3368 return lttng_field_name_statedump(session, field, nesting);
f513b2bf
MD
3369}
3370
65c85aa6
MD
3371/*
3372 * Must be called with sessions_mutex held.
3373 */
3374static
8cdc1a81 3375int _lttng_variant_type_statedump(struct lttng_kernel_session *session,
437d5aa5 3376 const struct lttng_kernel_type_variant *type,
51ef4536
MD
3377 size_t nesting,
3378 const char *prev_field_name)
65c85aa6 3379{
51ef4536 3380 const char *tag_name;
65c85aa6
MD
3381 int ret;
3382 uint32_t i, nr_choices;
3383
51ef4536
MD
3384 tag_name = type->tag_name;
3385 if (!tag_name)
3386 tag_name = prev_field_name;
3387 if (!tag_name)
3388 return -EINVAL;
ceabb767
MD
3389 /*
3390 * CTF 1.8 does not allow expressing nonzero variant alignment in a nestable way.
3391 */
437d5aa5 3392 if (type->alignment != 0)
ceabb767 3393 return -EINVAL;
65c85aa6
MD
3394 ret = print_tabs(session, nesting);
3395 if (ret)
3396 return ret;
3397 ret = lttng_metadata_printf(session,
3398 "variant <_%s> {\n",
51ef4536 3399 tag_name);
65c85aa6
MD
3400 if (ret)
3401 return ret;
437d5aa5 3402 nr_choices = type->nr_choices;
65c85aa6 3403 for (i = 0; i < nr_choices; i++) {
437d5aa5 3404 const struct lttng_kernel_event_field *iter_field;
65c85aa6 3405
437d5aa5 3406 iter_field = type->choices[i];
51ef4536 3407 ret = _lttng_field_statedump(session, iter_field, nesting + 1, NULL);
65c85aa6
MD
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 */
3422static
8cdc1a81 3423int _lttng_variant_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3424 const struct lttng_kernel_event_field *field,
51ef4536
MD
3425 size_t nesting,
3426 const char *prev_field_name)
65c85aa6
MD
3427{
3428 int ret;
3429
3430 ret = _lttng_variant_type_statedump(session,
51ef4536
MD
3431 lttng_kernel_get_type_variant(field->type), nesting,
3432 prev_field_name);
65c85aa6
MD
3433 if (ret)
3434 return ret;
ceabb767 3435 return lttng_field_name_statedump(session, field, nesting);
65c85aa6
MD
3436}
3437
f513b2bf
MD
3438/*
3439 * Must be called with sessions_mutex held.
3440 */
3441static
8cdc1a81 3442int _lttng_array_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3443 const struct lttng_kernel_event_field *field,
f513b2bf
MD
3444 size_t nesting)
3445{
3446 int ret;
437d5aa5
MD
3447 const struct lttng_kernel_type_array *array_type;
3448 const struct lttng_kernel_type_common *elem_type;
f513b2bf 3449
437d5aa5
MD
3450 array_type = lttng_kernel_get_type_array(field->type);
3451 WARN_ON_ONCE(!array_type);
ceabb767 3452
437d5aa5 3453 if (array_type->alignment) {
ceabb767 3454 ret = print_tabs(session, nesting);
f513b2bf
MD
3455 if (ret)
3456 return ret;
ceabb767
MD
3457 ret = lttng_metadata_printf(session,
3458 "struct { } align(%u) _%s_padding;\n",
437d5aa5 3459 array_type->alignment * CHAR_BIT,
ceabb767
MD
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 */
437d5aa5 3468 elem_type = array_type->elem_type;
12bb2edb
MD
3469 switch (elem_type->type) {
3470 case lttng_kernel_type_integer:
437d5aa5
MD
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);
65c85aa6
MD
3475 if (ret)
3476 return ret;
3477 break;
ceabb767 3478
f513b2bf
MD
3479 default:
3480 return -EINVAL;
3481 }
3482 ret = lttng_metadata_printf(session,
3483 " _%s[%u];\n",
3484 field->name,
437d5aa5 3485 array_type->length);
f513b2bf
MD
3486 return ret;
3487}
3488
3489/*
3490 * Must be called with sessions_mutex held.
3491 */
3492static
8cdc1a81 3493int _lttng_sequence_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3494 const struct lttng_kernel_event_field *field,
51ef4536
MD
3495 size_t nesting,
3496 const char *prev_field_name)
f513b2bf
MD
3497{
3498 int ret;
3499 const char *length_name;
437d5aa5
MD
3500 const struct lttng_kernel_type_sequence *sequence_type;
3501 const struct lttng_kernel_type_common *elem_type;
f513b2bf 3502
437d5aa5
MD
3503 sequence_type = lttng_kernel_get_type_sequence(field->type);
3504 WARN_ON_ONCE(!sequence_type);
f513b2bf 3505
437d5aa5 3506 length_name = sequence_type->length_name;
51ef4536
MD
3507 if (!length_name)
3508 length_name = prev_field_name;
3509 if (!length_name)
3510 return -EINVAL;
ceabb767 3511
437d5aa5 3512 if (sequence_type->alignment) {
ceabb767 3513 ret = print_tabs(session, nesting);
f513b2bf
MD
3514 if (ret)
3515 return ret;
ceabb767
MD
3516 ret = lttng_metadata_printf(session,
3517 "struct { } align(%u) _%s_padding;\n",
437d5aa5 3518 sequence_type->alignment * CHAR_BIT,
ceabb767
MD
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 */
437d5aa5 3528 elem_type = sequence_type->elem_type;
12bb2edb
MD
3529 switch (elem_type->type) {
3530 case lttng_kernel_type_integer:
437d5aa5
MD
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);
65c85aa6
MD
3535 if (ret)
3536 return ret;
3537 break;
ceabb767 3538
f513b2bf
MD
3539 default:
3540 return -EINVAL;
3541 }
3542 ret = lttng_metadata_printf(session,
3543 " _%s[ _%s ];\n",
3544 field->name,
51ef4536 3545 length_name);
f513b2bf
MD
3546 return ret;
3547}
3548
141ddf28
MD
3549/*
3550 * Must be called with sessions_mutex held.
3551 */
3552static
8cdc1a81 3553int _lttng_enum_type_statedump(struct lttng_kernel_session *session,
437d5aa5 3554 const struct lttng_kernel_type_enum *type,
141ddf28
MD
3555 size_t nesting)
3556{
d96a4a7a 3557 const struct lttng_kernel_enum_desc *enum_desc;
437d5aa5 3558 const struct lttng_kernel_type_common *container_type;
141ddf28
MD
3559 int ret;
3560 unsigned int i, nr_entries;
3561
437d5aa5 3562 container_type = type->container_type;
12bb2edb 3563 if (container_type->type != lttng_kernel_type_integer) {
ceabb767
MD
3564 ret = -EINVAL;
3565 goto end;
3566 }
437d5aa5 3567 enum_desc = type->desc;
141ddf28
MD
3568 nr_entries = enum_desc->nr_entries;
3569
3570 ret = print_tabs(session, nesting);
3571 if (ret)
3572 goto end;
ceabb767
MD
3573 ret = lttng_metadata_printf(session, "enum : ");
3574 if (ret)
3575 goto end;
437d5aa5
MD
3576 ret = _lttng_integer_type_statedump(session, lttng_kernel_get_type_integer(container_type),
3577 lttng_kernel_string_encoding_none, 0);
141ddf28 3578 if (ret)
ceabb767
MD
3579 goto end;
3580 ret = lttng_metadata_printf(session, " {\n");
3581 if (ret)
3582 goto end;
141ddf28
MD
3583 /* Dump all entries */
3584 for (i = 0; i < nr_entries; i++) {
437d5aa5 3585 const struct lttng_kernel_enum_entry *entry = enum_desc->entries[i];
141ddf28
MD
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 }
08ad1061
PP
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;
141ddf28 3625 } else {
7c559490
MD
3626 ret = lttng_metadata_printf(session,
3627 " = ");
3628 if (ret)
3629 goto end;
3630 if (entry->start.signedness)
141ddf28 3631 ret = lttng_metadata_printf(session,
7c559490
MD
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) {
141ddf28 3641 ret = lttng_metadata_printf(session,
7c559490
MD
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 }
141ddf28 3653 }
7c559490
MD
3654 if (ret)
3655 goto end;
141ddf28 3656 }
141ddf28
MD
3657 }
3658 ret = print_tabs(session, nesting);
3659 if (ret)
3660 goto end;
ceabb767 3661 ret = lttng_metadata_printf(session, "}");
141ddf28
MD
3662end:
3663 return ret;
3664}
3665
d83004aa
JD
3666/*
3667 * Must be called with sessions_mutex held.
3668 */
c099397a 3669static
8cdc1a81 3670int _lttng_enum_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3671 const struct lttng_kernel_event_field *field,
ceabb767
MD
3672 size_t nesting)
3673{
3674 int ret;
437d5aa5 3675 const struct lttng_kernel_type_enum *enum_type;
ceabb767 3676
437d5aa5
MD
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);
ceabb767
MD
3680 if (ret)
3681 return ret;
3682 return lttng_field_name_statedump(session, field, nesting);
3683}
3684
3685static
8cdc1a81 3686int _lttng_integer_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3687 const struct lttng_kernel_event_field *field,
ceabb767
MD
3688 size_t nesting)
3689{
3690 int ret;
3691
437d5aa5
MD
3692 ret = _lttng_integer_type_statedump(session, lttng_kernel_get_type_integer(field->type),
3693 lttng_kernel_string_encoding_none, nesting);
ceabb767
MD
3694 if (ret)
3695 return ret;
3696 return lttng_field_name_statedump(session, field, nesting);
3697}
3698
3699static
8cdc1a81 3700int _lttng_string_type_statedump(struct lttng_kernel_session *session,
437d5aa5 3701 const struct lttng_kernel_type_string *type,
ceabb767
MD
3702 size_t nesting)
3703{
3704 int ret;
3705
ceabb767
MD
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",
437d5aa5 3712 type->encoding == lttng_kernel_string_encoding_ASCII ?
ceabb767
MD
3713 " { encoding = ASCII; }" : "");
3714 return ret;
3715}
3716
3717static
8cdc1a81 3718int _lttng_string_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3719 const struct lttng_kernel_event_field *field,
f513b2bf 3720 size_t nesting)
ceabb767 3721{
437d5aa5 3722 const struct lttng_kernel_type_string *string_type;
ceabb767
MD
3723 int ret;
3724
437d5aa5
MD
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);
ceabb767
MD
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 */
3736static
8cdc1a81 3737int _lttng_type_statedump(struct lttng_kernel_session *session,
437d5aa5
MD
3738 const struct lttng_kernel_type_common *type,
3739 enum lttng_kernel_string_encoding parent_encoding,
ceabb767 3740 size_t nesting)
c099397a 3741{
c099397a 3742 int ret = 0;
c099397a 3743
12bb2edb
MD
3744 switch (type->type) {
3745 case lttng_kernel_type_integer:
437d5aa5
MD
3746 ret = _lttng_integer_type_statedump(session,
3747 lttng_kernel_get_type_integer(type),
3748 parent_encoding, nesting);
8070f5c0 3749 break;
437d5aa5
MD
3750 case lttng_kernel_type_enum:
3751 ret = _lttng_enum_type_statedump(session,
3752 lttng_kernel_get_type_enum(type),
3753 nesting);
8070f5c0 3754 break;
12bb2edb 3755 case lttng_kernel_type_string:
437d5aa5
MD
3756 ret = _lttng_string_type_statedump(session,
3757 lttng_kernel_get_type_string(type),
3758 nesting);
ceabb767 3759 break;
437d5aa5
MD
3760 case lttng_kernel_type_struct:
3761 ret = _lttng_struct_type_statedump(session,
3762 lttng_kernel_get_type_struct(type),
3763 nesting);
8070f5c0 3764 break;
437d5aa5
MD
3765 case lttng_kernel_type_variant:
3766 ret = _lttng_variant_type_statedump(session,
3767 lttng_kernel_get_type_variant(type),
51ef4536 3768 nesting, NULL);
ceabb767
MD
3769 break;
3770
3771 /* Nested arrays and sequences are not supported yet. */
437d5aa5
MD
3772 case lttng_kernel_type_array:
3773 case lttng_kernel_type_sequence:
ceabb767
MD
3774 default:
3775 WARN_ON_ONCE(1);
3776 return -EINVAL;
8070f5c0 3777 }
ceabb767
MD
3778 return ret;
3779}
8070f5c0 3780
ceabb767
MD
3781/*
3782 * Must be called with sessions_mutex held.
3783 */
3784static
8cdc1a81 3785int _lttng_field_statedump(struct lttng_kernel_session *session,
437d5aa5 3786 const struct lttng_kernel_event_field *field,
51ef4536
MD
3787 size_t nesting,
3788 const char **prev_field_name_p)
ceabb767 3789{
51ef4536 3790 const char *prev_field_name = NULL;
ceabb767 3791 int ret = 0;
27d2368e 3792
51ef4536
MD
3793 if (prev_field_name_p)
3794 prev_field_name = *prev_field_name_p;
437d5aa5 3795 switch (field->type->type) {
12bb2edb 3796 case lttng_kernel_type_integer:
ceabb767
MD
3797 ret = _lttng_integer_field_statedump(session, field, nesting);
3798 break;
437d5aa5 3799 case lttng_kernel_type_enum:
ceabb767 3800 ret = _lttng_enum_field_statedump(session, field, nesting);
8070f5c0 3801 break;
12bb2edb 3802 case lttng_kernel_type_string:
ceabb767 3803 ret = _lttng_string_field_statedump(session, field, nesting);
8070f5c0 3804 break;
437d5aa5 3805 case lttng_kernel_type_struct:
ceabb767 3806 ret = _lttng_struct_field_statedump(session, field, nesting);
f513b2bf 3807 break;
437d5aa5 3808 case lttng_kernel_type_array:
ceabb767 3809 ret = _lttng_array_field_statedump(session, field, nesting);
f513b2bf 3810 break;
437d5aa5 3811 case lttng_kernel_type_sequence:
51ef4536 3812 ret = _lttng_sequence_field_statedump(session, field, nesting, prev_field_name);
f513b2bf 3813 break;
437d5aa5 3814 case lttng_kernel_type_variant:
51ef4536 3815 ret = _lttng_variant_field_statedump(session, field, nesting, prev_field_name);
65c85aa6 3816 break;
f513b2bf 3817
8070f5c0
MD
3818 default:
3819 WARN_ON_ONCE(1);
3820 return -EINVAL;
3821 }
51ef4536
MD
3822 if (prev_field_name_p)
3823 *prev_field_name_p = field->name;
8070f5c0
MD
3824 return ret;
3825}
3826
3827static
8cdc1a81 3828int _lttng_context_metadata_statedump(struct lttng_kernel_session *session,
437d5aa5 3829 struct lttng_kernel_ctx *ctx)
8070f5c0 3830{
51ef4536 3831 const char *prev_field_name = NULL;
8070f5c0
MD
3832 int ret = 0;
3833 int i;
3834
3835 if (!ctx)
3836 return 0;
3837 for (i = 0; i < ctx->nr_fields; i++) {
437d5aa5 3838 const struct lttng_kernel_ctx_field *field = &ctx->fields[i];
8070f5c0 3839
51ef4536 3840 ret = _lttng_field_statedump(session, field->event_field, 2, &prev_field_name);
8070f5c0
MD
3841 if (ret)
3842 return ret;
3843 }
3844 return ret;
3845}
3846
3847static
8cdc1a81 3848int _lttng_fields_metadata_statedump(struct lttng_kernel_session *session,
a67ba386 3849 struct lttng_kernel_event_recorder *event_recorder)
8070f5c0 3850{
51ef4536 3851 const char *prev_field_name = NULL;
6b4e37a3 3852 const struct lttng_kernel_event_desc *desc = event_recorder->priv->parent.parent.desc;
8070f5c0
MD
3853 int ret = 0;
3854 int i;
3855
6c8c025b
MD
3856 for (i = 0; i < desc->tp_class->nr_fields; i++) {
3857 const struct lttng_kernel_event_field *field = desc->tp_class->fields[i];
8070f5c0 3858
51ef4536 3859 ret = _lttng_field_statedump(session, field, 2, &prev_field_name);
8070f5c0
MD
3860 if (ret)
3861 return ret;
c099397a
MD
3862 }
3863 return ret;
3864}
3865
d83004aa
JD
3866/*
3867 * Must be called with sessions_mutex held.
8b97fd42
MD
3868 * The entire event metadata is printed as a single atomic metadata
3869 * transaction.
d83004aa 3870 */
c099397a 3871static
ee7e9a18 3872int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common *event)
c099397a 3873{
ee7e9a18
MD
3874 struct lttng_kernel_event_recorder *event_recorder;
3875 struct lttng_kernel_channel_buffer *chan;
3876 struct lttng_kernel_session *session;
c099397a
MD
3877 int ret = 0;
3878
ee7e9a18
MD
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
a67ba386 3885 if (event_recorder->priv->metadata_dumped || !LTTNG_READ_ONCE(session->active))
c099397a 3886 return 0;
f7d06400 3887 if (chan->priv->channel_type == METADATA_CHANNEL)
c099397a
MD
3888 return 0;
3889
8b97fd42
MD
3890 lttng_metadata_begin(session);
3891
c099397a
MD
3892 ret = lttng_metadata_printf(session,
3893 "event {\n"
ae734547 3894 " name = \"%s\";\n"
6b4e37a3 3895 " id = %llu;\n"
b9074a1b 3896 " stream_id = %u;\n",
6b4e37a3
MD
3897 event_recorder->priv->parent.parent.desc->event_name,
3898 event_recorder->priv->parent.id,
f7d06400 3899 event_recorder->chan->priv->id);
c099397a
MD
3900 if (ret)
3901 goto end;
3902
8070f5c0 3903 ret = lttng_metadata_printf(session,
8070f5c0
MD
3904 " fields := struct {\n"
3905 );
3906 if (ret)
3907 goto end;
3908
a67ba386 3909 ret = _lttng_fields_metadata_statedump(session, event_recorder);
c099397a
MD
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,
9115fbdc
MD
3918 " };\n"
3919 "};\n\n");
c099397a
MD
3920 if (ret)
3921 goto end;
3922
a67ba386 3923 event_recorder->priv->metadata_dumped = 1;
c099397a 3924end:
8b97fd42 3925 lttng_metadata_end(session);
c099397a
MD
3926 return ret;
3927
3928}
3929
d83004aa
JD
3930/*
3931 * Must be called with sessions_mutex held.
8b97fd42
MD
3932 * The entire channel metadata is printed as a single atomic metadata
3933 * transaction.
d83004aa 3934 */
c099397a 3935static
8cdc1a81 3936int _lttng_channel_metadata_statedump(struct lttng_kernel_session *session,
f7d06400 3937 struct lttng_kernel_channel_buffer *chan)
c099397a
MD
3938{
3939 int ret = 0;
3940
f7d06400 3941 if (chan->priv->metadata_dumped || !LTTNG_READ_ONCE(session->active))
c099397a 3942 return 0;
d83004aa 3943
f7d06400 3944 if (chan->priv->channel_type == METADATA_CHANNEL)
c099397a
MD
3945 return 0;
3946
8b97fd42
MD
3947 lttng_metadata_begin(session);
3948
f7d06400 3949 WARN_ON_ONCE(!chan->priv->header_type);
c099397a
MD
3950 ret = lttng_metadata_printf(session,
3951 "stream {\n"
3952 " id = %u;\n"
9115fbdc 3953 " event.header := %s;\n"
b9074a1b 3954 " packet.context := struct packet_context;\n",
f7d06400
MD
3955 chan->priv->id,
3956 chan->priv->header_type == 1 ? "struct event_header_compact" :
c099397a
MD
3957 "struct event_header_large");
3958 if (ret)
3959 goto end;
3960
f7d06400 3961 if (chan->priv->ctx) {
b9074a1b
MD
3962 ret = lttng_metadata_printf(session,
3963 " event.context := struct {\n");
3964 if (ret)
3965 goto end;
3966 }
f7d06400 3967 ret = _lttng_context_metadata_statedump(session, chan->priv->ctx);
8070f5c0
MD
3968 if (ret)
3969 goto end;
f7d06400 3970 if (chan->priv->ctx) {
b9074a1b
MD
3971 ret = lttng_metadata_printf(session,
3972 " };\n");
3973 if (ret)
3974 goto end;
3975 }
8070f5c0
MD
3976
3977 ret = lttng_metadata_printf(session,
b9074a1b 3978 "};\n\n");
8070f5c0 3979
f7d06400 3980 chan->priv->metadata_dumped = 1;
c099397a 3981end:
8b97fd42 3982 lttng_metadata_end(session);
c099397a
MD
3983 return ret;
3984}
3985
d83004aa
JD
3986/*
3987 * Must be called with sessions_mutex held.
3988 */
9115fbdc 3989static
8cdc1a81 3990int _lttng_stream_packet_context_declare(struct lttng_kernel_session *session)
9115fbdc
MD
3991{
3992 return lttng_metadata_printf(session,
3993 "struct packet_context {\n"
a3ccff4f
MD
3994 " uint64_clock_monotonic_t timestamp_begin;\n"
3995 " uint64_clock_monotonic_t timestamp_end;\n"
576ca06a
MD
3996 " uint64_t content_size;\n"
3997 " uint64_t packet_size;\n"
5b3cf4f9 3998 " uint64_t packet_seq_num;\n"
a9afe705 3999 " unsigned long events_discarded;\n"
9115fbdc 4000 " uint32_t cpu_id;\n"
c6dfdf6f 4001 "};\n\n"
9115fbdc
MD
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.
d83004aa
JD
4013 *
4014 * Must be called with sessions_mutex held.
9115fbdc
MD
4015 */
4016static
8cdc1a81 4017int _lttng_event_header_declare(struct lttng_kernel_session *session)
9115fbdc
MD
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"
a3ccff4f 4024 " uint27_clock_monotonic_t timestamp;\n"
9115fbdc
MD
4025 " } compact;\n"
4026 " struct {\n"
4027 " uint32_t id;\n"
a3ccff4f 4028 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
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"
a3ccff4f 4037 " uint32_clock_monotonic_t timestamp;\n"
9115fbdc
MD
4038 " } compact;\n"
4039 " struct {\n"
4040 " uint32_t id;\n"
a3ccff4f 4041 " uint64_clock_monotonic_t timestamp;\n"
9115fbdc
MD
4042 " } extended;\n"
4043 " } v;\n"
4044 "} align(%u);\n\n",
a90917c3
MD
4045 lttng_alignof(uint32_t) * CHAR_BIT,
4046 lttng_alignof(uint16_t) * CHAR_BIT
9115fbdc
MD
4047 );
4048}
4049
a3ccff4f
MD
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.
5283350b
MD
4055 * This function may return a negative offset. It may happen if the
4056 * system sets the REALTIME clock to 0 after boot.
3636085f
MJ
4057 *
4058 * Use 64bit timespec on kernels that have it, this makes 32bit arch
4059 * y2038 compliant.
a3ccff4f
MD
4060 */
4061static
8967b2a3 4062int64_t measure_clock_offset(void)
a3ccff4f 4063{
dcb93448 4064 uint64_t monotonic_avg, monotonic[2], realtime;
2754583e 4065 uint64_t tcf = trace_clock_freq();
dcb93448 4066 int64_t offset;
a3ccff4f 4067 unsigned long flags;
3636085f 4068 struct timespec64 rts = { 0, 0 };
a3ccff4f
MD
4069
4070 /* Disable interrupts to increase correlation precision. */
4071 local_irq_save(flags);
4072 monotonic[0] = trace_clock_read64();
3636085f 4073 ktime_get_real_ts64(&rts);
a3ccff4f
MD
4074 monotonic[1] = trace_clock_read64();
4075 local_irq_restore(flags);
4076
dcb93448 4077 monotonic_avg = (monotonic[0] + monotonic[1]) >> 1;
2754583e
MD
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 }
dcb93448 4087 offset = (int64_t) realtime - monotonic_avg;
a3ccff4f
MD
4088 return offset;
4089}
4090
3eb95be4 4091static
8cdc1a81 4092int print_escaped_ctf_string(struct lttng_kernel_session *session, const char *string)
3eb95be4 4093{
0f3eaad4 4094 int ret = 0;
3eb95be4
JR
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 */
c190d76e 4111 lttng_fallthrough;
3eb95be4
JR
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 }
4122error:
4123 return ret;
4124}
4125
4126static
8cdc1a81 4127int print_metadata_escaped_field(struct lttng_kernel_session *session, const char *field,
1c88f269 4128 const char *field_value)
3eb95be4
JR
4129{
4130 int ret;
4131
1c88f269 4132 ret = lttng_metadata_printf(session, " %s = \"", field);
3eb95be4
JR
4133 if (ret)
4134 goto error;
4135
1c88f269 4136 ret = print_escaped_ctf_string(session, field_value);
3eb95be4
JR
4137 if (ret)
4138 goto error;
4139
4140 ret = lttng_metadata_printf(session, "\";\n");
4141
4142error:
4143 return ret;
4144}
4145
c099397a
MD
4146/*
4147 * Output metadata into this session's metadata buffers.
d83004aa 4148 * Must be called with sessions_mutex held.
c099397a
MD
4149 */
4150static
8cdc1a81 4151int _lttng_session_metadata_statedump(struct lttng_kernel_session *session)
c099397a 4152{
8cdc1a81 4153 unsigned char *uuid_c = session->priv->uuid.b;
a82c63f1 4154 unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN];
c88f762e 4155 const char *product_uuid;
2ff86ce2 4156 struct lttng_kernel_channel_common_private *chan_priv;
a67ba386 4157 struct lttng_kernel_event_recorder_private *event_recorder_priv;
c099397a
MD
4158 int ret = 0;
4159
585e5dcc 4160 if (!LTTNG_READ_ONCE(session->active))
c099397a 4161 return 0;
8b97fd42
MD
4162
4163 lttng_metadata_begin(session);
4164
8cdc1a81 4165 if (session->priv->metadata_dumped)
c099397a 4166 goto skip_session;
c099397a 4167
d793d5e1 4168 snprintf(uuid_s, sizeof(uuid_s),
30bdb6e4
MD
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]);
d793d5e1
MD
4174
4175 ret = lttng_metadata_printf(session,
9115fbdc
MD
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"
a9afe705 4180 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
9115fbdc
MD
4181 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
4182 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
d793d5e1
MD
4183 "\n"
4184 "trace {\n"
4185 " major = %u;\n"
4186 " minor = %u;\n"
30bdb6e4 4187 " uuid = \"%s\";\n"
d793d5e1
MD
4188 " byte_order = %s;\n"
4189 " packet.header := struct {\n"
4190 " uint32_t magic;\n"
1ec3f75a 4191 " uint8_t uuid[16];\n"
d793d5e1 4192 " uint32_t stream_id;\n"
5594698f 4193 " uint64_t stream_instance_id;\n"
0eb25f58 4194 " };\n"
d793d5e1 4195 "};\n\n",
a90917c3
MD
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,
a9afe705
MD
4200 sizeof(unsigned long) * CHAR_BIT,
4201 lttng_alignof(unsigned long) * CHAR_BIT,
c6c9e10f
MD
4202 CTF_SPEC_MAJOR,
4203 CTF_SPEC_MINOR,
d793d5e1 4204 uuid_s,
5214fa50 4205#if __BYTE_ORDER == __BIG_ENDIAN
d793d5e1
MD
4206 "be"
4207#else
4208 "le"
4209#endif
4210 );
4211 if (ret)
4212 goto end;
4213
99dc9597
MD
4214 ret = lttng_metadata_printf(session,
4215 "env {\n"
a6058143 4216 " hostname = \"%s\";\n"
c6c9e10f 4217 " domain = \"kernel\";\n"
99dc9597 4218 " sysname = \"%s\";\n"
c6c9e10f
MD
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"
3eb95be4 4225 " trace_buffering_scheme = \"global\";\n",
3d0d43db 4226 current->nsproxy->uts_ns->name.nodename,
99dc9597
MD
4227 utsname()->sysname,
4228 utsname()->release,
c6c9e10f
MD
4229 utsname()->version,
4230 LTTNG_MODULES_MAJOR_VERSION,
4231 LTTNG_MODULES_MINOR_VERSION,
4232 LTTNG_MODULES_PATCHLEVEL_VERSION
99dc9597
MD
4233 );
4234 if (ret)
4235 goto end;
4236
8cdc1a81 4237 ret = print_metadata_escaped_field(session, "trace_name", session->priv->name);
1c88f269
JR
4238 if (ret)
4239 goto end;
4240 ret = print_metadata_escaped_field(session, "trace_creation_datetime",
8cdc1a81 4241 session->priv->creation_time);
3eb95be4
JR
4242 if (ret)
4243 goto end;
4244
c88f762e
GB
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 */
3eb95be4
JR
4257 ret = lttng_metadata_printf(session, "};\n\n");
4258 if (ret)
4259 goto end;
4260
a3ccff4f
MD
4261 ret = lttng_metadata_printf(session,
4262 "clock {\n"
2754583e
MD
4263 " name = \"%s\";\n",
4264 trace_clock_name()
a82c63f1
MD
4265 );
4266 if (ret)
4267 goto end;
4268
4269 if (!trace_clock_uuid(clock_uuid_s)) {
4270 ret = lttng_metadata_printf(session,
7c27cb17 4271 " uuid = \"%s\";\n",
a82c63f1
MD
4272 clock_uuid_s
4273 );
4274 if (ret)
4275 goto end;
4276 }
4277
4278 ret = lttng_metadata_printf(session,
2754583e 4279 " description = \"%s\";\n"
a3ccff4f
MD
4280 " freq = %llu; /* Frequency, in Hz */\n"
4281 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
8967b2a3 4282 " offset = %lld;\n"
a3ccff4f 4283 "};\n\n",
2754583e 4284 trace_clock_description(),
a3ccff4f 4285 (unsigned long long) trace_clock_freq(),
8967b2a3 4286 (long long) measure_clock_offset()
a3ccff4f
MD
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"
2754583e 4294 " map = clock.%s.value;\n"
a3ccff4f
MD
4295 "} := uint27_clock_monotonic_t;\n"
4296 "\n"
4297 "typealias integer {\n"
4298 " size = 32; align = %u; signed = false;\n"
2754583e 4299 " map = clock.%s.value;\n"
a3ccff4f
MD
4300 "} := uint32_clock_monotonic_t;\n"
4301 "\n"
4302 "typealias integer {\n"
4303 " size = 64; align = %u; signed = false;\n"
2754583e 4304 " map = clock.%s.value;\n"
a3ccff4f 4305 "} := uint64_clock_monotonic_t;\n\n",
2754583e 4306 trace_clock_name(),
a3ccff4f 4307 lttng_alignof(uint32_t) * CHAR_BIT,
2754583e
MD
4308 trace_clock_name(),
4309 lttng_alignof(uint64_t) * CHAR_BIT,
4310 trace_clock_name()
a3ccff4f
MD
4311 );
4312 if (ret)
4313 goto end;
4314
a90917c3 4315 ret = _lttng_stream_packet_context_declare(session);
9115fbdc
MD
4316 if (ret)
4317 goto end;
4318
a90917c3 4319 ret = _lttng_event_header_declare(session);
9115fbdc
MD
4320 if (ret)
4321 goto end;
4322
c099397a 4323skip_session:
0d5e5f34 4324 list_for_each_entry(chan_priv, &session->priv->chan_head, node) {
2ff86ce2
MD
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);
c099397a
MD
4331 if (ret)
4332 goto end;
4333 }
4334
ba5ed2bc 4335 list_for_each_entry(event_recorder_priv, &session->priv->events_head, parent.parent.node) {
ee7e9a18 4336 ret = _lttng_event_recorder_metadata_statedump(&event_recorder_priv->pub->parent);
c099397a
MD
4337 if (ret)
4338 goto end;
4339 }
8cdc1a81 4340 session->priv->metadata_dumped = 1;
c099397a 4341end:
8b97fd42 4342 lttng_metadata_end(session);
c099397a
MD
4343 return ret;
4344}
4345
c0e31d2e 4346/**
a90917c3 4347 * lttng_transport_register - LTT transport registration
c0e31d2e
MD
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.
263b6c88 4353 * vmalloc_sync_mappings() must be called between a vmalloc and the moment the memory
c0e31d2e 4354 * is made visible to the transport function. This registration acts as a
263b6c88 4355 * vmalloc_sync_mappings. Therefore, only if the module allocates virtual memory
c0e31d2e
MD
4356 * after its registration must it synchronize the TLBs.
4357 */
a90917c3 4358void lttng_transport_register(struct lttng_transport *transport)
c0e31d2e
MD
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
263b6c88 4363 * vmalloc_sync_mappings() in each module's init.
c0e31d2e 4364 */
263b6c88 4365 wrapper_vmalloc_sync_mappings();
c0e31d2e
MD
4366
4367 mutex_lock(&sessions_mutex);
a90917c3 4368 list_add_tail(&transport->node, &lttng_transport_list);
c0e31d2e
MD
4369 mutex_unlock(&sessions_mutex);
4370}
a90917c3 4371EXPORT_SYMBOL_GPL(lttng_transport_register);
c0e31d2e
MD
4372
4373/**
a90917c3 4374 * lttng_transport_unregister - LTT transport unregistration
c0e31d2e
MD
4375 * @transport: transport structure
4376 */
a90917c3 4377void lttng_transport_unregister(struct lttng_transport *transport)
c0e31d2e
MD
4378{
4379 mutex_lock(&sessions_mutex);
4380 list_del(&transport->node);
4381 mutex_unlock(&sessions_mutex);
4382}
a90917c3 4383EXPORT_SYMBOL_GPL(lttng_transport_unregister);
c0e31d2e 4384
a101fa10
MD
4385void 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}
4398EXPORT_SYMBOL_GPL(lttng_counter_transport_register);
4399
4400void 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}
4406EXPORT_SYMBOL_GPL(lttng_counter_transport_unregister);
4407
76ba9cee
MD
4408struct 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
4428nomem_priv:
4429 kfree(lttng_chan_buf);
4430nomem:
4431 return NULL;
4432}
4433EXPORT_SYMBOL_GPL(lttng_kernel_alloc_channel_buffer);
4434
4435struct 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
4455nomem_priv:
4456 kfree(lttng_chan_counter);
4457nomem:
4458 return NULL;
4459}
4460EXPORT_SYMBOL_GPL(lttng_kernel_alloc_channel_counter);
4461
4462void 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}
4487EXPORT_SYMBOL_GPL(lttng_kernel_free_channel_common);
4488
5f4c791e 4489#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0))
1e367326
MD
4490
4491enum cpuhp_state lttng_hp_prepare;
4492enum cpuhp_state lttng_hp_online;
4493
4494static 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
4513static 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
4532static 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
4551static 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
4570static 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
4597static 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
5f4c791e 4605#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
1e367326
MD
4606static int lttng_init_cpu_hotplug(void)
4607{
4608 return 0;
4609}
4610static void lttng_exit_cpu_hotplug(void)
4611{
4612}
5f4c791e 4613#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */
1e367326 4614
a90917c3 4615static int __init lttng_events_init(void)
4e3c1b9b 4616{
1c25284c
MD
4617 int ret;
4618
389d7070 4619 ret = wrapper_get_pfnblock_flags_mask_init();
114667d5
MD
4620 if (ret)
4621 return ret;
4622 ret = lttng_probes_init();
389d7070
MD
4623 if (ret)
4624 return ret;
07dfc1d0 4625 ret = lttng_context_init();
20591cf7
MD
4626 if (ret)
4627 return ret;
07dfc1d0
MD
4628 ret = lttng_tracepoint_init();
4629 if (ret)
4630 goto error_tp;
a67ba386
MD
4631 event_recorder_cache = KMEM_CACHE(lttng_kernel_event_recorder, 0);
4632 if (!event_recorder_cache) {
20591cf7 4633 ret = -ENOMEM;
a67ba386 4634 goto error_kmem_event_recorder;
dffef45d 4635 }
a67ba386
MD
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 }
062a5f00
MD
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 }
a67ba386 4651 event_notifier_cache = KMEM_CACHE(lttng_kernel_event_notifier, 0);
dffef45d
FD
4652 if (!event_notifier_cache) {
4653 ret = -ENOMEM;
4654 goto error_kmem_event_notifier;
20591cf7 4655 }
a67ba386
MD
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 }
80996790 4661 ret = lttng_abi_init();
02119ee5
MD
4662 if (ret)
4663 goto error_abi;
0c956676
MD
4664 ret = lttng_logger_init();
4665 if (ret)
4666 goto error_logger;
1e367326
MD
4667 ret = lttng_init_cpu_hotplug();
4668 if (ret)
4669 goto error_hotplug;
101215b7 4670 printk(KERN_NOTICE "LTTng: Loaded modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
4671 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4672 __stringify(LTTNG_MODULES_MINOR_VERSION),
4673 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4674 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
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
c1551e57
MJ
4686#ifdef CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM
4687 printk(KERN_NOTICE "LTTng: Experimental bitwise enum enabled.\n");
4688#endif /* CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM */
4e3c1b9b 4689 return 0;
0c956676 4690
1e367326
MD
4691error_hotplug:
4692 lttng_logger_exit();
0c956676
MD
4693error_logger:
4694 lttng_abi_exit();
02119ee5 4695error_abi:
a67ba386
MD
4696 kmem_cache_destroy(event_notifier_private_cache);
4697error_kmem_event_notifier_private:
dffef45d
FD
4698 kmem_cache_destroy(event_notifier_cache);
4699error_kmem_event_notifier:
062a5f00
MD
4700 kmem_cache_destroy(event_counter_private_cache);
4701error_kmem_event_counter_private:
4702 kmem_cache_destroy(event_counter_cache);
4703error_kmem_event_counter:
a67ba386
MD
4704 kmem_cache_destroy(event_recorder_private_cache);
4705error_kmem_event_recorder_private:
4706 kmem_cache_destroy(event_recorder_cache);
4707error_kmem_event_recorder:
20591cf7 4708 lttng_tracepoint_exit();
07dfc1d0
MD
4709error_tp:
4710 lttng_context_exit();
101215b7 4711 printk(KERN_NOTICE "LTTng: Failed to load modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
4712 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4713 __stringify(LTTNG_MODULES_MINOR_VERSION),
4714 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4715 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
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
1c25284c 4727 return ret;
4e3c1b9b
MD
4728}
4729
a90917c3 4730module_init(lttng_events_init);
11b5a3c2 4731
a90917c3 4732static void __exit lttng_events_exit(void)
4e3c1b9b 4733{
8cdc1a81 4734 struct lttng_kernel_session_private *session_priv, *tmpsession_priv;
92e94819 4735
1e367326 4736 lttng_exit_cpu_hotplug();
0c956676 4737 lttng_logger_exit();
80996790 4738 lttng_abi_exit();
24909af2 4739 list_for_each_entry_safe(session_priv, tmpsession_priv, &sessions, node)
8cdc1a81 4740 lttng_session_destroy(session_priv->pub);
a67ba386
MD
4741 kmem_cache_destroy(event_recorder_cache);
4742 kmem_cache_destroy(event_recorder_private_cache);
062a5f00
MD
4743 kmem_cache_destroy(event_counter_cache);
4744 kmem_cache_destroy(event_counter_private_cache);
dffef45d 4745 kmem_cache_destroy(event_notifier_cache);
a67ba386 4746 kmem_cache_destroy(event_notifier_private_cache);
20591cf7 4747 lttng_tracepoint_exit();
07dfc1d0 4748 lttng_context_exit();
101215b7 4749 printk(KERN_NOTICE "LTTng: Unloaded modules v%s.%s.%s%s (%s)%s%s\n",
489de24b
MJ
4750 __stringify(LTTNG_MODULES_MAJOR_VERSION),
4751 __stringify(LTTNG_MODULES_MINOR_VERSION),
4752 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
4753 LTTNG_MODULES_EXTRAVERSION,
101215b7
MJ
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
4e3c1b9b 4765}
92e94819 4766
a90917c3 4767module_exit(lttng_events_exit);
11b5a3c2 4768
7ca11e77 4769#include <generated/patches.h>
101215b7
MJ
4770#ifdef LTTNG_EXTRA_VERSION_GIT
4771MODULE_INFO(extra_version_git, LTTNG_EXTRA_VERSION_GIT);
4772#endif
4773#ifdef LTTNG_EXTRA_VERSION_NAME
4774MODULE_INFO(extra_version_name, LTTNG_EXTRA_VERSION_NAME);
4775#endif
92e94819
MD
4776MODULE_LICENSE("GPL and additional rights");
4777MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
1c124020 4778MODULE_DESCRIPTION("LTTng tracer");
9a9973ef
MD
4779MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
4780 __stringify(LTTNG_MODULES_MINOR_VERSION) "."
309370e2
MD
4781 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
4782 LTTNG_MODULES_EXTRAVERSION);
This page took 0.401729 seconds and 4 git commands to generate.