c8cff2386fc36658cb0ef99d2d477cf1e3785dfb
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
1 /*
2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2 only,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18 #define _GNU_SOURCE
19 #define _LGPL_SOURCE
20 #include <errno.h>
21 #include <inttypes.h>
22 #include <pthread.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <sys/stat.h>
27 #include <sys/types.h>
28 #include <unistd.h>
29 #include <urcu/compiler.h>
30 #include <lttng/ust-error.h>
31 #include <signal.h>
32
33 #include <common/common.h>
34 #include <common/sessiond-comm/sessiond-comm.h>
35
36 #include "buffer-registry.h"
37 #include "fd-limit.h"
38 #include "health-sessiond.h"
39 #include "ust-app.h"
40 #include "ust-consumer.h"
41 #include "ust-ctl.h"
42 #include "utils.h"
43
44 static
45 int ust_app_flush_app_session(struct ust_app *app, struct ust_app_session *ua_sess);
46
47 /* Next available channel key. Access under next_channel_key_lock. */
48 static uint64_t _next_channel_key;
49 static pthread_mutex_t next_channel_key_lock = PTHREAD_MUTEX_INITIALIZER;
50
51 /* Next available session ID. Access under next_session_id_lock. */
52 static uint64_t _next_session_id;
53 static pthread_mutex_t next_session_id_lock = PTHREAD_MUTEX_INITIALIZER;
54
55 /*
56 * Return the incremented value of next_channel_key.
57 */
58 static uint64_t get_next_channel_key(void)
59 {
60 uint64_t ret;
61
62 pthread_mutex_lock(&next_channel_key_lock);
63 ret = ++_next_channel_key;
64 pthread_mutex_unlock(&next_channel_key_lock);
65 return ret;
66 }
67
68 /*
69 * Return the atomically incremented value of next_session_id.
70 */
71 static uint64_t get_next_session_id(void)
72 {
73 uint64_t ret;
74
75 pthread_mutex_lock(&next_session_id_lock);
76 ret = ++_next_session_id;
77 pthread_mutex_unlock(&next_session_id_lock);
78 return ret;
79 }
80
81 static void copy_channel_attr_to_ustctl(
82 struct ustctl_consumer_channel_attr *attr,
83 struct lttng_ust_channel_attr *uattr)
84 {
85 /* Copy event attributes since the layout is different. */
86 attr->subbuf_size = uattr->subbuf_size;
87 attr->num_subbuf = uattr->num_subbuf;
88 attr->overwrite = uattr->overwrite;
89 attr->switch_timer_interval = uattr->switch_timer_interval;
90 attr->read_timer_interval = uattr->read_timer_interval;
91 attr->output = uattr->output;
92 }
93
94 /*
95 * Match function for the hash table lookup.
96 *
97 * It matches an ust app event based on three attributes which are the event
98 * name, the filter bytecode and the loglevel.
99 */
100 static int ht_match_ust_app_event(struct cds_lfht_node *node, const void *_key)
101 {
102 struct ust_app_event *event;
103 const struct ust_app_ht_key *key;
104
105 assert(node);
106 assert(_key);
107
108 event = caa_container_of(node, struct ust_app_event, node.node);
109 key = _key;
110
111 /* Match the 4 elements of the key: name, filter, loglevel, exclusions */
112
113 /* Event name */
114 if (strncmp(event->attr.name, key->name, sizeof(event->attr.name)) != 0) {
115 goto no_match;
116 }
117
118 /* Event loglevel. */
119 if (event->attr.loglevel != key->loglevel) {
120 if (event->attr.loglevel_type == LTTNG_UST_LOGLEVEL_ALL
121 && key->loglevel == 0 && event->attr.loglevel == -1) {
122 /*
123 * Match is accepted. This is because on event creation, the
124 * loglevel is set to -1 if the event loglevel type is ALL so 0 and
125 * -1 are accepted for this loglevel type since 0 is the one set by
126 * the API when receiving an enable event.
127 */
128 } else {
129 goto no_match;
130 }
131 }
132
133 /* One of the filters is NULL, fail. */
134 if ((key->filter && !event->filter) || (!key->filter && event->filter)) {
135 goto no_match;
136 }
137
138 if (key->filter && event->filter) {
139 /* Both filters exists, check length followed by the bytecode. */
140 if (event->filter->len != key->filter->len ||
141 memcmp(event->filter->data, key->filter->data,
142 event->filter->len) != 0) {
143 goto no_match;
144 }
145 }
146
147 /* One of the exclusions is NULL, fail. */
148 if ((key->exclusion && !event->exclusion) || (!key->exclusion && event->exclusion)) {
149 goto no_match;
150 }
151
152 if (key->exclusion && event->exclusion) {
153 /* Both exclusions exists, check count followed by the names. */
154 if (event->exclusion->count != key->exclusion->count ||
155 memcmp(event->exclusion->names, key->exclusion->names,
156 event->exclusion->count * LTTNG_UST_SYM_NAME_LEN) != 0) {
157 goto no_match;
158 }
159 }
160
161
162 /* Match. */
163 return 1;
164
165 no_match:
166 return 0;
167 }
168
169 /*
170 * Unique add of an ust app event in the given ht. This uses the custom
171 * ht_match_ust_app_event match function and the event name as hash.
172 */
173 static void add_unique_ust_app_event(struct ust_app_channel *ua_chan,
174 struct ust_app_event *event)
175 {
176 struct cds_lfht_node *node_ptr;
177 struct ust_app_ht_key key;
178 struct lttng_ht *ht;
179
180 assert(ua_chan);
181 assert(ua_chan->events);
182 assert(event);
183
184 ht = ua_chan->events;
185 key.name = event->attr.name;
186 key.filter = event->filter;
187 key.loglevel = event->attr.loglevel;
188 key.exclusion = event->exclusion;
189
190 node_ptr = cds_lfht_add_unique(ht->ht,
191 ht->hash_fct(event->node.key, lttng_ht_seed),
192 ht_match_ust_app_event, &key, &event->node.node);
193 assert(node_ptr == &event->node.node);
194 }
195
196 /*
197 * Close the notify socket from the given RCU head object. This MUST be called
198 * through a call_rcu().
199 */
200 static void close_notify_sock_rcu(struct rcu_head *head)
201 {
202 int ret;
203 struct ust_app_notify_sock_obj *obj =
204 caa_container_of(head, struct ust_app_notify_sock_obj, head);
205
206 /* Must have a valid fd here. */
207 assert(obj->fd >= 0);
208
209 ret = close(obj->fd);
210 if (ret) {
211 ERR("close notify sock %d RCU", obj->fd);
212 }
213 lttng_fd_put(LTTNG_FD_APPS, 1);
214
215 free(obj);
216 }
217
218 /*
219 * Return the session registry according to the buffer type of the given
220 * session.
221 *
222 * A registry per UID object MUST exists before calling this function or else
223 * it assert() if not found. RCU read side lock must be acquired.
224 */
225 static struct ust_registry_session *get_session_registry(
226 struct ust_app_session *ua_sess)
227 {
228 struct ust_registry_session *registry = NULL;
229
230 assert(ua_sess);
231
232 switch (ua_sess->buffer_type) {
233 case LTTNG_BUFFER_PER_PID:
234 {
235 struct buffer_reg_pid *reg_pid = buffer_reg_pid_find(ua_sess->id);
236 if (!reg_pid) {
237 goto error;
238 }
239 registry = reg_pid->registry->reg.ust;
240 break;
241 }
242 case LTTNG_BUFFER_PER_UID:
243 {
244 struct buffer_reg_uid *reg_uid = buffer_reg_uid_find(
245 ua_sess->tracing_id, ua_sess->bits_per_long, ua_sess->uid);
246 if (!reg_uid) {
247 goto error;
248 }
249 registry = reg_uid->registry->reg.ust;
250 break;
251 }
252 default:
253 assert(0);
254 };
255
256 error:
257 return registry;
258 }
259
260 /*
261 * Delete ust context safely. RCU read lock must be held before calling
262 * this function.
263 */
264 static
265 void delete_ust_app_ctx(int sock, struct ust_app_ctx *ua_ctx)
266 {
267 int ret;
268
269 assert(ua_ctx);
270
271 if (ua_ctx->obj) {
272 ret = ustctl_release_object(sock, ua_ctx->obj);
273 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
274 ERR("UST app sock %d release ctx obj handle %d failed with ret %d",
275 sock, ua_ctx->obj->handle, ret);
276 }
277 free(ua_ctx->obj);
278 }
279 free(ua_ctx);
280 }
281
282 /*
283 * Delete ust app event safely. RCU read lock must be held before calling
284 * this function.
285 */
286 static
287 void delete_ust_app_event(int sock, struct ust_app_event *ua_event)
288 {
289 int ret;
290
291 assert(ua_event);
292
293 free(ua_event->filter);
294 if (ua_event->exclusion != NULL)
295 free(ua_event->exclusion);
296 if (ua_event->obj != NULL) {
297 ret = ustctl_release_object(sock, ua_event->obj);
298 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
299 ERR("UST app sock %d release event obj failed with ret %d",
300 sock, ret);
301 }
302 free(ua_event->obj);
303 }
304 free(ua_event);
305 }
306
307 /*
308 * Release ust data object of the given stream.
309 *
310 * Return 0 on success or else a negative value.
311 */
312 static int release_ust_app_stream(int sock, struct ust_app_stream *stream)
313 {
314 int ret = 0;
315
316 assert(stream);
317
318 if (stream->obj) {
319 ret = ustctl_release_object(sock, stream->obj);
320 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
321 ERR("UST app sock %d release stream obj failed with ret %d",
322 sock, ret);
323 }
324 lttng_fd_put(LTTNG_FD_APPS, 2);
325 free(stream->obj);
326 }
327
328 return ret;
329 }
330
331 /*
332 * Delete ust app stream safely. RCU read lock must be held before calling
333 * this function.
334 */
335 static
336 void delete_ust_app_stream(int sock, struct ust_app_stream *stream)
337 {
338 assert(stream);
339
340 (void) release_ust_app_stream(sock, stream);
341 free(stream);
342 }
343
344 /*
345 * We need to execute ht_destroy outside of RCU read-side critical
346 * section and outside of call_rcu thread, so we postpone its execution
347 * using ht_cleanup_push. It is simpler than to change the semantic of
348 * the many callers of delete_ust_app_session().
349 */
350 static
351 void delete_ust_app_channel_rcu(struct rcu_head *head)
352 {
353 struct ust_app_channel *ua_chan =
354 caa_container_of(head, struct ust_app_channel, rcu_head);
355
356 ht_cleanup_push(ua_chan->ctx);
357 ht_cleanup_push(ua_chan->events);
358 free(ua_chan);
359 }
360
361 /*
362 * Delete ust app channel safely. RCU read lock must be held before calling
363 * this function.
364 */
365 static
366 void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan,
367 struct ust_app *app)
368 {
369 int ret;
370 struct lttng_ht_iter iter;
371 struct ust_app_event *ua_event;
372 struct ust_app_ctx *ua_ctx;
373 struct ust_app_stream *stream, *stmp;
374 struct ust_registry_session *registry;
375
376 assert(ua_chan);
377
378 DBG3("UST app deleting channel %s", ua_chan->name);
379
380 /* Wipe stream */
381 cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
382 cds_list_del(&stream->list);
383 delete_ust_app_stream(sock, stream);
384 }
385
386 /* Wipe context */
387 cds_lfht_for_each_entry(ua_chan->ctx->ht, &iter.iter, ua_ctx, node.node) {
388 cds_list_del(&ua_ctx->list);
389 ret = lttng_ht_del(ua_chan->ctx, &iter);
390 assert(!ret);
391 delete_ust_app_ctx(sock, ua_ctx);
392 }
393
394 /* Wipe events */
395 cds_lfht_for_each_entry(ua_chan->events->ht, &iter.iter, ua_event,
396 node.node) {
397 ret = lttng_ht_del(ua_chan->events, &iter);
398 assert(!ret);
399 delete_ust_app_event(sock, ua_event);
400 }
401
402 if (ua_chan->session->buffer_type == LTTNG_BUFFER_PER_PID) {
403 /* Wipe and free registry from session registry. */
404 registry = get_session_registry(ua_chan->session);
405 if (registry) {
406 ust_registry_channel_del_free(registry, ua_chan->key);
407 }
408 }
409
410 if (ua_chan->obj != NULL) {
411 /* Remove channel from application UST object descriptor. */
412 iter.iter.node = &ua_chan->ust_objd_node.node;
413 ret = lttng_ht_del(app->ust_objd, &iter);
414 assert(!ret);
415 ret = ustctl_release_object(sock, ua_chan->obj);
416 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
417 ERR("UST app sock %d release channel obj failed with ret %d",
418 sock, ret);
419 }
420 lttng_fd_put(LTTNG_FD_APPS, 1);
421 free(ua_chan->obj);
422 }
423 call_rcu(&ua_chan->rcu_head, delete_ust_app_channel_rcu);
424 }
425
426 /*
427 * Push metadata to consumer socket.
428 *
429 * RCU read-side lock must be held to guarantee existance of socket.
430 * Must be called with the ust app session lock held.
431 * Must be called with the registry lock held.
432 *
433 * On success, return the len of metadata pushed or else a negative value.
434 */
435 ssize_t ust_app_push_metadata(struct ust_registry_session *registry,
436 struct consumer_socket *socket, int send_zero_data)
437 {
438 int ret;
439 char *metadata_str = NULL;
440 size_t len, offset;
441 ssize_t ret_val;
442
443 assert(registry);
444 assert(socket);
445
446 /*
447 * Means that no metadata was assigned to the session. This can
448 * happens if no start has been done previously.
449 */
450 if (!registry->metadata_key) {
451 return 0;
452 }
453
454 /*
455 * On a push metadata error either the consumer is dead or the
456 * metadata channel has been destroyed because its endpoint
457 * might have died (e.g: relayd). If so, the metadata closed
458 * flag is set to 1 so we deny pushing metadata again which is
459 * not valid anymore on the consumer side.
460 */
461 if (registry->metadata_closed) {
462 return -EPIPE;
463 }
464
465 offset = registry->metadata_len_sent;
466 len = registry->metadata_len - registry->metadata_len_sent;
467 if (len == 0) {
468 DBG3("No metadata to push for metadata key %" PRIu64,
469 registry->metadata_key);
470 ret_val = len;
471 if (send_zero_data) {
472 DBG("No metadata to push");
473 goto push_data;
474 }
475 goto end;
476 }
477
478 /* Allocate only what we have to send. */
479 metadata_str = zmalloc(len);
480 if (!metadata_str) {
481 PERROR("zmalloc ust app metadata string");
482 ret_val = -ENOMEM;
483 goto error;
484 }
485 /* Copy what we haven't send out. */
486 memcpy(metadata_str, registry->metadata + offset, len);
487 registry->metadata_len_sent += len;
488
489 push_data:
490 ret = consumer_push_metadata(socket, registry->metadata_key,
491 metadata_str, len, offset);
492 if (ret < 0) {
493 /*
494 * There is an acceptable race here between the registry
495 * metadata key assignment and the creation on the
496 * consumer. The session daemon can concurrently push
497 * metadata for this registry while being created on the
498 * consumer since the metadata key of the registry is
499 * assigned *before* it is setup to avoid the consumer
500 * to ask for metadata that could possibly be not found
501 * in the session daemon.
502 *
503 * The metadata will get pushed either by the session
504 * being stopped or the consumer requesting metadata if
505 * that race is triggered.
506 */
507 if (ret == -LTTCOMM_CONSUMERD_CHANNEL_FAIL) {
508 ret = 0;
509 }
510
511 /*
512 * Update back the actual metadata len sent since it
513 * failed here.
514 */
515 registry->metadata_len_sent -= len;
516 ret_val = ret;
517 goto error_push;
518 }
519
520 free(metadata_str);
521 return len;
522
523 end:
524 error:
525 if (ret_val) {
526 /*
527 * On error, flag the registry that the metadata is
528 * closed. We were unable to push anything and this
529 * means that either the consumer is not responding or
530 * the metadata cache has been destroyed on the
531 * consumer.
532 */
533 registry->metadata_closed = 1;
534 }
535 error_push:
536 free(metadata_str);
537 return ret_val;
538 }
539
540 /*
541 * For a given application and session, push metadata to consumer.
542 * Either sock or consumer is required : if sock is NULL, the default
543 * socket to send the metadata is retrieved from consumer, if sock
544 * is not NULL we use it to send the metadata.
545 * RCU read-side lock must be held while calling this function,
546 * therefore ensuring existance of registry. It also ensures existance
547 * of socket throughout this function.
548 *
549 * Return 0 on success else a negative error.
550 */
551 static int push_metadata(struct ust_registry_session *registry,
552 struct consumer_output *consumer)
553 {
554 int ret_val;
555 ssize_t ret;
556 struct consumer_socket *socket;
557
558 assert(registry);
559 assert(consumer);
560
561 pthread_mutex_lock(&registry->lock);
562 if (registry->metadata_closed) {
563 ret_val = -EPIPE;
564 goto error;
565 }
566
567 /* Get consumer socket to use to push the metadata.*/
568 socket = consumer_find_socket_by_bitness(registry->bits_per_long,
569 consumer);
570 if (!socket) {
571 ret_val = -1;
572 goto error;
573 }
574
575 ret = ust_app_push_metadata(registry, socket, 0);
576 if (ret < 0) {
577 ret_val = ret;
578 goto error;
579 }
580 pthread_mutex_unlock(&registry->lock);
581 return 0;
582
583 error:
584 pthread_mutex_unlock(&registry->lock);
585 return ret_val;
586 }
587
588 /*
589 * Send to the consumer a close metadata command for the given session. Once
590 * done, the metadata channel is deleted and the session metadata pointer is
591 * nullified. The session lock MUST be held unless the application is
592 * in the destroy path.
593 *
594 * Return 0 on success else a negative value.
595 */
596 static int close_metadata(struct ust_registry_session *registry,
597 struct consumer_output *consumer)
598 {
599 int ret;
600 struct consumer_socket *socket;
601
602 assert(registry);
603 assert(consumer);
604
605 rcu_read_lock();
606
607 pthread_mutex_lock(&registry->lock);
608
609 if (!registry->metadata_key || registry->metadata_closed) {
610 ret = 0;
611 goto end;
612 }
613
614 /* Get consumer socket to use to push the metadata.*/
615 socket = consumer_find_socket_by_bitness(registry->bits_per_long,
616 consumer);
617 if (!socket) {
618 ret = -1;
619 goto error;
620 }
621
622 ret = consumer_close_metadata(socket, registry->metadata_key);
623 if (ret < 0) {
624 goto error;
625 }
626
627 error:
628 /*
629 * Metadata closed. Even on error this means that the consumer is not
630 * responding or not found so either way a second close should NOT be emit
631 * for this registry.
632 */
633 registry->metadata_closed = 1;
634 end:
635 pthread_mutex_unlock(&registry->lock);
636 rcu_read_unlock();
637 return ret;
638 }
639
640 /*
641 * We need to execute ht_destroy outside of RCU read-side critical
642 * section and outside of call_rcu thread, so we postpone its execution
643 * using ht_cleanup_push. It is simpler than to change the semantic of
644 * the many callers of delete_ust_app_session().
645 */
646 static
647 void delete_ust_app_session_rcu(struct rcu_head *head)
648 {
649 struct ust_app_session *ua_sess =
650 caa_container_of(head, struct ust_app_session, rcu_head);
651
652 ht_cleanup_push(ua_sess->channels);
653 free(ua_sess);
654 }
655
656 /*
657 * Delete ust app session safely. RCU read lock must be held before calling
658 * this function.
659 */
660 static
661 void delete_ust_app_session(int sock, struct ust_app_session *ua_sess,
662 struct ust_app *app)
663 {
664 int ret;
665 struct lttng_ht_iter iter;
666 struct ust_app_channel *ua_chan;
667 struct ust_registry_session *registry;
668
669 assert(ua_sess);
670
671 pthread_mutex_lock(&ua_sess->lock);
672
673 registry = get_session_registry(ua_sess);
674 if (registry) {
675 /* Push metadata for application before freeing the application. */
676 (void) push_metadata(registry, ua_sess->consumer);
677
678 /*
679 * Don't ask to close metadata for global per UID buffers. Close
680 * metadata only on destroy trace session in this case. Also, the
681 * previous push metadata could have flag the metadata registry to
682 * close so don't send a close command if closed.
683 */
684 if (ua_sess->buffer_type != LTTNG_BUFFER_PER_UID) {
685 /* And ask to close it for this session registry. */
686 (void) close_metadata(registry, ua_sess->consumer);
687 }
688 }
689
690 cds_lfht_for_each_entry(ua_sess->channels->ht, &iter.iter, ua_chan,
691 node.node) {
692 ret = lttng_ht_del(ua_sess->channels, &iter);
693 assert(!ret);
694 delete_ust_app_channel(sock, ua_chan, app);
695 }
696
697 /* In case of per PID, the registry is kept in the session. */
698 if (ua_sess->buffer_type == LTTNG_BUFFER_PER_PID) {
699 struct buffer_reg_pid *reg_pid = buffer_reg_pid_find(ua_sess->id);
700 if (reg_pid) {
701 buffer_reg_pid_remove(reg_pid);
702 buffer_reg_pid_destroy(reg_pid);
703 }
704 }
705
706 if (ua_sess->handle != -1) {
707 ret = ustctl_release_handle(sock, ua_sess->handle);
708 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
709 ERR("UST app sock %d release session handle failed with ret %d",
710 sock, ret);
711 }
712 }
713 pthread_mutex_unlock(&ua_sess->lock);
714
715 call_rcu(&ua_sess->rcu_head, delete_ust_app_session_rcu);
716 }
717
718 /*
719 * Delete a traceable application structure from the global list. Never call
720 * this function outside of a call_rcu call.
721 *
722 * RCU read side lock should _NOT_ be held when calling this function.
723 */
724 static
725 void delete_ust_app(struct ust_app *app)
726 {
727 int ret, sock;
728 struct ust_app_session *ua_sess, *tmp_ua_sess;
729
730 /* Delete ust app sessions info */
731 sock = app->sock;
732 app->sock = -1;
733
734 /* Wipe sessions */
735 cds_list_for_each_entry_safe(ua_sess, tmp_ua_sess, &app->teardown_head,
736 teardown_node) {
737 /* Free every object in the session and the session. */
738 rcu_read_lock();
739 delete_ust_app_session(sock, ua_sess, app);
740 rcu_read_unlock();
741 }
742
743 ht_cleanup_push(app->sessions);
744 ht_cleanup_push(app->ust_objd);
745
746 /*
747 * Wait until we have deleted the application from the sock hash table
748 * before closing this socket, otherwise an application could re-use the
749 * socket ID and race with the teardown, using the same hash table entry.
750 *
751 * It's OK to leave the close in call_rcu. We want it to stay unique for
752 * all RCU readers that could run concurrently with unregister app,
753 * therefore we _need_ to only close that socket after a grace period. So
754 * it should stay in this RCU callback.
755 *
756 * This close() is a very important step of the synchronization model so
757 * every modification to this function must be carefully reviewed.
758 */
759 ret = close(sock);
760 if (ret) {
761 PERROR("close");
762 }
763 lttng_fd_put(LTTNG_FD_APPS, 1);
764
765 DBG2("UST app pid %d deleted", app->pid);
766 free(app);
767 }
768
769 /*
770 * URCU intermediate call to delete an UST app.
771 */
772 static
773 void delete_ust_app_rcu(struct rcu_head *head)
774 {
775 struct lttng_ht_node_ulong *node =
776 caa_container_of(head, struct lttng_ht_node_ulong, head);
777 struct ust_app *app =
778 caa_container_of(node, struct ust_app, pid_n);
779
780 DBG3("Call RCU deleting app PID %d", app->pid);
781 delete_ust_app(app);
782 }
783
784 /*
785 * Delete the session from the application ht and delete the data structure by
786 * freeing every object inside and releasing them.
787 */
788 static void destroy_app_session(struct ust_app *app,
789 struct ust_app_session *ua_sess)
790 {
791 int ret;
792 struct lttng_ht_iter iter;
793
794 assert(app);
795 assert(ua_sess);
796
797 iter.iter.node = &ua_sess->node.node;
798 ret = lttng_ht_del(app->sessions, &iter);
799 if (ret) {
800 /* Already scheduled for teardown. */
801 goto end;
802 }
803
804 /* Once deleted, free the data structure. */
805 delete_ust_app_session(app->sock, ua_sess, app);
806
807 end:
808 return;
809 }
810
811 /*
812 * Alloc new UST app session.
813 */
814 static
815 struct ust_app_session *alloc_ust_app_session(struct ust_app *app)
816 {
817 struct ust_app_session *ua_sess;
818
819 /* Init most of the default value by allocating and zeroing */
820 ua_sess = zmalloc(sizeof(struct ust_app_session));
821 if (ua_sess == NULL) {
822 PERROR("malloc");
823 goto error_free;
824 }
825
826 ua_sess->handle = -1;
827 ua_sess->channels = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
828 ua_sess->metadata_attr.type = LTTNG_UST_CHAN_METADATA;
829 pthread_mutex_init(&ua_sess->lock, NULL);
830
831 return ua_sess;
832
833 error_free:
834 return NULL;
835 }
836
837 /*
838 * Alloc new UST app channel.
839 */
840 static
841 struct ust_app_channel *alloc_ust_app_channel(char *name,
842 struct ust_app_session *ua_sess,
843 struct lttng_ust_channel_attr *attr)
844 {
845 struct ust_app_channel *ua_chan;
846
847 /* Init most of the default value by allocating and zeroing */
848 ua_chan = zmalloc(sizeof(struct ust_app_channel));
849 if (ua_chan == NULL) {
850 PERROR("malloc");
851 goto error;
852 }
853
854 /* Setup channel name */
855 strncpy(ua_chan->name, name, sizeof(ua_chan->name));
856 ua_chan->name[sizeof(ua_chan->name) - 1] = '\0';
857
858 ua_chan->enabled = 1;
859 ua_chan->handle = -1;
860 ua_chan->session = ua_sess;
861 ua_chan->key = get_next_channel_key();
862 ua_chan->ctx = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
863 ua_chan->events = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
864 lttng_ht_node_init_str(&ua_chan->node, ua_chan->name);
865
866 CDS_INIT_LIST_HEAD(&ua_chan->streams.head);
867 CDS_INIT_LIST_HEAD(&ua_chan->ctx_list);
868
869 /* Copy attributes */
870 if (attr) {
871 /* Translate from lttng_ust_channel to ustctl_consumer_channel_attr. */
872 ua_chan->attr.subbuf_size = attr->subbuf_size;
873 ua_chan->attr.num_subbuf = attr->num_subbuf;
874 ua_chan->attr.overwrite = attr->overwrite;
875 ua_chan->attr.switch_timer_interval = attr->switch_timer_interval;
876 ua_chan->attr.read_timer_interval = attr->read_timer_interval;
877 ua_chan->attr.output = attr->output;
878 }
879 /* By default, the channel is a per cpu channel. */
880 ua_chan->attr.type = LTTNG_UST_CHAN_PER_CPU;
881
882 DBG3("UST app channel %s allocated", ua_chan->name);
883
884 return ua_chan;
885
886 error:
887 return NULL;
888 }
889
890 /*
891 * Allocate and initialize a UST app stream.
892 *
893 * Return newly allocated stream pointer or NULL on error.
894 */
895 struct ust_app_stream *ust_app_alloc_stream(void)
896 {
897 struct ust_app_stream *stream = NULL;
898
899 stream = zmalloc(sizeof(*stream));
900 if (stream == NULL) {
901 PERROR("zmalloc ust app stream");
902 goto error;
903 }
904
905 /* Zero could be a valid value for a handle so flag it to -1. */
906 stream->handle = -1;
907
908 error:
909 return stream;
910 }
911
912 /*
913 * Alloc new UST app event.
914 */
915 static
916 struct ust_app_event *alloc_ust_app_event(char *name,
917 struct lttng_ust_event *attr)
918 {
919 struct ust_app_event *ua_event;
920
921 /* Init most of the default value by allocating and zeroing */
922 ua_event = zmalloc(sizeof(struct ust_app_event));
923 if (ua_event == NULL) {
924 PERROR("malloc");
925 goto error;
926 }
927
928 ua_event->enabled = 1;
929 strncpy(ua_event->name, name, sizeof(ua_event->name));
930 ua_event->name[sizeof(ua_event->name) - 1] = '\0';
931 lttng_ht_node_init_str(&ua_event->node, ua_event->name);
932
933 /* Copy attributes */
934 if (attr) {
935 memcpy(&ua_event->attr, attr, sizeof(ua_event->attr));
936 }
937
938 DBG3("UST app event %s allocated", ua_event->name);
939
940 return ua_event;
941
942 error:
943 return NULL;
944 }
945
946 /*
947 * Alloc new UST app context.
948 */
949 static
950 struct ust_app_ctx *alloc_ust_app_ctx(struct lttng_ust_context *uctx)
951 {
952 struct ust_app_ctx *ua_ctx;
953
954 ua_ctx = zmalloc(sizeof(struct ust_app_ctx));
955 if (ua_ctx == NULL) {
956 goto error;
957 }
958
959 CDS_INIT_LIST_HEAD(&ua_ctx->list);
960
961 if (uctx) {
962 memcpy(&ua_ctx->ctx, uctx, sizeof(ua_ctx->ctx));
963 }
964
965 DBG3("UST app context %d allocated", ua_ctx->ctx.ctx);
966
967 error:
968 return ua_ctx;
969 }
970
971 /*
972 * Allocate a filter and copy the given original filter.
973 *
974 * Return allocated filter or NULL on error.
975 */
976 static struct lttng_ust_filter_bytecode *alloc_copy_ust_app_filter(
977 struct lttng_ust_filter_bytecode *orig_f)
978 {
979 struct lttng_ust_filter_bytecode *filter = NULL;
980
981 /* Copy filter bytecode */
982 filter = zmalloc(sizeof(*filter) + orig_f->len);
983 if (!filter) {
984 PERROR("zmalloc alloc ust app filter");
985 goto error;
986 }
987
988 memcpy(filter, orig_f, sizeof(*filter) + orig_f->len);
989
990 error:
991 return filter;
992 }
993
994 /*
995 * Find an ust_app using the sock and return it. RCU read side lock must be
996 * held before calling this helper function.
997 */
998 struct ust_app *ust_app_find_by_sock(int sock)
999 {
1000 struct lttng_ht_node_ulong *node;
1001 struct lttng_ht_iter iter;
1002
1003 lttng_ht_lookup(ust_app_ht_by_sock, (void *)((unsigned long) sock), &iter);
1004 node = lttng_ht_iter_get_node_ulong(&iter);
1005 if (node == NULL) {
1006 DBG2("UST app find by sock %d not found", sock);
1007 goto error;
1008 }
1009
1010 return caa_container_of(node, struct ust_app, sock_n);
1011
1012 error:
1013 return NULL;
1014 }
1015
1016 /*
1017 * Find an ust_app using the notify sock and return it. RCU read side lock must
1018 * be held before calling this helper function.
1019 */
1020 static struct ust_app *find_app_by_notify_sock(int sock)
1021 {
1022 struct lttng_ht_node_ulong *node;
1023 struct lttng_ht_iter iter;
1024
1025 lttng_ht_lookup(ust_app_ht_by_notify_sock, (void *)((unsigned long) sock),
1026 &iter);
1027 node = lttng_ht_iter_get_node_ulong(&iter);
1028 if (node == NULL) {
1029 DBG2("UST app find by notify sock %d not found", sock);
1030 goto error;
1031 }
1032
1033 return caa_container_of(node, struct ust_app, notify_sock_n);
1034
1035 error:
1036 return NULL;
1037 }
1038
1039 /*
1040 * Lookup for an ust app event based on event name, filter bytecode and the
1041 * event loglevel.
1042 *
1043 * Return an ust_app_event object or NULL on error.
1044 */
1045 static struct ust_app_event *find_ust_app_event(struct lttng_ht *ht,
1046 char *name, struct lttng_ust_filter_bytecode *filter, int loglevel,
1047 const struct lttng_event_exclusion *exclusion)
1048 {
1049 struct lttng_ht_iter iter;
1050 struct lttng_ht_node_str *node;
1051 struct ust_app_event *event = NULL;
1052 struct ust_app_ht_key key;
1053
1054 assert(name);
1055 assert(ht);
1056
1057 /* Setup key for event lookup. */
1058 key.name = name;
1059 key.filter = filter;
1060 key.loglevel = loglevel;
1061 /* lttng_event_exclusion and lttng_ust_event_exclusion structures are similar */
1062 key.exclusion = (struct lttng_ust_event_exclusion *)exclusion;
1063
1064 /* Lookup using the event name as hash and a custom match fct. */
1065 cds_lfht_lookup(ht->ht, ht->hash_fct((void *) name, lttng_ht_seed),
1066 ht_match_ust_app_event, &key, &iter.iter);
1067 node = lttng_ht_iter_get_node_str(&iter);
1068 if (node == NULL) {
1069 goto end;
1070 }
1071
1072 event = caa_container_of(node, struct ust_app_event, node);
1073
1074 end:
1075 return event;
1076 }
1077
1078 /*
1079 * Create the channel context on the tracer.
1080 *
1081 * Called with UST app session lock held.
1082 */
1083 static
1084 int create_ust_channel_context(struct ust_app_channel *ua_chan,
1085 struct ust_app_ctx *ua_ctx, struct ust_app *app)
1086 {
1087 int ret;
1088
1089 health_code_update();
1090
1091 ret = ustctl_add_context(app->sock, &ua_ctx->ctx,
1092 ua_chan->obj, &ua_ctx->obj);
1093 if (ret < 0) {
1094 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1095 ERR("UST app create channel context failed for app (pid: %d) "
1096 "with ret %d", app->pid, ret);
1097 } else {
1098 /*
1099 * This is normal behavior, an application can die during the
1100 * creation process. Don't report an error so the execution can
1101 * continue normally.
1102 */
1103 ret = 0;
1104 DBG3("UST app disable event failed. Application is dead.");
1105 }
1106 goto error;
1107 }
1108
1109 ua_ctx->handle = ua_ctx->obj->handle;
1110
1111 DBG2("UST app context handle %d created successfully for channel %s",
1112 ua_ctx->handle, ua_chan->name);
1113
1114 error:
1115 health_code_update();
1116 return ret;
1117 }
1118
1119 /*
1120 * Set the filter on the tracer.
1121 */
1122 static
1123 int set_ust_event_filter(struct ust_app_event *ua_event,
1124 struct ust_app *app)
1125 {
1126 int ret;
1127
1128 health_code_update();
1129
1130 if (!ua_event->filter) {
1131 ret = 0;
1132 goto error;
1133 }
1134
1135 ret = ustctl_set_filter(app->sock, ua_event->filter,
1136 ua_event->obj);
1137 if (ret < 0) {
1138 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1139 ERR("UST app event %s filter failed for app (pid: %d) "
1140 "with ret %d", ua_event->attr.name, app->pid, ret);
1141 } else {
1142 /*
1143 * This is normal behavior, an application can die during the
1144 * creation process. Don't report an error so the execution can
1145 * continue normally.
1146 */
1147 ret = 0;
1148 DBG3("UST app filter event failed. Application is dead.");
1149 }
1150 goto error;
1151 }
1152
1153 DBG2("UST filter set successfully for event %s", ua_event->name);
1154
1155 error:
1156 health_code_update();
1157 return ret;
1158 }
1159
1160 /*
1161 * Set event exclusions on the tracer.
1162 */
1163 static
1164 int set_ust_event_exclusion(struct ust_app_event *ua_event,
1165 struct ust_app *app)
1166 {
1167 int ret;
1168
1169 health_code_update();
1170
1171 if (!ua_event->exclusion || !ua_event->exclusion->count) {
1172 ret = 0;
1173 goto error;
1174 }
1175
1176 ret = ustctl_set_exclusion(app->sock, ua_event->exclusion,
1177 ua_event->obj);
1178 if (ret < 0) {
1179 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1180 ERR("UST app event %s exclusions failed for app (pid: %d) "
1181 "with ret %d", ua_event->attr.name, app->pid, ret);
1182 } else {
1183 /*
1184 * This is normal behavior, an application can die during the
1185 * creation process. Don't report an error so the execution can
1186 * continue normally.
1187 */
1188 ret = 0;
1189 DBG3("UST app event exclusion failed. Application is dead.");
1190 }
1191 goto error;
1192 }
1193
1194 DBG2("UST exclusion set successfully for event %s", ua_event->name);
1195
1196 error:
1197 health_code_update();
1198 return ret;
1199 }
1200
1201 /*
1202 * Disable the specified event on to UST tracer for the UST session.
1203 */
1204 static int disable_ust_event(struct ust_app *app,
1205 struct ust_app_session *ua_sess, struct ust_app_event *ua_event)
1206 {
1207 int ret;
1208
1209 health_code_update();
1210
1211 ret = ustctl_disable(app->sock, ua_event->obj);
1212 if (ret < 0) {
1213 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1214 ERR("UST app event %s disable failed for app (pid: %d) "
1215 "and session handle %d with ret %d",
1216 ua_event->attr.name, app->pid, ua_sess->handle, ret);
1217 } else {
1218 /*
1219 * This is normal behavior, an application can die during the
1220 * creation process. Don't report an error so the execution can
1221 * continue normally.
1222 */
1223 ret = 0;
1224 DBG3("UST app disable event failed. Application is dead.");
1225 }
1226 goto error;
1227 }
1228
1229 DBG2("UST app event %s disabled successfully for app (pid: %d)",
1230 ua_event->attr.name, app->pid);
1231
1232 error:
1233 health_code_update();
1234 return ret;
1235 }
1236
1237 /*
1238 * Disable the specified channel on to UST tracer for the UST session.
1239 */
1240 static int disable_ust_channel(struct ust_app *app,
1241 struct ust_app_session *ua_sess, struct ust_app_channel *ua_chan)
1242 {
1243 int ret;
1244
1245 health_code_update();
1246
1247 ret = ustctl_disable(app->sock, ua_chan->obj);
1248 if (ret < 0) {
1249 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1250 ERR("UST app channel %s disable failed for app (pid: %d) "
1251 "and session handle %d with ret %d",
1252 ua_chan->name, app->pid, ua_sess->handle, ret);
1253 } else {
1254 /*
1255 * This is normal behavior, an application can die during the
1256 * creation process. Don't report an error so the execution can
1257 * continue normally.
1258 */
1259 ret = 0;
1260 DBG3("UST app disable channel failed. Application is dead.");
1261 }
1262 goto error;
1263 }
1264
1265 DBG2("UST app channel %s disabled successfully for app (pid: %d)",
1266 ua_chan->name, app->pid);
1267
1268 error:
1269 health_code_update();
1270 return ret;
1271 }
1272
1273 /*
1274 * Enable the specified channel on to UST tracer for the UST session.
1275 */
1276 static int enable_ust_channel(struct ust_app *app,
1277 struct ust_app_session *ua_sess, struct ust_app_channel *ua_chan)
1278 {
1279 int ret;
1280
1281 health_code_update();
1282
1283 ret = ustctl_enable(app->sock, ua_chan->obj);
1284 if (ret < 0) {
1285 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1286 ERR("UST app channel %s enable failed for app (pid: %d) "
1287 "and session handle %d with ret %d",
1288 ua_chan->name, app->pid, ua_sess->handle, ret);
1289 } else {
1290 /*
1291 * This is normal behavior, an application can die during the
1292 * creation process. Don't report an error so the execution can
1293 * continue normally.
1294 */
1295 ret = 0;
1296 DBG3("UST app enable channel failed. Application is dead.");
1297 }
1298 goto error;
1299 }
1300
1301 ua_chan->enabled = 1;
1302
1303 DBG2("UST app channel %s enabled successfully for app (pid: %d)",
1304 ua_chan->name, app->pid);
1305
1306 error:
1307 health_code_update();
1308 return ret;
1309 }
1310
1311 /*
1312 * Enable the specified event on to UST tracer for the UST session.
1313 */
1314 static int enable_ust_event(struct ust_app *app,
1315 struct ust_app_session *ua_sess, struct ust_app_event *ua_event)
1316 {
1317 int ret;
1318
1319 health_code_update();
1320
1321 ret = ustctl_enable(app->sock, ua_event->obj);
1322 if (ret < 0) {
1323 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1324 ERR("UST app event %s enable failed for app (pid: %d) "
1325 "and session handle %d with ret %d",
1326 ua_event->attr.name, app->pid, ua_sess->handle, ret);
1327 } else {
1328 /*
1329 * This is normal behavior, an application can die during the
1330 * creation process. Don't report an error so the execution can
1331 * continue normally.
1332 */
1333 ret = 0;
1334 DBG3("UST app enable event failed. Application is dead.");
1335 }
1336 goto error;
1337 }
1338
1339 DBG2("UST app event %s enabled successfully for app (pid: %d)",
1340 ua_event->attr.name, app->pid);
1341
1342 error:
1343 health_code_update();
1344 return ret;
1345 }
1346
1347 /*
1348 * Send channel and stream buffer to application.
1349 *
1350 * Return 0 on success. On error, a negative value is returned.
1351 */
1352 static int send_channel_pid_to_ust(struct ust_app *app,
1353 struct ust_app_session *ua_sess, struct ust_app_channel *ua_chan)
1354 {
1355 int ret;
1356 struct ust_app_stream *stream, *stmp;
1357
1358 assert(app);
1359 assert(ua_sess);
1360 assert(ua_chan);
1361
1362 health_code_update();
1363
1364 DBG("UST app sending channel %s to UST app sock %d", ua_chan->name,
1365 app->sock);
1366
1367 /* Send channel to the application. */
1368 ret = ust_consumer_send_channel_to_ust(app, ua_sess, ua_chan);
1369 if (ret < 0) {
1370 goto error;
1371 }
1372
1373 health_code_update();
1374
1375 /* Send all streams to application. */
1376 cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
1377 ret = ust_consumer_send_stream_to_ust(app, ua_chan, stream);
1378 if (ret < 0) {
1379 goto error;
1380 }
1381 /* We don't need the stream anymore once sent to the tracer. */
1382 cds_list_del(&stream->list);
1383 delete_ust_app_stream(-1, stream);
1384 }
1385 /* Flag the channel that it is sent to the application. */
1386 ua_chan->is_sent = 1;
1387
1388 error:
1389 health_code_update();
1390 return ret;
1391 }
1392
1393 /*
1394 * Create the specified event onto the UST tracer for a UST session.
1395 *
1396 * Should be called with session mutex held.
1397 */
1398 static
1399 int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess,
1400 struct ust_app_channel *ua_chan, struct ust_app_event *ua_event)
1401 {
1402 int ret = 0;
1403
1404 health_code_update();
1405
1406 /* Create UST event on tracer */
1407 ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
1408 &ua_event->obj);
1409 if (ret < 0) {
1410 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1411 ERR("Error ustctl create event %s for app pid: %d with ret %d",
1412 ua_event->attr.name, app->pid, ret);
1413 } else {
1414 /*
1415 * This is normal behavior, an application can die during the
1416 * creation process. Don't report an error so the execution can
1417 * continue normally.
1418 */
1419 ret = 0;
1420 DBG3("UST app create event failed. Application is dead.");
1421 }
1422 goto error;
1423 }
1424
1425 ua_event->handle = ua_event->obj->handle;
1426
1427 DBG2("UST app event %s created successfully for pid:%d",
1428 ua_event->attr.name, app->pid);
1429
1430 health_code_update();
1431
1432 /* Set filter if one is present. */
1433 if (ua_event->filter) {
1434 ret = set_ust_event_filter(ua_event, app);
1435 if (ret < 0) {
1436 goto error;
1437 }
1438 }
1439
1440 /* Set exclusions for the event */
1441 if (ua_event->exclusion) {
1442 ret = set_ust_event_exclusion(ua_event, app);
1443 if (ret < 0) {
1444 goto error;
1445 }
1446 }
1447
1448 /* If event not enabled, disable it on the tracer */
1449 if (ua_event->enabled) {
1450 /*
1451 * We now need to explicitly enable the event, since it
1452 * is now disabled at creation.
1453 */
1454 ret = enable_ust_event(app, ua_sess, ua_event);
1455 if (ret < 0) {
1456 /*
1457 * If we hit an EPERM, something is wrong with our enable call. If
1458 * we get an EEXIST, there is a problem on the tracer side since we
1459 * just created it.
1460 */
1461 switch (ret) {
1462 case -LTTNG_UST_ERR_PERM:
1463 /* Code flow problem */
1464 assert(0);
1465 case -LTTNG_UST_ERR_EXIST:
1466 /* It's OK for our use case. */
1467 ret = 0;
1468 break;
1469 default:
1470 break;
1471 }
1472 goto error;
1473 }
1474 }
1475
1476 error:
1477 health_code_update();
1478 return ret;
1479 }
1480
1481 /*
1482 * Copy data between an UST app event and a LTT event.
1483 */
1484 static void shadow_copy_event(struct ust_app_event *ua_event,
1485 struct ltt_ust_event *uevent)
1486 {
1487 size_t exclusion_alloc_size;
1488
1489 strncpy(ua_event->name, uevent->attr.name, sizeof(ua_event->name));
1490 ua_event->name[sizeof(ua_event->name) - 1] = '\0';
1491
1492 ua_event->enabled = uevent->enabled;
1493
1494 /* Copy event attributes */
1495 memcpy(&ua_event->attr, &uevent->attr, sizeof(ua_event->attr));
1496
1497 /* Copy filter bytecode */
1498 if (uevent->filter) {
1499 ua_event->filter = alloc_copy_ust_app_filter(uevent->filter);
1500 /* Filter might be NULL here in case of ENONEM. */
1501 }
1502
1503 /* Copy exclusion data */
1504 if (uevent->exclusion) {
1505 exclusion_alloc_size = sizeof(struct lttng_ust_event_exclusion) +
1506 LTTNG_UST_SYM_NAME_LEN * uevent->exclusion->count;
1507 ua_event->exclusion = zmalloc(exclusion_alloc_size);
1508 if (ua_event->exclusion == NULL) {
1509 PERROR("malloc");
1510 } else {
1511 memcpy(ua_event->exclusion, uevent->exclusion,
1512 exclusion_alloc_size);
1513 }
1514 }
1515 }
1516
1517 /*
1518 * Copy data between an UST app channel and a LTT channel.
1519 */
1520 static void shadow_copy_channel(struct ust_app_channel *ua_chan,
1521 struct ltt_ust_channel *uchan)
1522 {
1523 struct lttng_ht_iter iter;
1524 struct ltt_ust_event *uevent;
1525 struct ltt_ust_context *uctx;
1526 struct ust_app_event *ua_event;
1527 struct ust_app_ctx *ua_ctx;
1528
1529 DBG2("UST app shadow copy of channel %s started", ua_chan->name);
1530
1531 strncpy(ua_chan->name, uchan->name, sizeof(ua_chan->name));
1532 ua_chan->name[sizeof(ua_chan->name) - 1] = '\0';
1533
1534 ua_chan->tracefile_size = uchan->tracefile_size;
1535 ua_chan->tracefile_count = uchan->tracefile_count;
1536
1537 /* Copy event attributes since the layout is different. */
1538 ua_chan->attr.subbuf_size = uchan->attr.subbuf_size;
1539 ua_chan->attr.num_subbuf = uchan->attr.num_subbuf;
1540 ua_chan->attr.overwrite = uchan->attr.overwrite;
1541 ua_chan->attr.switch_timer_interval = uchan->attr.switch_timer_interval;
1542 ua_chan->attr.read_timer_interval = uchan->attr.read_timer_interval;
1543 ua_chan->attr.output = uchan->attr.output;
1544 /*
1545 * Note that the attribute channel type is not set since the channel on the
1546 * tracing registry side does not have this information.
1547 */
1548
1549 ua_chan->enabled = uchan->enabled;
1550 ua_chan->tracing_channel_id = uchan->id;
1551
1552 cds_list_for_each_entry(uctx, &uchan->ctx_list, list) {
1553 ua_ctx = alloc_ust_app_ctx(&uctx->ctx);
1554 if (ua_ctx == NULL) {
1555 continue;
1556 }
1557 lttng_ht_node_init_ulong(&ua_ctx->node,
1558 (unsigned long) ua_ctx->ctx.ctx);
1559 lttng_ht_add_ulong(ua_chan->ctx, &ua_ctx->node);
1560 cds_list_add_tail(&ua_ctx->list, &ua_chan->ctx_list);
1561 }
1562
1563 /* Copy all events from ltt ust channel to ust app channel */
1564 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
1565 ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
1566 uevent->filter, uevent->attr.loglevel, uevent->exclusion);
1567 if (ua_event == NULL) {
1568 DBG2("UST event %s not found on shadow copy channel",
1569 uevent->attr.name);
1570 ua_event = alloc_ust_app_event(uevent->attr.name, &uevent->attr);
1571 if (ua_event == NULL) {
1572 continue;
1573 }
1574 shadow_copy_event(ua_event, uevent);
1575 add_unique_ust_app_event(ua_chan, ua_event);
1576 }
1577 }
1578
1579 DBG3("UST app shadow copy of channel %s done", ua_chan->name);
1580 }
1581
1582 /*
1583 * Copy data between a UST app session and a regular LTT session.
1584 */
1585 static void shadow_copy_session(struct ust_app_session *ua_sess,
1586 struct ltt_ust_session *usess, struct ust_app *app)
1587 {
1588 struct lttng_ht_node_str *ua_chan_node;
1589 struct lttng_ht_iter iter;
1590 struct ltt_ust_channel *uchan;
1591 struct ust_app_channel *ua_chan;
1592 time_t rawtime;
1593 struct tm *timeinfo;
1594 char datetime[16];
1595 int ret;
1596
1597 /* Get date and time for unique app path */
1598 time(&rawtime);
1599 timeinfo = localtime(&rawtime);
1600 strftime(datetime, sizeof(datetime), "%Y%m%d-%H%M%S", timeinfo);
1601
1602 DBG2("Shadow copy of session handle %d", ua_sess->handle);
1603
1604 ua_sess->tracing_id = usess->id;
1605 ua_sess->id = get_next_session_id();
1606 ua_sess->uid = app->uid;
1607 ua_sess->gid = app->gid;
1608 ua_sess->euid = usess->uid;
1609 ua_sess->egid = usess->gid;
1610 ua_sess->buffer_type = usess->buffer_type;
1611 ua_sess->bits_per_long = app->bits_per_long;
1612 /* There is only one consumer object per session possible. */
1613 ua_sess->consumer = usess->consumer;
1614 ua_sess->output_traces = usess->output_traces;
1615 ua_sess->live_timer_interval = usess->live_timer_interval;
1616 copy_channel_attr_to_ustctl(&ua_sess->metadata_attr,
1617 &usess->metadata_attr);
1618
1619 switch (ua_sess->buffer_type) {
1620 case LTTNG_BUFFER_PER_PID:
1621 ret = snprintf(ua_sess->path, sizeof(ua_sess->path),
1622 DEFAULT_UST_TRACE_PID_PATH "/%s-%d-%s", app->name, app->pid,
1623 datetime);
1624 break;
1625 case LTTNG_BUFFER_PER_UID:
1626 ret = snprintf(ua_sess->path, sizeof(ua_sess->path),
1627 DEFAULT_UST_TRACE_UID_PATH, ua_sess->uid, app->bits_per_long);
1628 break;
1629 default:
1630 assert(0);
1631 goto error;
1632 }
1633 if (ret < 0) {
1634 PERROR("asprintf UST shadow copy session");
1635 assert(0);
1636 goto error;
1637 }
1638
1639 /* Iterate over all channels in global domain. */
1640 cds_lfht_for_each_entry(usess->domain_global.channels->ht, &iter.iter,
1641 uchan, node.node) {
1642 struct lttng_ht_iter uiter;
1643
1644 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
1645 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
1646 if (ua_chan_node != NULL) {
1647 /* Session exist. Contiuing. */
1648 continue;
1649 }
1650
1651 DBG2("Channel %s not found on shadow session copy, creating it",
1652 uchan->name);
1653 ua_chan = alloc_ust_app_channel(uchan->name, ua_sess, &uchan->attr);
1654 if (ua_chan == NULL) {
1655 /* malloc failed FIXME: Might want to do handle ENOMEM .. */
1656 continue;
1657 }
1658 shadow_copy_channel(ua_chan, uchan);
1659 /*
1660 * The concept of metadata channel does not exist on the tracing
1661 * registry side of the session daemon so this can only be a per CPU
1662 * channel and not metadata.
1663 */
1664 ua_chan->attr.type = LTTNG_UST_CHAN_PER_CPU;
1665
1666 lttng_ht_add_unique_str(ua_sess->channels, &ua_chan->node);
1667 }
1668
1669 error:
1670 return;
1671 }
1672
1673 /*
1674 * Lookup sesison wrapper.
1675 */
1676 static
1677 void __lookup_session_by_app(struct ltt_ust_session *usess,
1678 struct ust_app *app, struct lttng_ht_iter *iter)
1679 {
1680 /* Get right UST app session from app */
1681 lttng_ht_lookup(app->sessions, &usess->id, iter);
1682 }
1683
1684 /*
1685 * Return ust app session from the app session hashtable using the UST session
1686 * id.
1687 */
1688 static struct ust_app_session *lookup_session_by_app(
1689 struct ltt_ust_session *usess, struct ust_app *app)
1690 {
1691 struct lttng_ht_iter iter;
1692 struct lttng_ht_node_u64 *node;
1693
1694 __lookup_session_by_app(usess, app, &iter);
1695 node = lttng_ht_iter_get_node_u64(&iter);
1696 if (node == NULL) {
1697 goto error;
1698 }
1699
1700 return caa_container_of(node, struct ust_app_session, node);
1701
1702 error:
1703 return NULL;
1704 }
1705
1706 /*
1707 * Setup buffer registry per PID for the given session and application. If none
1708 * is found, a new one is created, added to the global registry and
1709 * initialized. If regp is valid, it's set with the newly created object.
1710 *
1711 * Return 0 on success or else a negative value.
1712 */
1713 static int setup_buffer_reg_pid(struct ust_app_session *ua_sess,
1714 struct ust_app *app, struct buffer_reg_pid **regp)
1715 {
1716 int ret = 0;
1717 struct buffer_reg_pid *reg_pid;
1718
1719 assert(ua_sess);
1720 assert(app);
1721
1722 rcu_read_lock();
1723
1724 reg_pid = buffer_reg_pid_find(ua_sess->id);
1725 if (!reg_pid) {
1726 /*
1727 * This is the create channel path meaning that if there is NO
1728 * registry available, we have to create one for this session.
1729 */
1730 ret = buffer_reg_pid_create(ua_sess->id, &reg_pid);
1731 if (ret < 0) {
1732 goto error;
1733 }
1734 } else {
1735 goto end;
1736 }
1737
1738 /* Initialize registry. */
1739 ret = ust_registry_session_init(&reg_pid->registry->reg.ust, app,
1740 app->bits_per_long, app->uint8_t_alignment,
1741 app->uint16_t_alignment, app->uint32_t_alignment,
1742 app->uint64_t_alignment, app->long_alignment,
1743 app->byte_order, app->version.major,
1744 app->version.minor);
1745 if (ret < 0) {
1746 /*
1747 * reg_pid->registry->reg.ust is NULL upon error, so we need to
1748 * destroy the buffer registry, because it is always expected
1749 * that if the buffer registry can be found, its ust registry is
1750 * non-NULL.
1751 */
1752 buffer_reg_pid_destroy(reg_pid);
1753 goto error;
1754 }
1755
1756 buffer_reg_pid_add(reg_pid);
1757
1758 DBG3("UST app buffer registry per PID created successfully");
1759
1760 end:
1761 if (regp) {
1762 *regp = reg_pid;
1763 }
1764 error:
1765 rcu_read_unlock();
1766 return ret;
1767 }
1768
1769 /*
1770 * Setup buffer registry per UID for the given session and application. If none
1771 * is found, a new one is created, added to the global registry and
1772 * initialized. If regp is valid, it's set with the newly created object.
1773 *
1774 * Return 0 on success or else a negative value.
1775 */
1776 static int setup_buffer_reg_uid(struct ltt_ust_session *usess,
1777 struct ust_app *app, struct buffer_reg_uid **regp)
1778 {
1779 int ret = 0;
1780 struct buffer_reg_uid *reg_uid;
1781
1782 assert(usess);
1783 assert(app);
1784
1785 rcu_read_lock();
1786
1787 reg_uid = buffer_reg_uid_find(usess->id, app->bits_per_long, app->uid);
1788 if (!reg_uid) {
1789 /*
1790 * This is the create channel path meaning that if there is NO
1791 * registry available, we have to create one for this session.
1792 */
1793 ret = buffer_reg_uid_create(usess->id, app->bits_per_long, app->uid,
1794 LTTNG_DOMAIN_UST, &reg_uid);
1795 if (ret < 0) {
1796 goto error;
1797 }
1798 } else {
1799 goto end;
1800 }
1801
1802 /* Initialize registry. */
1803 ret = ust_registry_session_init(&reg_uid->registry->reg.ust, NULL,
1804 app->bits_per_long, app->uint8_t_alignment,
1805 app->uint16_t_alignment, app->uint32_t_alignment,
1806 app->uint64_t_alignment, app->long_alignment,
1807 app->byte_order, app->version.major,
1808 app->version.minor);
1809 if (ret < 0) {
1810 /*
1811 * reg_uid->registry->reg.ust is NULL upon error, so we need to
1812 * destroy the buffer registry, because it is always expected
1813 * that if the buffer registry can be found, its ust registry is
1814 * non-NULL.
1815 */
1816 buffer_reg_uid_destroy(reg_uid, NULL);
1817 goto error;
1818 }
1819 /* Add node to teardown list of the session. */
1820 cds_list_add(&reg_uid->lnode, &usess->buffer_reg_uid_list);
1821
1822 buffer_reg_uid_add(reg_uid);
1823
1824 DBG3("UST app buffer registry per UID created successfully");
1825 end:
1826 if (regp) {
1827 *regp = reg_uid;
1828 }
1829 error:
1830 rcu_read_unlock();
1831 return ret;
1832 }
1833
1834 /*
1835 * Create a session on the tracer side for the given app.
1836 *
1837 * On success, ua_sess_ptr is populated with the session pointer or else left
1838 * untouched. If the session was created, is_created is set to 1. On error,
1839 * it's left untouched. Note that ua_sess_ptr is mandatory but is_created can
1840 * be NULL.
1841 *
1842 * Returns 0 on success or else a negative code which is either -ENOMEM or
1843 * -ENOTCONN which is the default code if the ustctl_create_session fails.
1844 */
1845 static int create_ust_app_session(struct ltt_ust_session *usess,
1846 struct ust_app *app, struct ust_app_session **ua_sess_ptr,
1847 int *is_created)
1848 {
1849 int ret, created = 0;
1850 struct ust_app_session *ua_sess;
1851
1852 assert(usess);
1853 assert(app);
1854 assert(ua_sess_ptr);
1855
1856 health_code_update();
1857
1858 ua_sess = lookup_session_by_app(usess, app);
1859 if (ua_sess == NULL) {
1860 DBG2("UST app pid: %d session id %" PRIu64 " not found, creating it",
1861 app->pid, usess->id);
1862 ua_sess = alloc_ust_app_session(app);
1863 if (ua_sess == NULL) {
1864 /* Only malloc can failed so something is really wrong */
1865 ret = -ENOMEM;
1866 goto error;
1867 }
1868 shadow_copy_session(ua_sess, usess, app);
1869 created = 1;
1870 }
1871
1872 switch (usess->buffer_type) {
1873 case LTTNG_BUFFER_PER_PID:
1874 /* Init local registry. */
1875 ret = setup_buffer_reg_pid(ua_sess, app, NULL);
1876 if (ret < 0) {
1877 delete_ust_app_session(-1, ua_sess, app);
1878 goto error;
1879 }
1880 break;
1881 case LTTNG_BUFFER_PER_UID:
1882 /* Look for a global registry. If none exists, create one. */
1883 ret = setup_buffer_reg_uid(usess, app, NULL);
1884 if (ret < 0) {
1885 delete_ust_app_session(-1, ua_sess, app);
1886 goto error;
1887 }
1888 break;
1889 default:
1890 assert(0);
1891 ret = -EINVAL;
1892 goto error;
1893 }
1894
1895 health_code_update();
1896
1897 if (ua_sess->handle == -1) {
1898 ret = ustctl_create_session(app->sock);
1899 if (ret < 0) {
1900 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
1901 ERR("Creating session for app pid %d with ret %d",
1902 app->pid, ret);
1903 } else {
1904 DBG("UST app creating session failed. Application is dead");
1905 /*
1906 * This is normal behavior, an application can die during the
1907 * creation process. Don't report an error so the execution can
1908 * continue normally. This will get flagged ENOTCONN and the
1909 * caller will handle it.
1910 */
1911 ret = 0;
1912 }
1913 delete_ust_app_session(-1, ua_sess, app);
1914 if (ret != -ENOMEM) {
1915 /*
1916 * Tracer is probably gone or got an internal error so let's
1917 * behave like it will soon unregister or not usable.
1918 */
1919 ret = -ENOTCONN;
1920 }
1921 goto error;
1922 }
1923
1924 ua_sess->handle = ret;
1925
1926 /* Add ust app session to app's HT */
1927 lttng_ht_node_init_u64(&ua_sess->node,
1928 ua_sess->tracing_id);
1929 lttng_ht_add_unique_u64(app->sessions, &ua_sess->node);
1930
1931 DBG2("UST app session created successfully with handle %d", ret);
1932 }
1933
1934 *ua_sess_ptr = ua_sess;
1935 if (is_created) {
1936 *is_created = created;
1937 }
1938
1939 /* Everything went well. */
1940 ret = 0;
1941
1942 error:
1943 health_code_update();
1944 return ret;
1945 }
1946
1947 /*
1948 * Match function for a hash table lookup of ust_app_ctx.
1949 *
1950 * It matches an ust app context based on the context type and, in the case
1951 * of perf counters, their name.
1952 */
1953 static int ht_match_ust_app_ctx(struct cds_lfht_node *node, const void *_key)
1954 {
1955 struct ust_app_ctx *ctx;
1956 const struct lttng_ust_context *key;
1957
1958 assert(node);
1959 assert(_key);
1960
1961 ctx = caa_container_of(node, struct ust_app_ctx, node.node);
1962 key = _key;
1963
1964 /* Context type */
1965 if (ctx->ctx.ctx != key->ctx) {
1966 goto no_match;
1967 }
1968
1969 /* Check the name in the case of perf thread counters. */
1970 if (key->ctx == LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER) {
1971 if (strncmp(key->u.perf_counter.name,
1972 ctx->ctx.u.perf_counter.name,
1973 sizeof(key->u.perf_counter.name))) {
1974 goto no_match;
1975 }
1976 }
1977
1978 /* Match. */
1979 return 1;
1980
1981 no_match:
1982 return 0;
1983 }
1984
1985 /*
1986 * Lookup for an ust app context from an lttng_ust_context.
1987 *
1988 * Must be called while holding RCU read side lock.
1989 * Return an ust_app_ctx object or NULL on error.
1990 */
1991 static
1992 struct ust_app_ctx *find_ust_app_context(struct lttng_ht *ht,
1993 struct lttng_ust_context *uctx)
1994 {
1995 struct lttng_ht_iter iter;
1996 struct lttng_ht_node_ulong *node;
1997 struct ust_app_ctx *app_ctx = NULL;
1998
1999 assert(uctx);
2000 assert(ht);
2001
2002 /* Lookup using the lttng_ust_context_type and a custom match fct. */
2003 cds_lfht_lookup(ht->ht, ht->hash_fct((void *) uctx->ctx, lttng_ht_seed),
2004 ht_match_ust_app_ctx, uctx, &iter.iter);
2005 node = lttng_ht_iter_get_node_ulong(&iter);
2006 if (!node) {
2007 goto end;
2008 }
2009
2010 app_ctx = caa_container_of(node, struct ust_app_ctx, node);
2011
2012 end:
2013 return app_ctx;
2014 }
2015
2016 /*
2017 * Create a context for the channel on the tracer.
2018 *
2019 * Called with UST app session lock held and a RCU read side lock.
2020 */
2021 static
2022 int create_ust_app_channel_context(struct ust_app_session *ua_sess,
2023 struct ust_app_channel *ua_chan, struct lttng_ust_context *uctx,
2024 struct ust_app *app)
2025 {
2026 int ret = 0;
2027 struct ust_app_ctx *ua_ctx;
2028
2029 DBG2("UST app adding context to channel %s", ua_chan->name);
2030
2031 ua_ctx = find_ust_app_context(ua_chan->ctx, uctx);
2032 if (ua_ctx) {
2033 ret = -EEXIST;
2034 goto error;
2035 }
2036
2037 ua_ctx = alloc_ust_app_ctx(uctx);
2038 if (ua_ctx == NULL) {
2039 /* malloc failed */
2040 ret = -1;
2041 goto error;
2042 }
2043
2044 lttng_ht_node_init_ulong(&ua_ctx->node, (unsigned long) ua_ctx->ctx.ctx);
2045 lttng_ht_add_ulong(ua_chan->ctx, &ua_ctx->node);
2046 cds_list_add_tail(&ua_ctx->list, &ua_chan->ctx_list);
2047
2048 ret = create_ust_channel_context(ua_chan, ua_ctx, app);
2049 if (ret < 0) {
2050 goto error;
2051 }
2052
2053 error:
2054 return ret;
2055 }
2056
2057 /*
2058 * Enable on the tracer side a ust app event for the session and channel.
2059 *
2060 * Called with UST app session lock held.
2061 */
2062 static
2063 int enable_ust_app_event(struct ust_app_session *ua_sess,
2064 struct ust_app_event *ua_event, struct ust_app *app)
2065 {
2066 int ret;
2067
2068 ret = enable_ust_event(app, ua_sess, ua_event);
2069 if (ret < 0) {
2070 goto error;
2071 }
2072
2073 ua_event->enabled = 1;
2074
2075 error:
2076 return ret;
2077 }
2078
2079 /*
2080 * Disable on the tracer side a ust app event for the session and channel.
2081 */
2082 static int disable_ust_app_event(struct ust_app_session *ua_sess,
2083 struct ust_app_event *ua_event, struct ust_app *app)
2084 {
2085 int ret;
2086
2087 ret = disable_ust_event(app, ua_sess, ua_event);
2088 if (ret < 0) {
2089 goto error;
2090 }
2091
2092 ua_event->enabled = 0;
2093
2094 error:
2095 return ret;
2096 }
2097
2098 /*
2099 * Lookup ust app channel for session and disable it on the tracer side.
2100 */
2101 static
2102 int disable_ust_app_channel(struct ust_app_session *ua_sess,
2103 struct ust_app_channel *ua_chan, struct ust_app *app)
2104 {
2105 int ret;
2106
2107 ret = disable_ust_channel(app, ua_sess, ua_chan);
2108 if (ret < 0) {
2109 goto error;
2110 }
2111
2112 ua_chan->enabled = 0;
2113
2114 error:
2115 return ret;
2116 }
2117
2118 /*
2119 * Lookup ust app channel for session and enable it on the tracer side. This
2120 * MUST be called with a RCU read side lock acquired.
2121 */
2122 static int enable_ust_app_channel(struct ust_app_session *ua_sess,
2123 struct ltt_ust_channel *uchan, struct ust_app *app)
2124 {
2125 int ret = 0;
2126 struct lttng_ht_iter iter;
2127 struct lttng_ht_node_str *ua_chan_node;
2128 struct ust_app_channel *ua_chan;
2129
2130 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &iter);
2131 ua_chan_node = lttng_ht_iter_get_node_str(&iter);
2132 if (ua_chan_node == NULL) {
2133 DBG2("Unable to find channel %s in ust session id %" PRIu64,
2134 uchan->name, ua_sess->tracing_id);
2135 goto error;
2136 }
2137
2138 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
2139
2140 ret = enable_ust_channel(app, ua_sess, ua_chan);
2141 if (ret < 0) {
2142 goto error;
2143 }
2144
2145 error:
2146 return ret;
2147 }
2148
2149 /*
2150 * Ask the consumer to create a channel and get it if successful.
2151 *
2152 * Return 0 on success or else a negative value.
2153 */
2154 static int do_consumer_create_channel(struct ltt_ust_session *usess,
2155 struct ust_app_session *ua_sess, struct ust_app_channel *ua_chan,
2156 int bitness, struct ust_registry_session *registry)
2157 {
2158 int ret;
2159 unsigned int nb_fd = 0;
2160 struct consumer_socket *socket;
2161
2162 assert(usess);
2163 assert(ua_sess);
2164 assert(ua_chan);
2165 assert(registry);
2166
2167 rcu_read_lock();
2168 health_code_update();
2169
2170 /* Get the right consumer socket for the application. */
2171 socket = consumer_find_socket_by_bitness(bitness, usess->consumer);
2172 if (!socket) {
2173 ret = -EINVAL;
2174 goto error;
2175 }
2176
2177 health_code_update();
2178
2179 /* Need one fd for the channel. */
2180 ret = lttng_fd_get(LTTNG_FD_APPS, 1);
2181 if (ret < 0) {
2182 ERR("Exhausted number of available FD upon create channel");
2183 goto error;
2184 }
2185
2186 /*
2187 * Ask consumer to create channel. The consumer will return the number of
2188 * stream we have to expect.
2189 */
2190 ret = ust_consumer_ask_channel(ua_sess, ua_chan, usess->consumer, socket,
2191 registry);
2192 if (ret < 0) {
2193 goto error_ask;
2194 }
2195
2196 /*
2197 * Compute the number of fd needed before receiving them. It must be 2 per
2198 * stream (2 being the default value here).
2199 */
2200 nb_fd = DEFAULT_UST_STREAM_FD_NUM * ua_chan->expected_stream_count;
2201
2202 /* Reserve the amount of file descriptor we need. */
2203 ret = lttng_fd_get(LTTNG_FD_APPS, nb_fd);
2204 if (ret < 0) {
2205 ERR("Exhausted number of available FD upon create channel");
2206 goto error_fd_get_stream;
2207 }
2208
2209 health_code_update();
2210
2211 /*
2212 * Now get the channel from the consumer. This call wil populate the stream
2213 * list of that channel and set the ust objects.
2214 */
2215 if (usess->consumer->enabled) {
2216 ret = ust_consumer_get_channel(socket, ua_chan);
2217 if (ret < 0) {
2218 goto error_destroy;
2219 }
2220 }
2221
2222 rcu_read_unlock();
2223 return 0;
2224
2225 error_destroy:
2226 lttng_fd_put(LTTNG_FD_APPS, nb_fd);
2227 error_fd_get_stream:
2228 /*
2229 * Initiate a destroy channel on the consumer since we had an error
2230 * handling it on our side. The return value is of no importance since we
2231 * already have a ret value set by the previous error that we need to
2232 * return.
2233 */
2234 (void) ust_consumer_destroy_channel(socket, ua_chan);
2235 error_ask:
2236 lttng_fd_put(LTTNG_FD_APPS, 1);
2237 error:
2238 health_code_update();
2239 rcu_read_unlock();
2240 return ret;
2241 }
2242
2243 /*
2244 * Duplicate the ust data object of the ust app stream and save it in the
2245 * buffer registry stream.
2246 *
2247 * Return 0 on success or else a negative value.
2248 */
2249 static int duplicate_stream_object(struct buffer_reg_stream *reg_stream,
2250 struct ust_app_stream *stream)
2251 {
2252 int ret;
2253
2254 assert(reg_stream);
2255 assert(stream);
2256
2257 /* Reserve the amount of file descriptor we need. */
2258 ret = lttng_fd_get(LTTNG_FD_APPS, 2);
2259 if (ret < 0) {
2260 ERR("Exhausted number of available FD upon duplicate stream");
2261 goto error;
2262 }
2263
2264 /* Duplicate object for stream once the original is in the registry. */
2265 ret = ustctl_duplicate_ust_object_data(&stream->obj,
2266 reg_stream->obj.ust);
2267 if (ret < 0) {
2268 ERR("Duplicate stream obj from %p to %p failed with ret %d",
2269 reg_stream->obj.ust, stream->obj, ret);
2270 lttng_fd_put(LTTNG_FD_APPS, 2);
2271 goto error;
2272 }
2273 stream->handle = stream->obj->handle;
2274
2275 error:
2276 return ret;
2277 }
2278
2279 /*
2280 * Duplicate the ust data object of the ust app. channel and save it in the
2281 * buffer registry channel.
2282 *
2283 * Return 0 on success or else a negative value.
2284 */
2285 static int duplicate_channel_object(struct buffer_reg_channel *reg_chan,
2286 struct ust_app_channel *ua_chan)
2287 {
2288 int ret;
2289
2290 assert(reg_chan);
2291 assert(ua_chan);
2292
2293 /* Need two fds for the channel. */
2294 ret = lttng_fd_get(LTTNG_FD_APPS, 1);
2295 if (ret < 0) {
2296 ERR("Exhausted number of available FD upon duplicate channel");
2297 goto error_fd_get;
2298 }
2299
2300 /* Duplicate object for stream once the original is in the registry. */
2301 ret = ustctl_duplicate_ust_object_data(&ua_chan->obj, reg_chan->obj.ust);
2302 if (ret < 0) {
2303 ERR("Duplicate channel obj from %p to %p failed with ret: %d",
2304 reg_chan->obj.ust, ua_chan->obj, ret);
2305 goto error;
2306 }
2307 ua_chan->handle = ua_chan->obj->handle;
2308
2309 return 0;
2310
2311 error:
2312 lttng_fd_put(LTTNG_FD_APPS, 1);
2313 error_fd_get:
2314 return ret;
2315 }
2316
2317 /*
2318 * For a given channel buffer registry, setup all streams of the given ust
2319 * application channel.
2320 *
2321 * Return 0 on success or else a negative value.
2322 */
2323 static int setup_buffer_reg_streams(struct buffer_reg_channel *reg_chan,
2324 struct ust_app_channel *ua_chan)
2325 {
2326 int ret = 0;
2327 struct ust_app_stream *stream, *stmp;
2328
2329 assert(reg_chan);
2330 assert(ua_chan);
2331
2332 DBG2("UST app setup buffer registry stream");
2333
2334 /* Send all streams to application. */
2335 cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
2336 struct buffer_reg_stream *reg_stream;
2337
2338 ret = buffer_reg_stream_create(&reg_stream);
2339 if (ret < 0) {
2340 goto error;
2341 }
2342
2343 /*
2344 * Keep original pointer and nullify it in the stream so the delete
2345 * stream call does not release the object.
2346 */
2347 reg_stream->obj.ust = stream->obj;
2348 stream->obj = NULL;
2349 buffer_reg_stream_add(reg_stream, reg_chan);
2350
2351 /* We don't need the streams anymore. */
2352 cds_list_del(&stream->list);
2353 delete_ust_app_stream(-1, stream);
2354 }
2355
2356 error:
2357 return ret;
2358 }
2359
2360 /*
2361 * Create a buffer registry channel for the given session registry and
2362 * application channel object. If regp pointer is valid, it's set with the
2363 * created object. Important, the created object is NOT added to the session
2364 * registry hash table.
2365 *
2366 * Return 0 on success else a negative value.
2367 */
2368 static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess,
2369 struct ust_app_channel *ua_chan, struct buffer_reg_channel **regp)
2370 {
2371 int ret;
2372 struct buffer_reg_channel *reg_chan = NULL;
2373
2374 assert(reg_sess);
2375 assert(ua_chan);
2376
2377 DBG2("UST app creating buffer registry channel for %s", ua_chan->name);
2378
2379 /* Create buffer registry channel. */
2380 ret = buffer_reg_channel_create(ua_chan->tracing_channel_id, &reg_chan);
2381 if (ret < 0) {
2382 goto error_create;
2383 }
2384 assert(reg_chan);
2385 reg_chan->consumer_key = ua_chan->key;
2386 reg_chan->subbuf_size = ua_chan->attr.subbuf_size;
2387 reg_chan->num_subbuf = ua_chan->attr.num_subbuf;
2388
2389 /* Create and add a channel registry to session. */
2390 ret = ust_registry_channel_add(reg_sess->reg.ust,
2391 ua_chan->tracing_channel_id);
2392 if (ret < 0) {
2393 goto error;
2394 }
2395 buffer_reg_channel_add(reg_sess, reg_chan);
2396
2397 if (regp) {
2398 *regp = reg_chan;
2399 }
2400
2401 return 0;
2402
2403 error:
2404 /* Safe because the registry channel object was not added to any HT. */
2405 buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
2406 error_create:
2407 return ret;
2408 }
2409
2410 /*
2411 * Setup buffer registry channel for the given session registry and application
2412 * channel object. If regp pointer is valid, it's set with the created object.
2413 *
2414 * Return 0 on success else a negative value.
2415 */
2416 static int setup_buffer_reg_channel(struct buffer_reg_session *reg_sess,
2417 struct ust_app_channel *ua_chan, struct buffer_reg_channel *reg_chan)
2418 {
2419 int ret;
2420
2421 assert(reg_sess);
2422 assert(reg_chan);
2423 assert(ua_chan);
2424 assert(ua_chan->obj);
2425
2426 DBG2("UST app setup buffer registry channel for %s", ua_chan->name);
2427
2428 /* Setup all streams for the registry. */
2429 ret = setup_buffer_reg_streams(reg_chan, ua_chan);
2430 if (ret < 0) {
2431 goto error;
2432 }
2433
2434 reg_chan->obj.ust = ua_chan->obj;
2435 ua_chan->obj = NULL;
2436
2437 return 0;
2438
2439 error:
2440 buffer_reg_channel_remove(reg_sess, reg_chan);
2441 buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
2442 return ret;
2443 }
2444
2445 /*
2446 * Send buffer registry channel to the application.
2447 *
2448 * Return 0 on success else a negative value.
2449 */
2450 static int send_channel_uid_to_ust(struct buffer_reg_channel *reg_chan,
2451 struct ust_app *app, struct ust_app_session *ua_sess,
2452 struct ust_app_channel *ua_chan)
2453 {
2454 int ret;
2455 struct buffer_reg_stream *reg_stream;
2456
2457 assert(reg_chan);
2458 assert(app);
2459 assert(ua_sess);
2460 assert(ua_chan);
2461
2462 DBG("UST app sending buffer registry channel to ust sock %d", app->sock);
2463
2464 ret = duplicate_channel_object(reg_chan, ua_chan);
2465 if (ret < 0) {
2466 goto error;
2467 }
2468
2469 /* Send channel to the application. */
2470 ret = ust_consumer_send_channel_to_ust(app, ua_sess, ua_chan);
2471 if (ret < 0) {
2472 goto error;
2473 }
2474
2475 health_code_update();
2476
2477 /* Send all streams to application. */
2478 pthread_mutex_lock(&reg_chan->stream_list_lock);
2479 cds_list_for_each_entry(reg_stream, &reg_chan->streams, lnode) {
2480 struct ust_app_stream stream;
2481
2482 ret = duplicate_stream_object(reg_stream, &stream);
2483 if (ret < 0) {
2484 goto error_stream_unlock;
2485 }
2486
2487 ret = ust_consumer_send_stream_to_ust(app, ua_chan, &stream);
2488 if (ret < 0) {
2489 (void) release_ust_app_stream(-1, &stream);
2490 goto error_stream_unlock;
2491 }
2492
2493 /*
2494 * The return value is not important here. This function will output an
2495 * error if needed.
2496 */
2497 (void) release_ust_app_stream(-1, &stream);
2498 }
2499 ua_chan->is_sent = 1;
2500
2501 error_stream_unlock:
2502 pthread_mutex_unlock(&reg_chan->stream_list_lock);
2503 error:
2504 return ret;
2505 }
2506
2507 /*
2508 * Create and send to the application the created buffers with per UID buffers.
2509 *
2510 * Return 0 on success else a negative value.
2511 */
2512 static int create_channel_per_uid(struct ust_app *app,
2513 struct ltt_ust_session *usess, struct ust_app_session *ua_sess,
2514 struct ust_app_channel *ua_chan)
2515 {
2516 int ret;
2517 struct buffer_reg_uid *reg_uid;
2518 struct buffer_reg_channel *reg_chan;
2519
2520 assert(app);
2521 assert(usess);
2522 assert(ua_sess);
2523 assert(ua_chan);
2524
2525 DBG("UST app creating channel %s with per UID buffers", ua_chan->name);
2526
2527 reg_uid = buffer_reg_uid_find(usess->id, app->bits_per_long, app->uid);
2528 /*
2529 * The session creation handles the creation of this global registry
2530 * object. If none can be find, there is a code flow problem or a
2531 * teardown race.
2532 */
2533 assert(reg_uid);
2534
2535 reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id,
2536 reg_uid);
2537 if (!reg_chan) {
2538 /* Create the buffer registry channel object. */
2539 ret = create_buffer_reg_channel(reg_uid->registry, ua_chan, &reg_chan);
2540 if (ret < 0) {
2541 ERR("Error creating the UST channel \"%s\" registry instance",
2542 ua_chan->name);
2543 goto error;
2544 }
2545 assert(reg_chan);
2546
2547 /*
2548 * Create the buffers on the consumer side. This call populates the
2549 * ust app channel object with all streams and data object.
2550 */
2551 ret = do_consumer_create_channel(usess, ua_sess, ua_chan,
2552 app->bits_per_long, reg_uid->registry->reg.ust);
2553 if (ret < 0) {
2554 ERR("Error creating UST channel \"%s\" on the consumer daemon",
2555 ua_chan->name);
2556
2557 /*
2558 * Let's remove the previously created buffer registry channel so
2559 * it's not visible anymore in the session registry.
2560 */
2561 ust_registry_channel_del_free(reg_uid->registry->reg.ust,
2562 ua_chan->tracing_channel_id);
2563 buffer_reg_channel_remove(reg_uid->registry, reg_chan);
2564 buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
2565 goto error;
2566 }
2567
2568 /*
2569 * Setup the streams and add it to the session registry.
2570 */
2571 ret = setup_buffer_reg_channel(reg_uid->registry, ua_chan, reg_chan);
2572 if (ret < 0) {
2573 ERR("Error setting up UST channel \"%s\"",
2574 ua_chan->name);
2575 goto error;
2576 }
2577
2578 }
2579
2580 /* Send buffers to the application. */
2581 ret = send_channel_uid_to_ust(reg_chan, app, ua_sess, ua_chan);
2582 if (ret < 0) {
2583 /*
2584 * Don't report error to the console, since it may be
2585 * caused by application concurrently exiting.
2586 */
2587 goto error;
2588 }
2589
2590 error:
2591 return ret;
2592 }
2593
2594 /*
2595 * Create and send to the application the created buffers with per PID buffers.
2596 *
2597 * Return 0 on success else a negative value.
2598 */
2599 static int create_channel_per_pid(struct ust_app *app,
2600 struct ltt_ust_session *usess, struct ust_app_session *ua_sess,
2601 struct ust_app_channel *ua_chan)
2602 {
2603 int ret;
2604 struct ust_registry_session *registry;
2605
2606 assert(app);
2607 assert(usess);
2608 assert(ua_sess);
2609 assert(ua_chan);
2610
2611 DBG("UST app creating channel %s with per PID buffers", ua_chan->name);
2612
2613 rcu_read_lock();
2614
2615 registry = get_session_registry(ua_sess);
2616 assert(registry);
2617
2618 /* Create and add a new channel registry to session. */
2619 ret = ust_registry_channel_add(registry, ua_chan->key);
2620 if (ret < 0) {
2621 ERR("Error creating the UST channel \"%s\" registry instance",
2622 ua_chan->name);
2623 goto error;
2624 }
2625
2626 /* Create and get channel on the consumer side. */
2627 ret = do_consumer_create_channel(usess, ua_sess, ua_chan,
2628 app->bits_per_long, registry);
2629 if (ret < 0) {
2630 ERR("Error creating UST channel \"%s\" on the consumer daemon",
2631 ua_chan->name);
2632 goto error;
2633 }
2634
2635 ret = send_channel_pid_to_ust(app, ua_sess, ua_chan);
2636 if (ret < 0) {
2637 /*
2638 * Don't report error to the console, since it may be
2639 * caused by application concurrently exiting.
2640 */
2641 goto error;
2642 }
2643
2644 error:
2645 rcu_read_unlock();
2646 return ret;
2647 }
2648
2649 /*
2650 * From an already allocated ust app channel, create the channel buffers if
2651 * need and send it to the application. This MUST be called with a RCU read
2652 * side lock acquired.
2653 *
2654 * Return 0 on success or else a negative value.
2655 */
2656 static int do_create_channel(struct ust_app *app,
2657 struct ltt_ust_session *usess, struct ust_app_session *ua_sess,
2658 struct ust_app_channel *ua_chan)
2659 {
2660 int ret;
2661
2662 assert(app);
2663 assert(usess);
2664 assert(ua_sess);
2665 assert(ua_chan);
2666
2667 /* Handle buffer type before sending the channel to the application. */
2668 switch (usess->buffer_type) {
2669 case LTTNG_BUFFER_PER_UID:
2670 {
2671 ret = create_channel_per_uid(app, usess, ua_sess, ua_chan);
2672 if (ret < 0) {
2673 goto error;
2674 }
2675 break;
2676 }
2677 case LTTNG_BUFFER_PER_PID:
2678 {
2679 ret = create_channel_per_pid(app, usess, ua_sess, ua_chan);
2680 if (ret < 0) {
2681 goto error;
2682 }
2683 break;
2684 }
2685 default:
2686 assert(0);
2687 ret = -EINVAL;
2688 goto error;
2689 }
2690
2691 /* Initialize ust objd object using the received handle and add it. */
2692 lttng_ht_node_init_ulong(&ua_chan->ust_objd_node, ua_chan->handle);
2693 lttng_ht_add_unique_ulong(app->ust_objd, &ua_chan->ust_objd_node);
2694
2695 /* If channel is not enabled, disable it on the tracer */
2696 if (!ua_chan->enabled) {
2697 ret = disable_ust_channel(app, ua_sess, ua_chan);
2698 if (ret < 0) {
2699 goto error;
2700 }
2701 }
2702
2703 error:
2704 return ret;
2705 }
2706
2707 /*
2708 * Create UST app channel and create it on the tracer. Set ua_chanp of the
2709 * newly created channel if not NULL.
2710 *
2711 * Called with UST app session lock and RCU read-side lock held.
2712 *
2713 * Return 0 on success or else a negative value.
2714 */
2715 static int create_ust_app_channel(struct ust_app_session *ua_sess,
2716 struct ltt_ust_channel *uchan, struct ust_app *app,
2717 enum lttng_ust_chan_type type, struct ltt_ust_session *usess,
2718 struct ust_app_channel **ua_chanp)
2719 {
2720 int ret = 0;
2721 struct lttng_ht_iter iter;
2722 struct lttng_ht_node_str *ua_chan_node;
2723 struct ust_app_channel *ua_chan;
2724
2725 /* Lookup channel in the ust app session */
2726 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &iter);
2727 ua_chan_node = lttng_ht_iter_get_node_str(&iter);
2728 if (ua_chan_node != NULL) {
2729 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
2730 goto end;
2731 }
2732
2733 ua_chan = alloc_ust_app_channel(uchan->name, ua_sess, &uchan->attr);
2734 if (ua_chan == NULL) {
2735 /* Only malloc can fail here */
2736 ret = -ENOMEM;
2737 goto error_alloc;
2738 }
2739 shadow_copy_channel(ua_chan, uchan);
2740
2741 /* Set channel type. */
2742 ua_chan->attr.type = type;
2743
2744 ret = do_create_channel(app, usess, ua_sess, ua_chan);
2745 if (ret < 0) {
2746 goto error;
2747 }
2748
2749 DBG2("UST app create channel %s for PID %d completed", ua_chan->name,
2750 app->pid);
2751
2752 /* Only add the channel if successful on the tracer side. */
2753 lttng_ht_add_unique_str(ua_sess->channels, &ua_chan->node);
2754
2755 end:
2756 if (ua_chanp) {
2757 *ua_chanp = ua_chan;
2758 }
2759
2760 /* Everything went well. */
2761 return 0;
2762
2763 error:
2764 delete_ust_app_channel(ua_chan->is_sent ? app->sock : -1, ua_chan, app);
2765 error_alloc:
2766 return ret;
2767 }
2768
2769 /*
2770 * Create UST app event and create it on the tracer side.
2771 *
2772 * Called with ust app session mutex held.
2773 */
2774 static
2775 int create_ust_app_event(struct ust_app_session *ua_sess,
2776 struct ust_app_channel *ua_chan, struct ltt_ust_event *uevent,
2777 struct ust_app *app)
2778 {
2779 int ret = 0;
2780 struct ust_app_event *ua_event;
2781
2782 /* Get event node */
2783 ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
2784 uevent->filter, uevent->attr.loglevel, uevent->exclusion);
2785 if (ua_event != NULL) {
2786 ret = -EEXIST;
2787 goto end;
2788 }
2789
2790 /* Does not exist so create one */
2791 ua_event = alloc_ust_app_event(uevent->attr.name, &uevent->attr);
2792 if (ua_event == NULL) {
2793 /* Only malloc can failed so something is really wrong */
2794 ret = -ENOMEM;
2795 goto end;
2796 }
2797 shadow_copy_event(ua_event, uevent);
2798
2799 /* Create it on the tracer side */
2800 ret = create_ust_event(app, ua_sess, ua_chan, ua_event);
2801 if (ret < 0) {
2802 /* Not found previously means that it does not exist on the tracer */
2803 assert(ret != -LTTNG_UST_ERR_EXIST);
2804 goto error;
2805 }
2806
2807 add_unique_ust_app_event(ua_chan, ua_event);
2808
2809 DBG2("UST app create event %s for PID %d completed", ua_event->name,
2810 app->pid);
2811
2812 end:
2813 return ret;
2814
2815 error:
2816 /* Valid. Calling here is already in a read side lock */
2817 delete_ust_app_event(-1, ua_event);
2818 return ret;
2819 }
2820
2821 /*
2822 * Create UST metadata and open it on the tracer side.
2823 *
2824 * Called with UST app session lock held and RCU read side lock.
2825 */
2826 static int create_ust_app_metadata(struct ust_app_session *ua_sess,
2827 struct ust_app *app, struct consumer_output *consumer)
2828 {
2829 int ret = 0;
2830 struct ust_app_channel *metadata;
2831 struct consumer_socket *socket;
2832 struct ust_registry_session *registry;
2833
2834 assert(ua_sess);
2835 assert(app);
2836 assert(consumer);
2837
2838 registry = get_session_registry(ua_sess);
2839 assert(registry);
2840
2841 pthread_mutex_lock(&registry->lock);
2842
2843 /* Metadata already exists for this registry or it was closed previously */
2844 if (registry->metadata_key || registry->metadata_closed) {
2845 ret = 0;
2846 goto error;
2847 }
2848
2849 /* Allocate UST metadata */
2850 metadata = alloc_ust_app_channel(DEFAULT_METADATA_NAME, ua_sess, NULL);
2851 if (!metadata) {
2852 /* malloc() failed */
2853 ret = -ENOMEM;
2854 goto error;
2855 }
2856
2857 memcpy(&metadata->attr, &ua_sess->metadata_attr, sizeof(metadata->attr));
2858
2859 /* Need one fd for the channel. */
2860 ret = lttng_fd_get(LTTNG_FD_APPS, 1);
2861 if (ret < 0) {
2862 ERR("Exhausted number of available FD upon create metadata");
2863 goto error;
2864 }
2865
2866 /* Get the right consumer socket for the application. */
2867 socket = consumer_find_socket_by_bitness(app->bits_per_long, consumer);
2868 if (!socket) {
2869 ret = -EINVAL;
2870 goto error_consumer;
2871 }
2872
2873 /*
2874 * Keep metadata key so we can identify it on the consumer side. Assign it
2875 * to the registry *before* we ask the consumer so we avoid the race of the
2876 * consumer requesting the metadata and the ask_channel call on our side
2877 * did not returned yet.
2878 */
2879 registry->metadata_key = metadata->key;
2880
2881 /*
2882 * Ask the metadata channel creation to the consumer. The metadata object
2883 * will be created by the consumer and kept their. However, the stream is
2884 * never added or monitored until we do a first push metadata to the
2885 * consumer.
2886 */
2887 ret = ust_consumer_ask_channel(ua_sess, metadata, consumer, socket,
2888 registry);
2889 if (ret < 0) {
2890 /* Nullify the metadata key so we don't try to close it later on. */
2891 registry->metadata_key = 0;
2892 goto error_consumer;
2893 }
2894
2895 /*
2896 * The setup command will make the metadata stream be sent to the relayd,
2897 * if applicable, and the thread managing the metadatas. This is important
2898 * because after this point, if an error occurs, the only way the stream
2899 * can be deleted is to be monitored in the consumer.
2900 */
2901 ret = consumer_setup_metadata(socket, metadata->key);
2902 if (ret < 0) {
2903 /* Nullify the metadata key so we don't try to close it later on. */
2904 registry->metadata_key = 0;
2905 goto error_consumer;
2906 }
2907
2908 DBG2("UST metadata with key %" PRIu64 " created for app pid %d",
2909 metadata->key, app->pid);
2910
2911 error_consumer:
2912 lttng_fd_put(LTTNG_FD_APPS, 1);
2913 delete_ust_app_channel(-1, metadata, app);
2914 error:
2915 pthread_mutex_unlock(&registry->lock);
2916 return ret;
2917 }
2918
2919 /*
2920 * Return ust app pointer or NULL if not found. RCU read side lock MUST be
2921 * acquired before calling this function.
2922 */
2923 struct ust_app *ust_app_find_by_pid(pid_t pid)
2924 {
2925 struct ust_app *app = NULL;
2926 struct lttng_ht_node_ulong *node;
2927 struct lttng_ht_iter iter;
2928
2929 lttng_ht_lookup(ust_app_ht, (void *)((unsigned long) pid), &iter);
2930 node = lttng_ht_iter_get_node_ulong(&iter);
2931 if (node == NULL) {
2932 DBG2("UST app no found with pid %d", pid);
2933 goto error;
2934 }
2935
2936 DBG2("Found UST app by pid %d", pid);
2937
2938 app = caa_container_of(node, struct ust_app, pid_n);
2939
2940 error:
2941 return app;
2942 }
2943
2944 /*
2945 * Allocate and init an UST app object using the registration information and
2946 * the command socket. This is called when the command socket connects to the
2947 * session daemon.
2948 *
2949 * The object is returned on success or else NULL.
2950 */
2951 struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
2952 {
2953 struct ust_app *lta = NULL;
2954
2955 assert(msg);
2956 assert(sock >= 0);
2957
2958 DBG3("UST app creating application for socket %d", sock);
2959
2960 if ((msg->bits_per_long == 64 &&
2961 (uatomic_read(&ust_consumerd64_fd) == -EINVAL))
2962 || (msg->bits_per_long == 32 &&
2963 (uatomic_read(&ust_consumerd32_fd) == -EINVAL))) {
2964 ERR("Registration failed: application \"%s\" (pid: %d) has "
2965 "%d-bit long, but no consumerd for this size is available.\n",
2966 msg->name, msg->pid, msg->bits_per_long);
2967 goto error;
2968 }
2969
2970 lta = zmalloc(sizeof(struct ust_app));
2971 if (lta == NULL) {
2972 PERROR("malloc");
2973 goto error;
2974 }
2975
2976 lta->ppid = msg->ppid;
2977 lta->uid = msg->uid;
2978 lta->gid = msg->gid;
2979
2980 lta->bits_per_long = msg->bits_per_long;
2981 lta->uint8_t_alignment = msg->uint8_t_alignment;
2982 lta->uint16_t_alignment = msg->uint16_t_alignment;
2983 lta->uint32_t_alignment = msg->uint32_t_alignment;
2984 lta->uint64_t_alignment = msg->uint64_t_alignment;
2985 lta->long_alignment = msg->long_alignment;
2986 lta->byte_order = msg->byte_order;
2987
2988 lta->v_major = msg->major;
2989 lta->v_minor = msg->minor;
2990 lta->sessions = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
2991 lta->ust_objd = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
2992 lta->notify_sock = -1;
2993
2994 /* Copy name and make sure it's NULL terminated. */
2995 strncpy(lta->name, msg->name, sizeof(lta->name));
2996 lta->name[UST_APP_PROCNAME_LEN] = '\0';
2997
2998 /*
2999 * Before this can be called, when receiving the registration information,
3000 * the application compatibility is checked. So, at this point, the
3001 * application can work with this session daemon.
3002 */
3003 lta->compatible = 1;
3004
3005 lta->pid = msg->pid;
3006 lttng_ht_node_init_ulong(&lta->pid_n, (unsigned long) lta->pid);
3007 lta->sock = sock;
3008 lttng_ht_node_init_ulong(&lta->sock_n, (unsigned long) lta->sock);
3009
3010 CDS_INIT_LIST_HEAD(&lta->teardown_head);
3011
3012 error:
3013 return lta;
3014 }
3015
3016 /*
3017 * For a given application object, add it to every hash table.
3018 */
3019 void ust_app_add(struct ust_app *app)
3020 {
3021 assert(app);
3022 assert(app->notify_sock >= 0);
3023
3024 rcu_read_lock();
3025
3026 /*
3027 * On a re-registration, we want to kick out the previous registration of
3028 * that pid
3029 */
3030 lttng_ht_add_replace_ulong(ust_app_ht, &app->pid_n);
3031
3032 /*
3033 * The socket _should_ be unique until _we_ call close. So, a add_unique
3034 * for the ust_app_ht_by_sock is used which asserts fail if the entry was
3035 * already in the table.
3036 */
3037 lttng_ht_add_unique_ulong(ust_app_ht_by_sock, &app->sock_n);
3038
3039 /* Add application to the notify socket hash table. */
3040 lttng_ht_node_init_ulong(&app->notify_sock_n, app->notify_sock);
3041 lttng_ht_add_unique_ulong(ust_app_ht_by_notify_sock, &app->notify_sock_n);
3042
3043 DBG("App registered with pid:%d ppid:%d uid:%d gid:%d sock:%d name:%s "
3044 "notify_sock:%d (version %d.%d)", app->pid, app->ppid, app->uid,
3045 app->gid, app->sock, app->name, app->notify_sock, app->v_major,
3046 app->v_minor);
3047
3048 rcu_read_unlock();
3049 }
3050
3051 /*
3052 * Set the application version into the object.
3053 *
3054 * Return 0 on success else a negative value either an errno code or a
3055 * LTTng-UST error code.
3056 */
3057 int ust_app_version(struct ust_app *app)
3058 {
3059 int ret;
3060
3061 assert(app);
3062
3063 ret = ustctl_tracer_version(app->sock, &app->version);
3064 if (ret < 0) {
3065 if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
3066 ERR("UST app %d version failed with ret %d", app->sock, ret);
3067 } else {
3068 DBG3("UST app %d version failed. Application is dead", app->sock);
3069 }
3070 }
3071
3072 return ret;
3073 }
3074
3075 /*
3076 * Unregister app by removing it from the global traceable app list and freeing
3077 * the data struct.
3078 *
3079 * The socket is already closed at this point so no close to sock.
3080 */
3081 void ust_app_unregister(int sock)
3082 {
3083 struct ust_app *lta;
3084 struct lttng_ht_node_ulong *node;
3085 struct lttng_ht_iter ust_app_sock_iter;
3086 struct lttng_ht_iter iter;
3087 struct ust_app_session *ua_sess;
3088 int ret;
3089
3090 rcu_read_lock();
3091
3092 /* Get the node reference for a call_rcu */
3093 lttng_ht_lookup(ust_app_ht_by_sock, (void *)((unsigned long) sock), &ust_app_sock_iter);
3094 node = lttng_ht_iter_get_node_ulong(&ust_app_sock_iter);
3095 assert(node);
3096
3097 lta = caa_container_of(node, struct ust_app, sock_n);
3098 DBG("PID %d unregistering with sock %d", lta->pid, sock);
3099
3100 /*
3101 * For per-PID buffers, perform "push metadata" and flush all
3102 * application streams before removing app from hash tables,
3103 * ensuring proper behavior of data_pending check.
3104 * Remove sessions so they are not visible during deletion.
3105 */
3106 cds_lfht_for_each_entry(lta->sessions->ht, &iter.iter, ua_sess,
3107 node.node) {
3108 struct ust_registry_session *registry;
3109
3110 ret = lttng_ht_del(lta->sessions, &iter);
3111 if (ret) {
3112 /* The session was already removed so scheduled for teardown. */
3113 continue;
3114 }
3115
3116 if (ua_sess->buffer_type == LTTNG_BUFFER_PER_PID) {
3117 (void) ust_app_flush_app_session(lta, ua_sess);
3118 }
3119
3120 /*
3121 * Add session to list for teardown. This is safe since at this point we
3122 * are the only one using this list.
3123 */
3124 pthread_mutex_lock(&ua_sess->lock);
3125
3126 /*
3127 * Normally, this is done in the delete session process which is
3128 * executed in the call rcu below. However, upon registration we can't
3129 * afford to wait for the grace period before pushing data or else the
3130 * data pending feature can race between the unregistration and stop
3131 * command where the data pending command is sent *before* the grace
3132 * period ended.
3133 *
3134 * The close metadata below nullifies the metadata pointer in the
3135 * session so the delete session will NOT push/close a second time.
3136 */
3137 registry = get_session_registry(ua_sess);
3138 if (registry) {
3139 /* Push metadata for application before freeing the application. */
3140 (void) push_metadata(registry, ua_sess->consumer);
3141
3142 /*
3143 * Don't ask to close metadata for global per UID buffers. Close
3144 * metadata only on destroy trace session in this case. Also, the
3145 * previous push metadata could have flag the metadata registry to
3146 * close so don't send a close command if closed.
3147 */
3148 if (ua_sess->buffer_type != LTTNG_BUFFER_PER_UID) {
3149 /* And ask to close it for this session registry. */
3150 (void) close_metadata(registry, ua_sess->consumer);
3151 }
3152 }
3153 cds_list_add(&ua_sess->teardown_node, &lta->teardown_head);
3154
3155 pthread_mutex_unlock(&ua_sess->lock);
3156 }
3157
3158 /* Remove application from PID hash table */
3159 ret = lttng_ht_del(ust_app_ht_by_sock, &ust_app_sock_iter);
3160 assert(!ret);
3161
3162 /*
3163 * Remove application from notify hash table. The thread handling the
3164 * notify socket could have deleted the node so ignore on error because
3165 * either way it's valid. The close of that socket is handled by the other
3166 * thread.
3167 */
3168 iter.iter.node = &lta->notify_sock_n.node;
3169 (void) lttng_ht_del(ust_app_ht_by_notify_sock, &iter);
3170
3171 /*
3172 * Ignore return value since the node might have been removed before by an
3173 * add replace during app registration because the PID can be reassigned by
3174 * the OS.
3175 */
3176 iter.iter.node = &lta->pid_n.node;
3177 ret = lttng_ht_del(ust_app_ht, &iter);
3178 if (ret) {
3179 DBG3("Unregister app by PID %d failed. This can happen on pid reuse",
3180 lta->pid);
3181 }
3182
3183 /* Free memory */
3184 call_rcu(&lta->pid_n.head, delete_ust_app_rcu);
3185
3186 rcu_read_unlock();
3187 return;
3188 }
3189
3190 /*
3191 * Fill events array with all events name of all registered apps.
3192 */
3193 int ust_app_list_events(struct lttng_event **events)
3194 {
3195 int ret, handle;
3196 size_t nbmem, count = 0;
3197 struct lttng_ht_iter iter;
3198 struct ust_app *app;
3199 struct lttng_event *tmp_event;
3200
3201 nbmem = UST_APP_EVENT_LIST_SIZE;
3202 tmp_event = zmalloc(nbmem * sizeof(struct lttng_event));
3203 if (tmp_event == NULL) {
3204 PERROR("zmalloc ust app events");
3205 ret = -ENOMEM;
3206 goto error;
3207 }
3208
3209 rcu_read_lock();
3210
3211 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3212 struct lttng_ust_tracepoint_iter uiter;
3213
3214 health_code_update();
3215
3216 if (!app->compatible) {
3217 /*
3218 * TODO: In time, we should notice the caller of this error by
3219 * telling him that this is a version error.
3220 */
3221 continue;
3222 }
3223 handle = ustctl_tracepoint_list(app->sock);
3224 if (handle < 0) {
3225 if (handle != -EPIPE && handle != -LTTNG_UST_ERR_EXITING) {
3226 ERR("UST app list events getting handle failed for app pid %d",
3227 app->pid);
3228 }
3229 continue;
3230 }
3231
3232 while ((ret = ustctl_tracepoint_list_get(app->sock, handle,
3233 &uiter)) != -LTTNG_UST_ERR_NOENT) {
3234 /* Handle ustctl error. */
3235 if (ret < 0) {
3236 if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
3237 ERR("UST app tp list get failed for app %d with ret %d",
3238 app->sock, ret);
3239 } else {
3240 DBG3("UST app tp list get failed. Application is dead");
3241 /*
3242 * This is normal behavior, an application can die during the
3243 * creation process. Don't report an error so the execution can
3244 * continue normally. Continue normal execution.
3245 */
3246 break;
3247 }
3248 free(tmp_event);
3249 goto rcu_error;
3250 }
3251
3252 health_code_update();
3253 if (count >= nbmem) {
3254 /* In case the realloc fails, we free the memory */
3255 struct lttng_event *new_tmp_event;
3256 size_t new_nbmem;
3257
3258 new_nbmem = nbmem << 1;
3259 DBG2("Reallocating event list from %zu to %zu entries",
3260 nbmem, new_nbmem);
3261 new_tmp_event = realloc(tmp_event,
3262 new_nbmem * sizeof(struct lttng_event));
3263 if (new_tmp_event == NULL) {
3264 PERROR("realloc ust app events");
3265 free(tmp_event);
3266 ret = -ENOMEM;
3267 goto rcu_error;
3268 }
3269 /* Zero the new memory */
3270 memset(new_tmp_event + nbmem, 0,
3271 (new_nbmem - nbmem) * sizeof(struct lttng_event));
3272 nbmem = new_nbmem;
3273 tmp_event = new_tmp_event;
3274 }
3275 memcpy(tmp_event[count].name, uiter.name, LTTNG_UST_SYM_NAME_LEN);
3276 tmp_event[count].loglevel = uiter.loglevel;
3277 tmp_event[count].type = (enum lttng_event_type) LTTNG_UST_TRACEPOINT;
3278 tmp_event[count].pid = app->pid;
3279 tmp_event[count].enabled = -1;
3280 count++;
3281 }
3282 }
3283
3284 ret = count;
3285 *events = tmp_event;
3286
3287 DBG2("UST app list events done (%zu events)", count);
3288
3289 rcu_error:
3290 rcu_read_unlock();
3291 error:
3292 health_code_update();
3293 return ret;
3294 }
3295
3296 /*
3297 * Fill events array with all events name of all registered apps.
3298 */
3299 int ust_app_list_event_fields(struct lttng_event_field **fields)
3300 {
3301 int ret, handle;
3302 size_t nbmem, count = 0;
3303 struct lttng_ht_iter iter;
3304 struct ust_app *app;
3305 struct lttng_event_field *tmp_event;
3306
3307 nbmem = UST_APP_EVENT_LIST_SIZE;
3308 tmp_event = zmalloc(nbmem * sizeof(struct lttng_event_field));
3309 if (tmp_event == NULL) {
3310 PERROR("zmalloc ust app event fields");
3311 ret = -ENOMEM;
3312 goto error;
3313 }
3314
3315 rcu_read_lock();
3316
3317 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3318 struct lttng_ust_field_iter uiter;
3319
3320 health_code_update();
3321
3322 if (!app->compatible) {
3323 /*
3324 * TODO: In time, we should notice the caller of this error by
3325 * telling him that this is a version error.
3326 */
3327 continue;
3328 }
3329 handle = ustctl_tracepoint_field_list(app->sock);
3330 if (handle < 0) {
3331 if (handle != -EPIPE && handle != -LTTNG_UST_ERR_EXITING) {
3332 ERR("UST app list field getting handle failed for app pid %d",
3333 app->pid);
3334 }
3335 continue;
3336 }
3337
3338 while ((ret = ustctl_tracepoint_field_list_get(app->sock, handle,
3339 &uiter)) != -LTTNG_UST_ERR_NOENT) {
3340 /* Handle ustctl error. */
3341 if (ret < 0) {
3342 if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
3343 ERR("UST app tp list field failed for app %d with ret %d",
3344 app->sock, ret);
3345 } else {
3346 DBG3("UST app tp list field failed. Application is dead");
3347 /*
3348 * This is normal behavior, an application can die during the
3349 * creation process. Don't report an error so the execution can
3350 * continue normally. Reset list and count for next app.
3351 */
3352 break;
3353 }
3354 free(tmp_event);
3355 goto rcu_error;
3356 }
3357
3358 health_code_update();
3359 if (count >= nbmem) {
3360 /* In case the realloc fails, we free the memory */
3361 struct lttng_event_field *new_tmp_event;
3362 size_t new_nbmem;
3363
3364 new_nbmem = nbmem << 1;
3365 DBG2("Reallocating event field list from %zu to %zu entries",
3366 nbmem, new_nbmem);
3367 new_tmp_event = realloc(tmp_event,
3368 new_nbmem * sizeof(struct lttng_event_field));
3369 if (new_tmp_event == NULL) {
3370 PERROR("realloc ust app event fields");
3371 free(tmp_event);
3372 ret = -ENOMEM;
3373 goto rcu_error;
3374 }
3375 /* Zero the new memory */
3376 memset(new_tmp_event + nbmem, 0,
3377 (new_nbmem - nbmem) * sizeof(struct lttng_event_field));
3378 nbmem = new_nbmem;
3379 tmp_event = new_tmp_event;
3380 }
3381
3382 memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_SYM_NAME_LEN);
3383 /* Mapping between these enums matches 1 to 1. */
3384 tmp_event[count].type = (enum lttng_event_field_type) uiter.type;
3385 tmp_event[count].nowrite = uiter.nowrite;
3386
3387 memcpy(tmp_event[count].event.name, uiter.event_name, LTTNG_UST_SYM_NAME_LEN);
3388 tmp_event[count].event.loglevel = uiter.loglevel;
3389 tmp_event[count].event.type = LTTNG_EVENT_TRACEPOINT;
3390 tmp_event[count].event.pid = app->pid;
3391 tmp_event[count].event.enabled = -1;
3392 count++;
3393 }
3394 }
3395
3396 ret = count;
3397 *fields = tmp_event;
3398
3399 DBG2("UST app list event fields done (%zu events)", count);
3400
3401 rcu_error:
3402 rcu_read_unlock();
3403 error:
3404 health_code_update();
3405 return ret;
3406 }
3407
3408 /*
3409 * Free and clean all traceable apps of the global list.
3410 *
3411 * Should _NOT_ be called with RCU read-side lock held.
3412 */
3413 void ust_app_clean_list(void)
3414 {
3415 int ret;
3416 struct ust_app *app;
3417 struct lttng_ht_iter iter;
3418
3419 DBG2("UST app cleaning registered apps hash table");
3420
3421 rcu_read_lock();
3422
3423 if (ust_app_ht) {
3424 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3425 ret = lttng_ht_del(ust_app_ht, &iter);
3426 assert(!ret);
3427 call_rcu(&app->pid_n.head, delete_ust_app_rcu);
3428 }
3429 }
3430
3431 /* Cleanup socket hash table */
3432 if (ust_app_ht_by_sock) {
3433 cds_lfht_for_each_entry(ust_app_ht_by_sock->ht, &iter.iter, app,
3434 sock_n.node) {
3435 ret = lttng_ht_del(ust_app_ht_by_sock, &iter);
3436 assert(!ret);
3437 }
3438 }
3439
3440 /* Cleanup notify socket hash table */
3441 if (ust_app_ht_by_notify_sock) {
3442 cds_lfht_for_each_entry(ust_app_ht_by_notify_sock->ht, &iter.iter, app,
3443 notify_sock_n.node) {
3444 ret = lttng_ht_del(ust_app_ht_by_notify_sock, &iter);
3445 assert(!ret);
3446 }
3447 }
3448 rcu_read_unlock();
3449
3450 /* Destroy is done only when the ht is empty */
3451 if (ust_app_ht) {
3452 ht_cleanup_push(ust_app_ht);
3453 }
3454 if (ust_app_ht_by_sock) {
3455 ht_cleanup_push(ust_app_ht_by_sock);
3456 }
3457 if (ust_app_ht_by_notify_sock) {
3458 ht_cleanup_push(ust_app_ht_by_notify_sock);
3459 }
3460 }
3461
3462 /*
3463 * Init UST app hash table.
3464 */
3465 int ust_app_ht_alloc(void)
3466 {
3467 ust_app_ht = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
3468 if (!ust_app_ht) {
3469 return -1;
3470 }
3471 ust_app_ht_by_sock = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
3472 if (!ust_app_ht_by_sock) {
3473 return -1;
3474 }
3475 ust_app_ht_by_notify_sock = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
3476 if (!ust_app_ht_by_notify_sock) {
3477 return -1;
3478 }
3479 return 0;
3480 }
3481
3482 /*
3483 * For a specific UST session, disable the channel for all registered apps.
3484 */
3485 int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
3486 struct ltt_ust_channel *uchan)
3487 {
3488 int ret = 0;
3489 struct lttng_ht_iter iter;
3490 struct lttng_ht_node_str *ua_chan_node;
3491 struct ust_app *app;
3492 struct ust_app_session *ua_sess;
3493 struct ust_app_channel *ua_chan;
3494
3495 if (usess == NULL || uchan == NULL) {
3496 ERR("Disabling UST global channel with NULL values");
3497 ret = -1;
3498 goto error;
3499 }
3500
3501 DBG2("UST app disabling channel %s from global domain for session id %" PRIu64,
3502 uchan->name, usess->id);
3503
3504 rcu_read_lock();
3505
3506 /* For every registered applications */
3507 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3508 struct lttng_ht_iter uiter;
3509 if (!app->compatible) {
3510 /*
3511 * TODO: In time, we should notice the caller of this error by
3512 * telling him that this is a version error.
3513 */
3514 continue;
3515 }
3516 ua_sess = lookup_session_by_app(usess, app);
3517 if (ua_sess == NULL) {
3518 continue;
3519 }
3520
3521 /* Get channel */
3522 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
3523 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
3524 /* If the session if found for the app, the channel must be there */
3525 assert(ua_chan_node);
3526
3527 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
3528 /* The channel must not be already disabled */
3529 assert(ua_chan->enabled == 1);
3530
3531 /* Disable channel onto application */
3532 ret = disable_ust_app_channel(ua_sess, ua_chan, app);
3533 if (ret < 0) {
3534 /* XXX: We might want to report this error at some point... */
3535 continue;
3536 }
3537 }
3538
3539 rcu_read_unlock();
3540
3541 error:
3542 return ret;
3543 }
3544
3545 /*
3546 * For a specific UST session, enable the channel for all registered apps.
3547 */
3548 int ust_app_enable_channel_glb(struct ltt_ust_session *usess,
3549 struct ltt_ust_channel *uchan)
3550 {
3551 int ret = 0;
3552 struct lttng_ht_iter iter;
3553 struct ust_app *app;
3554 struct ust_app_session *ua_sess;
3555
3556 if (usess == NULL || uchan == NULL) {
3557 ERR("Adding UST global channel to NULL values");
3558 ret = -1;
3559 goto error;
3560 }
3561
3562 DBG2("UST app enabling channel %s to global domain for session id %" PRIu64,
3563 uchan->name, usess->id);
3564
3565 rcu_read_lock();
3566
3567 /* For every registered applications */
3568 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3569 if (!app->compatible) {
3570 /*
3571 * TODO: In time, we should notice the caller of this error by
3572 * telling him that this is a version error.
3573 */
3574 continue;
3575 }
3576 ua_sess = lookup_session_by_app(usess, app);
3577 if (ua_sess == NULL) {
3578 continue;
3579 }
3580
3581 /* Enable channel onto application */
3582 ret = enable_ust_app_channel(ua_sess, uchan, app);
3583 if (ret < 0) {
3584 /* XXX: We might want to report this error at some point... */
3585 continue;
3586 }
3587 }
3588
3589 rcu_read_unlock();
3590
3591 error:
3592 return ret;
3593 }
3594
3595 /*
3596 * Disable an event in a channel and for a specific session.
3597 */
3598 int ust_app_disable_event_glb(struct ltt_ust_session *usess,
3599 struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
3600 {
3601 int ret = 0;
3602 struct lttng_ht_iter iter, uiter;
3603 struct lttng_ht_node_str *ua_chan_node, *ua_event_node;
3604 struct ust_app *app;
3605 struct ust_app_session *ua_sess;
3606 struct ust_app_channel *ua_chan;
3607 struct ust_app_event *ua_event;
3608
3609 DBG("UST app disabling event %s for all apps in channel "
3610 "%s for session id %" PRIu64,
3611 uevent->attr.name, uchan->name, usess->id);
3612
3613 rcu_read_lock();
3614
3615 /* For all registered applications */
3616 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3617 if (!app->compatible) {
3618 /*
3619 * TODO: In time, we should notice the caller of this error by
3620 * telling him that this is a version error.
3621 */
3622 continue;
3623 }
3624 ua_sess = lookup_session_by_app(usess, app);
3625 if (ua_sess == NULL) {
3626 /* Next app */
3627 continue;
3628 }
3629
3630 /* Lookup channel in the ust app session */
3631 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
3632 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
3633 if (ua_chan_node == NULL) {
3634 DBG2("Channel %s not found in session id %" PRIu64 " for app pid %d."
3635 "Skipping", uchan->name, usess->id, app->pid);
3636 continue;
3637 }
3638 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
3639
3640 lttng_ht_lookup(ua_chan->events, (void *)uevent->attr.name, &uiter);
3641 ua_event_node = lttng_ht_iter_get_node_str(&uiter);
3642 if (ua_event_node == NULL) {
3643 DBG2("Event %s not found in channel %s for app pid %d."
3644 "Skipping", uevent->attr.name, uchan->name, app->pid);
3645 continue;
3646 }
3647 ua_event = caa_container_of(ua_event_node, struct ust_app_event, node);
3648
3649 ret = disable_ust_app_event(ua_sess, ua_event, app);
3650 if (ret < 0) {
3651 /* XXX: Report error someday... */
3652 continue;
3653 }
3654 }
3655
3656 rcu_read_unlock();
3657
3658 return ret;
3659 }
3660
3661 /*
3662 * For a specific UST session, create the channel for all registered apps.
3663 */
3664 int ust_app_create_channel_glb(struct ltt_ust_session *usess,
3665 struct ltt_ust_channel *uchan)
3666 {
3667 int ret = 0, created;
3668 struct lttng_ht_iter iter;
3669 struct ust_app *app;
3670 struct ust_app_session *ua_sess = NULL;
3671
3672 /* Very wrong code flow */
3673 assert(usess);
3674 assert(uchan);
3675
3676 DBG2("UST app adding channel %s to UST domain for session id %" PRIu64,
3677 uchan->name, usess->id);
3678
3679 rcu_read_lock();
3680
3681 /* For every registered applications */
3682 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3683 if (!app->compatible) {
3684 /*
3685 * TODO: In time, we should notice the caller of this error by
3686 * telling him that this is a version error.
3687 */
3688 continue;
3689 }
3690 /*
3691 * Create session on the tracer side and add it to app session HT. Note
3692 * that if session exist, it will simply return a pointer to the ust
3693 * app session.
3694 */
3695 ret = create_ust_app_session(usess, app, &ua_sess, &created);
3696 if (ret < 0) {
3697 switch (ret) {
3698 case -ENOTCONN:
3699 /*
3700 * The application's socket is not valid. Either a bad socket
3701 * or a timeout on it. We can't inform the caller that for a
3702 * specific app, the session failed so lets continue here.
3703 */
3704 continue;
3705 case -ENOMEM:
3706 default:
3707 goto error_rcu_unlock;
3708 }
3709 }
3710 assert(ua_sess);
3711
3712 pthread_mutex_lock(&ua_sess->lock);
3713 if (!strncmp(uchan->name, DEFAULT_METADATA_NAME,
3714 sizeof(uchan->name))) {
3715 copy_channel_attr_to_ustctl(&ua_sess->metadata_attr, &uchan->attr);
3716 ret = 0;
3717 } else {
3718 /* Create channel onto application. We don't need the chan ref. */
3719 ret = create_ust_app_channel(ua_sess, uchan, app,
3720 LTTNG_UST_CHAN_PER_CPU, usess, NULL);
3721 }
3722 pthread_mutex_unlock(&ua_sess->lock);
3723 if (ret < 0) {
3724 if (ret == -ENOMEM) {
3725 /* No more memory is a fatal error. Stop right now. */
3726 goto error_rcu_unlock;
3727 }
3728 /* Cleanup the created session if it's the case. */
3729 if (created) {
3730 destroy_app_session(app, ua_sess);
3731 }
3732 }
3733 }
3734
3735 error_rcu_unlock:
3736 rcu_read_unlock();
3737 return ret;
3738 }
3739
3740 /*
3741 * Enable event for a specific session and channel on the tracer.
3742 */
3743 int ust_app_enable_event_glb(struct ltt_ust_session *usess,
3744 struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
3745 {
3746 int ret = 0;
3747 struct lttng_ht_iter iter, uiter;
3748 struct lttng_ht_node_str *ua_chan_node;
3749 struct ust_app *app;
3750 struct ust_app_session *ua_sess;
3751 struct ust_app_channel *ua_chan;
3752 struct ust_app_event *ua_event;
3753
3754 DBG("UST app enabling event %s for all apps for session id %" PRIu64,
3755 uevent->attr.name, usess->id);
3756
3757 /*
3758 * NOTE: At this point, this function is called only if the session and
3759 * channel passed are already created for all apps. and enabled on the
3760 * tracer also.
3761 */
3762
3763 rcu_read_lock();
3764
3765 /* For all registered applications */
3766 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3767 if (!app->compatible) {
3768 /*
3769 * TODO: In time, we should notice the caller of this error by
3770 * telling him that this is a version error.
3771 */
3772 continue;
3773 }
3774 ua_sess = lookup_session_by_app(usess, app);
3775 if (!ua_sess) {
3776 /* The application has problem or is probably dead. */
3777 continue;
3778 }
3779
3780 pthread_mutex_lock(&ua_sess->lock);
3781
3782 /* Lookup channel in the ust app session */
3783 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
3784 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
3785 /* If the channel is not found, there is a code flow error */
3786 assert(ua_chan_node);
3787
3788 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
3789
3790 /* Get event node */
3791 ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
3792 uevent->filter, uevent->attr.loglevel, uevent->exclusion);
3793 if (ua_event == NULL) {
3794 DBG3("UST app enable event %s not found for app PID %d."
3795 "Skipping app", uevent->attr.name, app->pid);
3796 goto next_app;
3797 }
3798
3799 ret = enable_ust_app_event(ua_sess, ua_event, app);
3800 if (ret < 0) {
3801 pthread_mutex_unlock(&ua_sess->lock);
3802 goto error;
3803 }
3804 next_app:
3805 pthread_mutex_unlock(&ua_sess->lock);
3806 }
3807
3808 error:
3809 rcu_read_unlock();
3810 return ret;
3811 }
3812
3813 /*
3814 * For a specific existing UST session and UST channel, creates the event for
3815 * all registered apps.
3816 */
3817 int ust_app_create_event_glb(struct ltt_ust_session *usess,
3818 struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
3819 {
3820 int ret = 0;
3821 struct lttng_ht_iter iter, uiter;
3822 struct lttng_ht_node_str *ua_chan_node;
3823 struct ust_app *app;
3824 struct ust_app_session *ua_sess;
3825 struct ust_app_channel *ua_chan;
3826
3827 DBG("UST app creating event %s for all apps for session id %" PRIu64,
3828 uevent->attr.name, usess->id);
3829
3830 rcu_read_lock();
3831
3832 /* For all registered applications */
3833 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
3834 if (!app->compatible) {
3835 /*
3836 * TODO: In time, we should notice the caller of this error by
3837 * telling him that this is a version error.
3838 */
3839 continue;
3840 }
3841 ua_sess = lookup_session_by_app(usess, app);
3842 if (!ua_sess) {
3843 /* The application has problem or is probably dead. */
3844 continue;
3845 }
3846
3847 pthread_mutex_lock(&ua_sess->lock);
3848 /* Lookup channel in the ust app session */
3849 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
3850 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
3851 /* If the channel is not found, there is a code flow error */
3852 assert(ua_chan_node);
3853
3854 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
3855
3856 ret = create_ust_app_event(ua_sess, ua_chan, uevent, app);
3857 pthread_mutex_unlock(&ua_sess->lock);
3858 if (ret < 0) {
3859 if (ret != -LTTNG_UST_ERR_EXIST) {
3860 /* Possible value at this point: -ENOMEM. If so, we stop! */
3861 break;
3862 }
3863 DBG2("UST app event %s already exist on app PID %d",
3864 uevent->attr.name, app->pid);
3865 continue;
3866 }
3867 }
3868
3869 rcu_read_unlock();
3870
3871 return ret;
3872 }
3873
3874 /*
3875 * Start tracing for a specific UST session and app.
3876 */
3877 static
3878 int ust_app_start_trace(struct ltt_ust_session *usess, struct ust_app *app)
3879 {
3880 int ret = 0;
3881 struct ust_app_session *ua_sess;
3882
3883 DBG("Starting tracing for ust app pid %d", app->pid);
3884
3885 rcu_read_lock();
3886
3887 if (!app->compatible) {
3888 goto end;
3889 }
3890
3891 ua_sess = lookup_session_by_app(usess, app);
3892 if (ua_sess == NULL) {
3893 /* The session is in teardown process. Ignore and continue. */
3894 goto end;
3895 }
3896
3897 pthread_mutex_lock(&ua_sess->lock);
3898
3899 /* Upon restart, we skip the setup, already done */
3900 if (ua_sess->started) {
3901 goto skip_setup;
3902 }
3903
3904 /* Create directories if consumer is LOCAL and has a path defined. */
3905 if (usess->consumer->type == CONSUMER_DST_LOCAL &&
3906 strlen(usess->consumer->dst.trace_path) > 0) {
3907 ret = run_as_mkdir_recursive(usess->consumer->dst.trace_path,
3908 S_IRWXU | S_IRWXG, ua_sess->euid, ua_sess->egid);
3909 if (ret < 0) {
3910 if (ret != -EEXIST) {
3911 ERR("Trace directory creation error");
3912 goto error_unlock;
3913 }
3914 }
3915 }
3916
3917 /*
3918 * Create the metadata for the application. This returns gracefully if a
3919 * metadata was already set for the session.
3920 */
3921 ret = create_ust_app_metadata(ua_sess, app, usess->consumer);
3922 if (ret < 0) {
3923 goto error_unlock;
3924 }
3925
3926 health_code_update();
3927
3928 skip_setup:
3929 /* This start the UST tracing */
3930 ret = ustctl_start_session(app->sock, ua_sess->handle);
3931 if (ret < 0) {
3932 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
3933 ERR("Error starting tracing for app pid: %d (ret: %d)",
3934 app->pid, ret);
3935 } else {
3936 DBG("UST app start session failed. Application is dead.");
3937 /*
3938 * This is normal behavior, an application can die during the
3939 * creation process. Don't report an error so the execution can
3940 * continue normally.
3941 */
3942 pthread_mutex_unlock(&ua_sess->lock);
3943 goto end;
3944 }
3945 goto error_unlock;
3946 }
3947
3948 /* Indicate that the session has been started once */
3949 ua_sess->started = 1;
3950
3951 pthread_mutex_unlock(&ua_sess->lock);
3952
3953 health_code_update();
3954
3955 /* Quiescent wait after starting trace */
3956 ret = ustctl_wait_quiescent(app->sock);
3957 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
3958 ERR("UST app wait quiescent failed for app pid %d ret %d",
3959 app->pid, ret);
3960 }
3961
3962 end:
3963 rcu_read_unlock();
3964 health_code_update();
3965 return 0;
3966
3967 error_unlock:
3968 pthread_mutex_unlock(&ua_sess->lock);
3969 rcu_read_unlock();
3970 health_code_update();
3971 return -1;
3972 }
3973
3974 /*
3975 * Stop tracing for a specific UST session and app.
3976 */
3977 static
3978 int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app)
3979 {
3980 int ret = 0;
3981 struct ust_app_session *ua_sess;
3982 struct ust_registry_session *registry;
3983
3984 DBG("Stopping tracing for ust app pid %d", app->pid);
3985
3986 rcu_read_lock();
3987
3988 if (!app->compatible) {
3989 goto end_no_session;
3990 }
3991
3992 ua_sess = lookup_session_by_app(usess, app);
3993 if (ua_sess == NULL) {
3994 goto end_no_session;
3995 }
3996
3997 pthread_mutex_lock(&ua_sess->lock);
3998
3999 /*
4000 * If started = 0, it means that stop trace has been called for a session
4001 * that was never started. It's possible since we can have a fail start
4002 * from either the application manager thread or the command thread. Simply
4003 * indicate that this is a stop error.
4004 */
4005 if (!ua_sess->started) {
4006 goto error_rcu_unlock;
4007 }
4008
4009 health_code_update();
4010
4011 /* This inhibits UST tracing */
4012 ret = ustctl_stop_session(app->sock, ua_sess->handle);
4013 if (ret < 0) {
4014 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4015 ERR("Error stopping tracing for app pid: %d (ret: %d)",
4016 app->pid, ret);
4017 } else {
4018 DBG("UST app stop session failed. Application is dead.");
4019 /*
4020 * This is normal behavior, an application can die during the
4021 * creation process. Don't report an error so the execution can
4022 * continue normally.
4023 */
4024 goto end_unlock;
4025 }
4026 goto error_rcu_unlock;
4027 }
4028
4029 health_code_update();
4030
4031 /* Quiescent wait after stopping trace */
4032 ret = ustctl_wait_quiescent(app->sock);
4033 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4034 ERR("UST app wait quiescent failed for app pid %d ret %d",
4035 app->pid, ret);
4036 }
4037
4038 health_code_update();
4039
4040 registry = get_session_registry(ua_sess);
4041 assert(registry);
4042
4043 /* Push metadata for application before freeing the application. */
4044 (void) push_metadata(registry, ua_sess->consumer);
4045
4046 end_unlock:
4047 pthread_mutex_unlock(&ua_sess->lock);
4048 end_no_session:
4049 rcu_read_unlock();
4050 health_code_update();
4051 return 0;
4052
4053 error_rcu_unlock:
4054 pthread_mutex_unlock(&ua_sess->lock);
4055 rcu_read_unlock();
4056 health_code_update();
4057 return -1;
4058 }
4059
4060 static
4061 int ust_app_flush_app_session(struct ust_app *app,
4062 struct ust_app_session *ua_sess)
4063 {
4064 int ret, retval = 0;
4065 struct lttng_ht_iter iter;
4066 struct ust_app_channel *ua_chan;
4067 struct consumer_socket *socket;
4068
4069 DBG("Flushing app session buffers for ust app pid %d", app->pid);
4070
4071 rcu_read_lock();
4072
4073 if (!app->compatible) {
4074 goto end_not_compatible;
4075 }
4076
4077 pthread_mutex_lock(&ua_sess->lock);
4078
4079 health_code_update();
4080
4081 /* Flushing buffers */
4082 socket = consumer_find_socket_by_bitness(app->bits_per_long,
4083 ua_sess->consumer);
4084
4085 /* Flush buffers and push metadata. */
4086 switch (ua_sess->buffer_type) {
4087 case LTTNG_BUFFER_PER_PID:
4088 cds_lfht_for_each_entry(ua_sess->channels->ht, &iter.iter, ua_chan,
4089 node.node) {
4090 health_code_update();
4091 assert(ua_chan->is_sent);
4092 ret = consumer_flush_channel(socket, ua_chan->key);
4093 if (ret) {
4094 ERR("Error flushing consumer channel");
4095 retval = -1;
4096 continue;
4097 }
4098 }
4099 break;
4100 case LTTNG_BUFFER_PER_UID:
4101 default:
4102 assert(0);
4103 break;
4104 }
4105
4106 health_code_update();
4107
4108 pthread_mutex_unlock(&ua_sess->lock);
4109
4110 end_not_compatible:
4111 rcu_read_unlock();
4112 health_code_update();
4113 return retval;
4114 }
4115
4116 /*
4117 * Flush buffers for all applications for a specific UST session.
4118 * Called with UST session lock held.
4119 */
4120 static
4121 int ust_app_flush_session(struct ltt_ust_session *usess)
4122
4123 {
4124 int ret = 0;
4125
4126 DBG("Flushing session buffers for all ust apps");
4127
4128 rcu_read_lock();
4129
4130 /* Flush buffers and push metadata. */
4131 switch (usess->buffer_type) {
4132 case LTTNG_BUFFER_PER_UID:
4133 {
4134 struct buffer_reg_uid *reg;
4135 struct lttng_ht_iter iter;
4136
4137 /* Flush all per UID buffers associated to that session. */
4138 cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
4139 struct ust_registry_session *ust_session_reg;
4140 struct buffer_reg_channel *reg_chan;
4141 struct consumer_socket *socket;
4142
4143 /* Get consumer socket to use to push the metadata.*/
4144 socket = consumer_find_socket_by_bitness(reg->bits_per_long,
4145 usess->consumer);
4146 if (!socket) {
4147 /* Ignore request if no consumer is found for the session. */
4148 continue;
4149 }
4150
4151 cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
4152 reg_chan, node.node) {
4153 /*
4154 * The following call will print error values so the return
4155 * code is of little importance because whatever happens, we
4156 * have to try them all.
4157 */
4158 (void) consumer_flush_channel(socket, reg_chan->consumer_key);
4159 }
4160
4161 ust_session_reg = reg->registry->reg.ust;
4162 /* Push metadata. */
4163 (void) push_metadata(ust_session_reg, usess->consumer);
4164 }
4165 break;
4166 }
4167 case LTTNG_BUFFER_PER_PID:
4168 {
4169 struct ust_app_session *ua_sess;
4170 struct lttng_ht_iter iter;
4171 struct ust_app *app;
4172
4173 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4174 ua_sess = lookup_session_by_app(usess, app);
4175 if (ua_sess == NULL) {
4176 continue;
4177 }
4178 (void) ust_app_flush_app_session(app, ua_sess);
4179 }
4180 break;
4181 }
4182 default:
4183 ret = -1;
4184 assert(0);
4185 break;
4186 }
4187
4188 rcu_read_unlock();
4189 health_code_update();
4190 return ret;
4191 }
4192
4193 /*
4194 * Destroy a specific UST session in apps.
4195 */
4196 static int destroy_trace(struct ltt_ust_session *usess, struct ust_app *app)
4197 {
4198 int ret;
4199 struct ust_app_session *ua_sess;
4200 struct lttng_ht_iter iter;
4201 struct lttng_ht_node_u64 *node;
4202
4203 DBG("Destroy tracing for ust app pid %d", app->pid);
4204
4205 rcu_read_lock();
4206
4207 if (!app->compatible) {
4208 goto end;
4209 }
4210
4211 __lookup_session_by_app(usess, app, &iter);
4212 node = lttng_ht_iter_get_node_u64(&iter);
4213 if (node == NULL) {
4214 /* Session is being or is deleted. */
4215 goto end;
4216 }
4217 ua_sess = caa_container_of(node, struct ust_app_session, node);
4218
4219 health_code_update();
4220 destroy_app_session(app, ua_sess);
4221
4222 health_code_update();
4223
4224 /* Quiescent wait after stopping trace */
4225 ret = ustctl_wait_quiescent(app->sock);
4226 if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4227 ERR("UST app wait quiescent failed for app pid %d ret %d",
4228 app->pid, ret);
4229 }
4230 end:
4231 rcu_read_unlock();
4232 health_code_update();
4233 return 0;
4234 }
4235
4236 /*
4237 * Start tracing for the UST session.
4238 */
4239 int ust_app_start_trace_all(struct ltt_ust_session *usess)
4240 {
4241 int ret = 0;
4242 struct lttng_ht_iter iter;
4243 struct ust_app *app;
4244
4245 DBG("Starting all UST traces");
4246
4247 rcu_read_lock();
4248
4249 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4250 ret = ust_app_start_trace(usess, app);
4251 if (ret < 0) {
4252 /* Continue to next apps even on error */
4253 continue;
4254 }
4255 }
4256
4257 rcu_read_unlock();
4258
4259 return 0;
4260 }
4261
4262 /*
4263 * Start tracing for the UST session.
4264 * Called with UST session lock held.
4265 */
4266 int ust_app_stop_trace_all(struct ltt_ust_session *usess)
4267 {
4268 int ret = 0;
4269 struct lttng_ht_iter iter;
4270 struct ust_app *app;
4271
4272 DBG("Stopping all UST traces");
4273
4274 rcu_read_lock();
4275
4276 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4277 ret = ust_app_stop_trace(usess, app);
4278 if (ret < 0) {
4279 /* Continue to next apps even on error */
4280 continue;
4281 }
4282 }
4283
4284 (void) ust_app_flush_session(usess);
4285
4286 rcu_read_unlock();
4287
4288 return 0;
4289 }
4290
4291 /*
4292 * Destroy app UST session.
4293 */
4294 int ust_app_destroy_trace_all(struct ltt_ust_session *usess)
4295 {
4296 int ret = 0;
4297 struct lttng_ht_iter iter;
4298 struct ust_app *app;
4299
4300 DBG("Destroy all UST traces");
4301
4302 rcu_read_lock();
4303
4304 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4305 ret = destroy_trace(usess, app);
4306 if (ret < 0) {
4307 /* Continue to next apps even on error */
4308 continue;
4309 }
4310 }
4311
4312 rcu_read_unlock();
4313
4314 return 0;
4315 }
4316
4317 /*
4318 * Add channels/events from UST global domain to registered apps at sock.
4319 */
4320 void ust_app_global_update(struct ltt_ust_session *usess, int sock)
4321 {
4322 int ret = 0;
4323 struct lttng_ht_iter iter, uiter;
4324 struct ust_app *app;
4325 struct ust_app_session *ua_sess = NULL;
4326 struct ust_app_channel *ua_chan;
4327 struct ust_app_event *ua_event;
4328 struct ust_app_ctx *ua_ctx;
4329
4330 assert(usess);
4331 assert(sock >= 0);
4332
4333 DBG2("UST app global update for app sock %d for session id %" PRIu64, sock,
4334 usess->id);
4335
4336 rcu_read_lock();
4337
4338 app = ust_app_find_by_sock(sock);
4339 if (app == NULL) {
4340 /*
4341 * Application can be unregistered before so this is possible hence
4342 * simply stopping the update.
4343 */
4344 DBG3("UST app update failed to find app sock %d", sock);
4345 goto error;
4346 }
4347
4348 if (!app->compatible) {
4349 goto error;
4350 }
4351
4352 ret = create_ust_app_session(usess, app, &ua_sess, NULL);
4353 if (ret < 0) {
4354 /* Tracer is probably gone or ENOMEM. */
4355 goto error;
4356 }
4357 assert(ua_sess);
4358
4359 pthread_mutex_lock(&ua_sess->lock);
4360
4361 /*
4362 * We can iterate safely here over all UST app session since the create ust
4363 * app session above made a shadow copy of the UST global domain from the
4364 * ltt ust session.
4365 */
4366 cds_lfht_for_each_entry(ua_sess->channels->ht, &iter.iter, ua_chan,
4367 node.node) {
4368 ret = do_create_channel(app, usess, ua_sess, ua_chan);
4369 if (ret < 0) {
4370 /*
4371 * Stop everything. On error, the application failed, no more
4372 * file descriptor are available or ENOMEM so stopping here is
4373 * the only thing we can do for now.
4374 */
4375 goto error_unlock;
4376 }
4377
4378 /*
4379 * Add context using the list so they are enabled in the same order the
4380 * user added them.
4381 */
4382 cds_list_for_each_entry(ua_ctx, &ua_chan->ctx_list, list) {
4383 ret = create_ust_channel_context(ua_chan, ua_ctx, app);
4384 if (ret < 0) {
4385 goto error_unlock;
4386 }
4387 }
4388
4389
4390 /* For each events */
4391 cds_lfht_for_each_entry(ua_chan->events->ht, &uiter.iter, ua_event,
4392 node.node) {
4393 ret = create_ust_event(app, ua_sess, ua_chan, ua_event);
4394 if (ret < 0) {
4395 goto error_unlock;
4396 }
4397 }
4398 }
4399
4400 pthread_mutex_unlock(&ua_sess->lock);
4401
4402 if (usess->active) {
4403 ret = ust_app_start_trace(usess, app);
4404 if (ret < 0) {
4405 goto error;
4406 }
4407
4408 DBG2("UST trace started for app pid %d", app->pid);
4409 }
4410
4411 /* Everything went well at this point. */
4412 rcu_read_unlock();
4413 return;
4414
4415 error_unlock:
4416 pthread_mutex_unlock(&ua_sess->lock);
4417 error:
4418 if (ua_sess) {
4419 destroy_app_session(app, ua_sess);
4420 }
4421 rcu_read_unlock();
4422 return;
4423 }
4424
4425 /*
4426 * Add context to a specific channel for global UST domain.
4427 */
4428 int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess,
4429 struct ltt_ust_channel *uchan, struct ltt_ust_context *uctx)
4430 {
4431 int ret = 0;
4432 struct lttng_ht_node_str *ua_chan_node;
4433 struct lttng_ht_iter iter, uiter;
4434 struct ust_app_channel *ua_chan = NULL;
4435 struct ust_app_session *ua_sess;
4436 struct ust_app *app;
4437
4438 rcu_read_lock();
4439
4440 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4441 if (!app->compatible) {
4442 /*
4443 * TODO: In time, we should notice the caller of this error by
4444 * telling him that this is a version error.
4445 */
4446 continue;
4447 }
4448 ua_sess = lookup_session_by_app(usess, app);
4449 if (ua_sess == NULL) {
4450 continue;
4451 }
4452
4453 pthread_mutex_lock(&ua_sess->lock);
4454 /* Lookup channel in the ust app session */
4455 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
4456 ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
4457 if (ua_chan_node == NULL) {
4458 goto next_app;
4459 }
4460 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel,
4461 node);
4462 ret = create_ust_app_channel_context(ua_sess, ua_chan, &uctx->ctx, app);
4463 if (ret < 0) {
4464 goto next_app;
4465 }
4466 next_app:
4467 pthread_mutex_unlock(&ua_sess->lock);
4468 }
4469
4470 rcu_read_unlock();
4471 return ret;
4472 }
4473
4474 /*
4475 * Enable event for a channel from a UST session for a specific PID.
4476 */
4477 int ust_app_enable_event_pid(struct ltt_ust_session *usess,
4478 struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent, pid_t pid)
4479 {
4480 int ret = 0;
4481 struct lttng_ht_iter iter;
4482 struct lttng_ht_node_str *ua_chan_node;
4483 struct ust_app *app;
4484 struct ust_app_session *ua_sess;
4485 struct ust_app_channel *ua_chan;
4486 struct ust_app_event *ua_event;
4487
4488 DBG("UST app enabling event %s for PID %d", uevent->attr.name, pid);
4489
4490 rcu_read_lock();
4491
4492 app = ust_app_find_by_pid(pid);
4493 if (app == NULL) {
4494 ERR("UST app enable event per PID %d not found", pid);
4495 ret = -1;
4496 goto end;
4497 }
4498
4499 if (!app->compatible) {
4500 ret = 0;
4501 goto end;
4502 }
4503
4504 ua_sess = lookup_session_by_app(usess, app);
4505 if (!ua_sess) {
4506 /* The application has problem or is probably dead. */
4507 ret = 0;
4508 goto end;
4509 }
4510
4511 pthread_mutex_lock(&ua_sess->lock);
4512 /* Lookup channel in the ust app session */
4513 lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &iter);
4514 ua_chan_node = lttng_ht_iter_get_node_str(&iter);
4515 /* If the channel is not found, there is a code flow error */
4516 assert(ua_chan_node);
4517
4518 ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
4519
4520 ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
4521 uevent->filter, uevent->attr.loglevel, uevent->exclusion);
4522 if (ua_event == NULL) {
4523 ret = create_ust_app_event(ua_sess, ua_chan, uevent, app);
4524 if (ret < 0) {
4525 goto end_unlock;
4526 }
4527 } else {
4528 ret = enable_ust_app_event(ua_sess, ua_event, app);
4529 if (ret < 0) {
4530 goto end_unlock;
4531 }
4532 }
4533
4534 end_unlock:
4535 pthread_mutex_unlock(&ua_sess->lock);
4536 end:
4537 rcu_read_unlock();
4538 return ret;
4539 }
4540
4541 /*
4542 * Calibrate registered applications.
4543 */
4544 int ust_app_calibrate_glb(struct lttng_ust_calibrate *calibrate)
4545 {
4546 int ret = 0;
4547 struct lttng_ht_iter iter;
4548 struct ust_app *app;
4549
4550 rcu_read_lock();
4551
4552 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
4553 if (!app->compatible) {
4554 /*
4555 * TODO: In time, we should notice the caller of this error by
4556 * telling him that this is a version error.
4557 */
4558 continue;
4559 }
4560
4561 health_code_update();
4562
4563 ret = ustctl_calibrate(app->sock, calibrate);
4564 if (ret < 0) {
4565 switch (ret) {
4566 case -ENOSYS:
4567 /* Means that it's not implemented on the tracer side. */
4568 ret = 0;
4569 break;
4570 default:
4571 DBG2("Calibrate app PID %d returned with error %d",
4572 app->pid, ret);
4573 break;
4574 }
4575 }
4576 }
4577
4578 DBG("UST app global domain calibration finished");
4579
4580 rcu_read_unlock();
4581
4582 health_code_update();
4583
4584 return ret;
4585 }
4586
4587 /*
4588 * Receive registration and populate the given msg structure.
4589 *
4590 * On success return 0 else a negative value returned by the ustctl call.
4591 */
4592 int ust_app_recv_registration(int sock, struct ust_register_msg *msg)
4593 {
4594 int ret;
4595 uint32_t pid, ppid, uid, gid;
4596
4597 assert(msg);
4598
4599 ret = ustctl_recv_reg_msg(sock, &msg->type, &msg->major, &msg->minor,
4600 &pid, &ppid, &uid, &gid,
4601 &msg->bits_per_long,
4602 &msg->uint8_t_alignment,
4603 &msg->uint16_t_alignment,
4604 &msg->uint32_t_alignment,
4605 &msg->uint64_t_alignment,
4606 &msg->long_alignment,
4607 &msg->byte_order,
4608 msg->name);
4609 if (ret < 0) {
4610 switch (-ret) {
4611 case EPIPE:
4612 case ECONNRESET:
4613 case LTTNG_UST_ERR_EXITING:
4614 DBG3("UST app recv reg message failed. Application died");
4615 break;
4616 case LTTNG_UST_ERR_UNSUP_MAJOR:
4617 ERR("UST app recv reg unsupported version %d.%d. Supporting %d.%d",
4618 msg->major, msg->minor, LTTNG_UST_ABI_MAJOR_VERSION,
4619 LTTNG_UST_ABI_MINOR_VERSION);
4620 break;
4621 default:
4622 ERR("UST app recv reg message failed with ret %d", ret);
4623 break;
4624 }
4625 goto error;
4626 }
4627 msg->pid = (pid_t) pid;
4628 msg->ppid = (pid_t) ppid;
4629 msg->uid = (uid_t) uid;
4630 msg->gid = (gid_t) gid;
4631
4632 error:
4633 return ret;
4634 }
4635
4636 /*
4637 * Return a ust app channel object using the application object and the channel
4638 * object descriptor has a key. If not found, NULL is returned. A RCU read side
4639 * lock MUST be acquired before calling this function.
4640 */
4641 static struct ust_app_channel *find_channel_by_objd(struct ust_app *app,
4642 int objd)
4643 {
4644 struct lttng_ht_node_ulong *node;
4645 struct lttng_ht_iter iter;
4646 struct ust_app_channel *ua_chan = NULL;
4647
4648 assert(app);
4649
4650 lttng_ht_lookup(app->ust_objd, (void *)((unsigned long) objd), &iter);
4651 node = lttng_ht_iter_get_node_ulong(&iter);
4652 if (node == NULL) {
4653 DBG2("UST app channel find by objd %d not found", objd);
4654 goto error;
4655 }
4656
4657 ua_chan = caa_container_of(node, struct ust_app_channel, ust_objd_node);
4658
4659 error:
4660 return ua_chan;
4661 }
4662
4663 /*
4664 * Reply to a register channel notification from an application on the notify
4665 * socket. The channel metadata is also created.
4666 *
4667 * The session UST registry lock is acquired in this function.
4668 *
4669 * On success 0 is returned else a negative value.
4670 */
4671 static int reply_ust_register_channel(int sock, int sobjd, int cobjd,
4672 size_t nr_fields, struct ustctl_field *fields)
4673 {
4674 int ret, ret_code = 0;
4675 uint32_t chan_id, reg_count;
4676 uint64_t chan_reg_key;
4677 enum ustctl_channel_header type;
4678 struct ust_app *app;
4679 struct ust_app_channel *ua_chan;
4680 struct ust_app_session *ua_sess;
4681 struct ust_registry_session *registry;
4682 struct ust_registry_channel *chan_reg;
4683
4684 rcu_read_lock();
4685
4686 /* Lookup application. If not found, there is a code flow error. */
4687 app = find_app_by_notify_sock(sock);
4688 if (!app) {
4689 DBG("Application socket %d is being teardown. Abort event notify",
4690 sock);
4691 ret = 0;
4692 free(fields);
4693 goto error_rcu_unlock;
4694 }
4695
4696 /* Lookup channel by UST object descriptor. */
4697 ua_chan = find_channel_by_objd(app, cobjd);
4698 if (!ua_chan) {
4699 DBG("Application channel is being teardown. Abort event notify");
4700 ret = 0;
4701 free(fields);
4702 goto error_rcu_unlock;
4703 }
4704
4705 assert(ua_chan->session);
4706 ua_sess = ua_chan->session;
4707
4708 /* Get right session registry depending on the session buffer type. */
4709 registry = get_session_registry(ua_sess);
4710 assert(registry);
4711
4712 /* Depending on the buffer type, a different channel key is used. */
4713 if (ua_sess->buffer_type == LTTNG_BUFFER_PER_UID) {
4714 chan_reg_key = ua_chan->tracing_channel_id;
4715 } else {
4716 chan_reg_key = ua_chan->key;
4717 }
4718
4719 pthread_mutex_lock(&registry->lock);
4720
4721 chan_reg = ust_registry_channel_find(registry, chan_reg_key);
4722 assert(chan_reg);
4723
4724 if (!chan_reg->register_done) {
4725 reg_count = ust_registry_get_event_count(chan_reg);
4726 if (reg_count < 31) {
4727 type = USTCTL_CHANNEL_HEADER_COMPACT;
4728 } else {
4729 type = USTCTL_CHANNEL_HEADER_LARGE;
4730 }
4731
4732 chan_reg->nr_ctx_fields = nr_fields;
4733 chan_reg->ctx_fields = fields;
4734 chan_reg->header_type = type;
4735 } else {
4736 /* Get current already assigned values. */
4737 type = chan_reg->header_type;
4738 free(fields);
4739 /* Set to NULL so the error path does not do a double free. */
4740 fields = NULL;
4741 }
4742 /* Channel id is set during the object creation. */
4743 chan_id = chan_reg->chan_id;
4744
4745 /* Append to metadata */
4746 if (!chan_reg->metadata_dumped) {
4747 ret_code = ust_metadata_channel_statedump(registry, chan_reg);
4748 if (ret_code) {
4749 ERR("Error appending channel metadata (errno = %d)", ret_code);
4750 goto reply;
4751 }
4752 }
4753
4754 reply:
4755 DBG3("UST app replying to register channel key %" PRIu64
4756 " with id %u, type: %d, ret: %d", chan_reg_key, chan_id, type,
4757 ret_code);
4758
4759 ret = ustctl_reply_register_channel(sock, chan_id, type, ret_code);
4760 if (ret < 0) {
4761 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4762 ERR("UST app reply channel failed with ret %d", ret);
4763 } else {
4764 DBG3("UST app reply channel failed. Application died");
4765 }
4766 goto error;
4767 }
4768
4769 /* This channel registry registration is completed. */
4770 chan_reg->register_done = 1;
4771
4772 error:
4773 pthread_mutex_unlock(&registry->lock);
4774 error_rcu_unlock:
4775 rcu_read_unlock();
4776 if (ret) {
4777 free(fields);
4778 }
4779 return ret;
4780 }
4781
4782 /*
4783 * Add event to the UST channel registry. When the event is added to the
4784 * registry, the metadata is also created. Once done, this replies to the
4785 * application with the appropriate error code.
4786 *
4787 * The session UST registry lock is acquired in the function.
4788 *
4789 * On success 0 is returned else a negative value.
4790 */
4791 static int add_event_ust_registry(int sock, int sobjd, int cobjd, char *name,
4792 char *sig, size_t nr_fields, struct ustctl_field *fields, int loglevel,
4793 char *model_emf_uri)
4794 {
4795 int ret, ret_code;
4796 uint32_t event_id = 0;
4797 uint64_t chan_reg_key;
4798 struct ust_app *app;
4799 struct ust_app_channel *ua_chan;
4800 struct ust_app_session *ua_sess;
4801 struct ust_registry_session *registry;
4802
4803 rcu_read_lock();
4804
4805 /* Lookup application. If not found, there is a code flow error. */
4806 app = find_app_by_notify_sock(sock);
4807 if (!app) {
4808 DBG("Application socket %d is being teardown. Abort event notify",
4809 sock);
4810 ret = 0;
4811 free(sig);
4812 free(fields);
4813 free(model_emf_uri);
4814 goto error_rcu_unlock;
4815 }
4816
4817 /* Lookup channel by UST object descriptor. */
4818 ua_chan = find_channel_by_objd(app, cobjd);
4819 if (!ua_chan) {
4820 DBG("Application channel is being teardown. Abort event notify");
4821 ret = 0;
4822 free(sig);
4823 free(fields);
4824 free(model_emf_uri);
4825 goto error_rcu_unlock;
4826 }
4827
4828 assert(ua_chan->session);
4829 ua_sess = ua_chan->session;
4830
4831 registry = get_session_registry(ua_sess);
4832 assert(registry);
4833
4834 if (ua_sess->buffer_type == LTTNG_BUFFER_PER_UID) {
4835 chan_reg_key = ua_chan->tracing_channel_id;
4836 } else {
4837 chan_reg_key = ua_chan->key;
4838 }
4839
4840 pthread_mutex_lock(&registry->lock);
4841
4842 /*
4843 * From this point on, this call acquires the ownership of the sig, fields
4844 * and model_emf_uri meaning any free are done inside it if needed. These
4845 * three variables MUST NOT be read/write after this.
4846 */
4847 ret_code = ust_registry_create_event(registry, chan_reg_key,
4848 sobjd, cobjd, name, sig, nr_fields, fields, loglevel,
4849 model_emf_uri, ua_sess->buffer_type, &event_id,
4850 app);
4851
4852 /*
4853 * The return value is returned to ustctl so in case of an error, the
4854 * application can be notified. In case of an error, it's important not to
4855 * return a negative error or else the application will get closed.
4856 */
4857 ret = ustctl_reply_register_event(sock, event_id, ret_code);
4858 if (ret < 0) {
4859 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4860 ERR("UST app reply event failed with ret %d", ret);
4861 } else {
4862 DBG3("UST app reply event failed. Application died");
4863 }
4864 /*
4865 * No need to wipe the create event since the application socket will
4866 * get close on error hence cleaning up everything by itself.
4867 */
4868 goto error;
4869 }
4870
4871 DBG3("UST registry event %s with id %" PRId32 " added successfully",
4872 name, event_id);
4873
4874 error:
4875 pthread_mutex_unlock(&registry->lock);
4876 error_rcu_unlock:
4877 rcu_read_unlock();
4878 return ret;
4879 }
4880
4881 /*
4882 * Handle application notification through the given notify socket.
4883 *
4884 * Return 0 on success or else a negative value.
4885 */
4886 int ust_app_recv_notify(int sock)
4887 {
4888 int ret;
4889 enum ustctl_notify_cmd cmd;
4890
4891 DBG3("UST app receiving notify from sock %d", sock);
4892
4893 ret = ustctl_recv_notify(sock, &cmd);
4894 if (ret < 0) {
4895 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4896 ERR("UST app recv notify failed with ret %d", ret);
4897 } else {
4898 DBG3("UST app recv notify failed. Application died");
4899 }
4900 goto error;
4901 }
4902
4903 switch (cmd) {
4904 case USTCTL_NOTIFY_CMD_EVENT:
4905 {
4906 int sobjd, cobjd, loglevel;
4907 char name[LTTNG_UST_SYM_NAME_LEN], *sig, *model_emf_uri;
4908 size_t nr_fields;
4909 struct ustctl_field *fields;
4910
4911 DBG2("UST app ustctl register event received");
4912
4913 ret = ustctl_recv_register_event(sock, &sobjd, &cobjd, name, &loglevel,
4914 &sig, &nr_fields, &fields, &model_emf_uri);
4915 if (ret < 0) {
4916 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4917 ERR("UST app recv event failed with ret %d", ret);
4918 } else {
4919 DBG3("UST app recv event failed. Application died");
4920 }
4921 goto error;
4922 }
4923
4924 /*
4925 * Add event to the UST registry coming from the notify socket. This
4926 * call will free if needed the sig, fields and model_emf_uri. This
4927 * code path loses the ownsership of these variables and transfer them
4928 * to the this function.
4929 */
4930 ret = add_event_ust_registry(sock, sobjd, cobjd, name, sig, nr_fields,
4931 fields, loglevel, model_emf_uri);
4932 if (ret < 0) {
4933 goto error;
4934 }
4935
4936 break;
4937 }
4938 case USTCTL_NOTIFY_CMD_CHANNEL:
4939 {
4940 int sobjd, cobjd;
4941 size_t nr_fields;
4942 struct ustctl_field *fields;
4943
4944 DBG2("UST app ustctl register channel received");
4945
4946 ret = ustctl_recv_register_channel(sock, &sobjd, &cobjd, &nr_fields,
4947 &fields);
4948 if (ret < 0) {
4949 if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
4950 ERR("UST app recv channel failed with ret %d", ret);
4951 } else {
4952 DBG3("UST app recv channel failed. Application died");
4953 }
4954 goto error;
4955 }
4956
4957 /*
4958 * The fields ownership are transfered to this function call meaning
4959 * that if needed it will be freed. After this, it's invalid to access
4960 * fields or clean it up.
4961 */
4962 ret = reply_ust_register_channel(sock, sobjd, cobjd, nr_fields,
4963 fields);
4964 if (ret < 0) {
4965 goto error;
4966 }
4967
4968 break;
4969 }
4970 default:
4971 /* Should NEVER happen. */
4972 assert(0);
4973 }
4974
4975 error:
4976 return ret;
4977 }
4978
4979 /*
4980 * Once the notify socket hangs up, this is called. First, it tries to find the
4981 * corresponding application. On failure, the call_rcu to close the socket is
4982 * executed. If an application is found, it tries to delete it from the notify
4983 * socket hash table. Whathever the result, it proceeds to the call_rcu.
4984 *
4985 * Note that an object needs to be allocated here so on ENOMEM failure, the
4986 * call RCU is not done but the rest of the cleanup is.
4987 */
4988 void ust_app_notify_sock_unregister(int sock)
4989 {
4990 int err_enomem = 0;
4991 struct lttng_ht_iter iter;
4992 struct ust_app *app;
4993 struct ust_app_notify_sock_obj *obj;
4994
4995 assert(sock >= 0);
4996
4997 rcu_read_lock();
4998
4999 obj = zmalloc(sizeof(*obj));
5000 if (!obj) {
5001 /*
5002 * An ENOMEM is kind of uncool. If this strikes we continue the
5003 * procedure but the call_rcu will not be called. In this case, we
5004 * accept the fd leak rather than possibly creating an unsynchronized
5005 * state between threads.
5006 *
5007 * TODO: The notify object should be created once the notify socket is
5008 * registered and stored independantely from the ust app object. The
5009 * tricky part is to synchronize the teardown of the application and
5010 * this notify object. Let's keep that in mind so we can avoid this
5011 * kind of shenanigans with ENOMEM in the teardown path.
5012 */
5013 err_enomem = 1;
5014 } else {
5015 obj->fd = sock;
5016 }
5017
5018 DBG("UST app notify socket unregister %d", sock);
5019
5020 /*
5021 * Lookup application by notify socket. If this fails, this means that the
5022 * hash table delete has already been done by the application
5023 * unregistration process so we can safely close the notify socket in a
5024 * call RCU.
5025 */
5026 app = find_app_by_notify_sock(sock);
5027 if (!app) {
5028 goto close_socket;
5029 }
5030
5031 iter.iter.node = &app->notify_sock_n.node;
5032
5033 /*
5034 * Whatever happens here either we fail or succeed, in both cases we have
5035 * to close the socket after a grace period to continue to the call RCU
5036 * here. If the deletion is successful, the application is not visible
5037 * anymore by other threads and is it fails it means that it was already
5038 * deleted from the hash table so either way we just have to close the
5039 * socket.
5040 */
5041 (void) lttng_ht_del(ust_app_ht_by_notify_sock, &iter);
5042
5043 close_socket:
5044 rcu_read_unlock();
5045
5046 /*
5047 * Close socket after a grace period to avoid for the socket to be reused
5048 * before the application object is freed creating potential race between
5049 * threads trying to add unique in the global hash table.
5050 */
5051 if (!err_enomem) {
5052 call_rcu(&obj->head, close_notify_sock_rcu);
5053 }
5054 }
5055
5056 /*
5057 * Destroy a ust app data structure and free its memory.
5058 */
5059 void ust_app_destroy(struct ust_app *app)
5060 {
5061 if (!app) {
5062 return;
5063 }
5064
5065 call_rcu(&app->pid_n.head, delete_ust_app_rcu);
5066 }
5067
5068 /*
5069 * Take a snapshot for a given UST session. The snapshot is sent to the given
5070 * output.
5071 *
5072 * Return 0 on success or else a negative value.
5073 */
5074 int ust_app_snapshot_record(struct ltt_ust_session *usess,
5075 struct snapshot_output *output, int wait,
5076 uint64_t nb_packets_per_stream)
5077 {
5078 int ret = 0;
5079 unsigned int snapshot_done = 0;
5080 struct lttng_ht_iter iter;
5081 struct ust_app *app;
5082 char pathname[PATH_MAX];
5083
5084 assert(usess);
5085 assert(output);
5086
5087 rcu_read_lock();
5088
5089 switch (usess->buffer_type) {
5090 case LTTNG_BUFFER_PER_UID:
5091 {
5092 struct buffer_reg_uid *reg;
5093
5094 cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
5095 struct buffer_reg_channel *reg_chan;
5096 struct consumer_socket *socket;
5097
5098 /* Get consumer socket to use to push the metadata.*/
5099 socket = consumer_find_socket_by_bitness(reg->bits_per_long,
5100 usess->consumer);
5101 if (!socket) {
5102 ret = -EINVAL;
5103 goto error;
5104 }
5105
5106 memset(pathname, 0, sizeof(pathname));
5107 ret = snprintf(pathname, sizeof(pathname),
5108 DEFAULT_UST_TRACE_DIR "/" DEFAULT_UST_TRACE_UID_PATH,
5109 reg->uid, reg->bits_per_long);
5110 if (ret < 0) {
5111 PERROR("snprintf snapshot path");
5112 goto error;
5113 }
5114
5115 /* Add the UST default trace dir to path. */
5116 cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
5117 reg_chan, node.node) {
5118 ret = consumer_snapshot_channel(socket, reg_chan->consumer_key,
5119 output, 0, usess->uid, usess->gid, pathname, wait,
5120 nb_packets_per_stream);
5121 if (ret < 0) {
5122 goto error;
5123 }
5124 }
5125 ret = consumer_snapshot_channel(socket,
5126 reg->registry->reg.ust->metadata_key, output, 1,
5127 usess->uid, usess->gid, pathname, wait, 0);
5128 if (ret < 0) {
5129 goto error;
5130 }
5131 snapshot_done = 1;
5132 }
5133 break;
5134 }
5135 case LTTNG_BUFFER_PER_PID:
5136 {
5137 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
5138 struct consumer_socket *socket;
5139 struct lttng_ht_iter chan_iter;
5140 struct ust_app_channel *ua_chan;
5141 struct ust_app_session *ua_sess;
5142 struct ust_registry_session *registry;
5143
5144 ua_sess = lookup_session_by_app(usess, app);
5145 if (!ua_sess) {
5146 /* Session not associated with this app. */
5147 continue;
5148 }
5149
5150 /* Get the right consumer socket for the application. */
5151 socket = consumer_find_socket_by_bitness(app->bits_per_long,
5152 output->consumer);
5153 if (!socket) {
5154 ret = -EINVAL;
5155 goto error;
5156 }
5157
5158 /* Add the UST default trace dir to path. */
5159 memset(pathname, 0, sizeof(pathname));
5160 ret = snprintf(pathname, sizeof(pathname), DEFAULT_UST_TRACE_DIR "/%s",
5161 ua_sess->path);
5162 if (ret < 0) {
5163 PERROR("snprintf snapshot path");
5164 goto error;
5165 }
5166
5167 cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter,
5168 ua_chan, node.node) {
5169 ret = consumer_snapshot_channel(socket, ua_chan->key, output,
5170 0, ua_sess->euid, ua_sess->egid, pathname, wait,
5171 nb_packets_per_stream);
5172 if (ret < 0) {
5173 goto error;
5174 }
5175 }
5176
5177 registry = get_session_registry(ua_sess);
5178 assert(registry);
5179 ret = consumer_snapshot_channel(socket, registry->metadata_key, output,
5180 1, ua_sess->euid, ua_sess->egid, pathname, wait, 0);
5181 if (ret < 0) {
5182 goto error;
5183 }
5184 snapshot_done = 1;
5185 }
5186 break;
5187 }
5188 default:
5189 assert(0);
5190 break;
5191 }
5192
5193 if (!snapshot_done) {
5194 /*
5195 * If no snapshot was made and we are not in the error path, this means
5196 * that there are no buffers thus no (prior) application to snapshot
5197 * data from so we have simply NO data.
5198 */
5199 ret = -ENODATA;
5200 }
5201
5202 error:
5203 rcu_read_unlock();
5204 return ret;
5205 }
5206
5207 /*
5208 * Return the size taken by one more packet per stream.
5209 */
5210 uint64_t ust_app_get_size_one_more_packet_per_stream(struct ltt_ust_session *usess,
5211 uint64_t cur_nr_packets)
5212 {
5213 uint64_t tot_size = 0;
5214 struct ust_app *app;
5215 struct lttng_ht_iter iter;
5216
5217 assert(usess);
5218
5219 switch (usess->buffer_type) {
5220 case LTTNG_BUFFER_PER_UID:
5221 {
5222 struct buffer_reg_uid *reg;
5223
5224 cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
5225 struct buffer_reg_channel *reg_chan;
5226
5227 rcu_read_lock();
5228 cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
5229 reg_chan, node.node) {
5230 if (cur_nr_packets >= reg_chan->num_subbuf) {
5231 /*
5232 * Don't take channel into account if we
5233 * already grab all its packets.
5234 */
5235 continue;
5236 }
5237 tot_size += reg_chan->subbuf_size * reg_chan->stream_count;
5238 }
5239 rcu_read_unlock();
5240 }
5241 break;
5242 }
5243 case LTTNG_BUFFER_PER_PID:
5244 {
5245 rcu_read_lock();
5246 cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
5247 struct ust_app_channel *ua_chan;
5248 struct ust_app_session *ua_sess;
5249 struct lttng_ht_iter chan_iter;
5250
5251 ua_sess = lookup_session_by_app(usess, app);
5252 if (!ua_sess) {
5253 /* Session not associated with this app. */
5254 continue;
5255 }
5256
5257 cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter,
5258 ua_chan, node.node) {
5259 if (cur_nr_packets >= ua_chan->attr.num_subbuf) {
5260 /*
5261 * Don't take channel into account if we
5262 * already grab all its packets.
5263 */
5264 continue;
5265 }
5266 tot_size += ua_chan->attr.subbuf_size * ua_chan->streams.count;
5267 }
5268 }
5269 rcu_read_unlock();
5270 break;
5271 }
5272 default:
5273 assert(0);
5274 break;
5275 }
5276
5277 return tot_size;
5278 }
This page took 0.183829 seconds and 4 git commands to generate.