2 * Copyright (C) 2013 - David Goulet <dgoulet@efficios.com>
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License, version 2 only, as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc., 51
15 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <urcu/uatomic.h>
22 #include <common/common.h>
23 #include <common/sessiond-comm/agent.h>
25 #include <common/compat/endian.h>
32 * Match function for the events hash table lookup by name.
34 static int ht_match_event_by_name(struct cds_lfht_node
*node
,
37 struct agent_event
*event
;
38 const struct agent_ht_key
*key
;
43 event
= caa_container_of(node
, struct agent_event
, node
.node
);
46 /* Match 1 elements of the key: name. */
49 if (strncmp(event
->name
, key
->name
, sizeof(event
->name
)) != 0) {
60 * Match function for the events hash table lookup by name and loglevel.
62 static int ht_match_event(struct cds_lfht_node
*node
,
65 struct agent_event
*event
;
66 const struct agent_ht_key
*key
;
71 event
= caa_container_of(node
, struct agent_event
, node
.node
);
74 /* Match 2 elements of the key: name and loglevel. */
77 if (strncmp(event
->name
, key
->name
, sizeof(event
->name
)) != 0) {
81 if (event
->loglevel
!= key
->loglevel
) {
82 if (event
->loglevel_type
== LTTNG_EVENT_LOGLEVEL_ALL
&&
83 key
->loglevel
== 0 && event
->loglevel
== -1) {
96 * Add unique agent event based on the event name and loglevel.
98 static void add_unique_agent_event(struct lttng_ht
*ht
,
99 struct agent_event
*event
)
101 struct cds_lfht_node
*node_ptr
;
102 struct agent_ht_key key
;
108 key
.name
= event
->name
;
109 key
.loglevel
= event
->loglevel
;
111 node_ptr
= cds_lfht_add_unique(ht
->ht
,
112 ht
->hash_fct(event
->node
.key
, lttng_ht_seed
),
113 ht_match_event
, &key
, &event
->node
.node
);
114 assert(node_ptr
== &event
->node
.node
);
118 * URCU delayed agent event reclaim.
120 static void destroy_event_agent_rcu(struct rcu_head
*head
)
122 struct lttng_ht_node_str
*node
=
123 caa_container_of(head
, struct lttng_ht_node_str
, head
);
124 struct agent_event
*event
=
125 caa_container_of(node
, struct agent_event
, node
);
131 * URCU delayed agent app reclaim.
133 static void destroy_app_agent_rcu(struct rcu_head
*head
)
135 struct lttng_ht_node_ulong
*node
=
136 caa_container_of(head
, struct lttng_ht_node_ulong
, head
);
137 struct agent_app
*app
=
138 caa_container_of(node
, struct agent_app
, node
);
144 * Communication with the agent. Send the message header to the given socket in
147 * Return 0 on success or else a negative errno message of sendmsg() op.
149 static int send_header(struct lttcomm_sock
*sock
, uint64_t data_size
,
150 uint32_t cmd
, uint32_t cmd_version
)
154 struct lttcomm_agent_hdr msg
;
158 memset(&msg
, 0, sizeof(msg
));
159 msg
.data_size
= htobe64(data_size
);
160 msg
.cmd
= htobe32(cmd
);
161 msg
.cmd_version
= htobe32(cmd_version
);
163 size
= sock
->ops
->sendmsg(sock
, &msg
, sizeof(msg
), 0);
164 if (size
< sizeof(msg
)) {
175 * Communication call with the agent. Send the payload to the given socket. The
176 * header MUST be sent prior to this call.
178 * Return 0 on success or else a negative errno value of sendmsg() op.
180 static int send_payload(struct lttcomm_sock
*sock
, void *data
,
189 len
= sock
->ops
->sendmsg(sock
, data
, size
, 0);
201 * Communication call with the agent. Receive reply from the agent using the
204 * Return 0 on success or else a negative errno value from recvmsg() op.
206 static int recv_reply(struct lttcomm_sock
*sock
, void *buf
, size_t size
)
214 len
= sock
->ops
->recvmsg(sock
, buf
, size
, 0);
226 * Internal event listing for a given app. Populate events.
228 * Return number of element in the list or else a negative LTTNG_ERR* code.
229 * On success, the caller is responsible for freeing the memory
230 * allocated for "events".
232 static ssize_t
list_events(struct agent_app
*app
, struct lttng_event
**events
)
234 int ret
, i
, len
= 0, offset
= 0;
237 struct lttng_event
*tmp_events
= NULL
;
238 struct lttcomm_agent_list_reply
*reply
= NULL
;
239 struct lttcomm_agent_list_reply_hdr reply_hdr
;
245 DBG2("Agent listing events for app pid: %d and socket %d", app
->pid
,
248 ret
= send_header(app
->sock
, 0, AGENT_CMD_LIST
, 0);
253 /* Get list header so we know how much we'll receive. */
254 ret
= recv_reply(app
->sock
, &reply_hdr
, sizeof(reply_hdr
));
259 switch (be32toh(reply_hdr
.ret_code
)) {
260 case AGENT_RET_CODE_SUCCESS
:
261 data_size
= be32toh(reply_hdr
.data_size
) + sizeof(*reply
);
264 ERR("Agent returned an unknown code: %" PRIu32
,
265 be32toh(reply_hdr
.ret_code
));
266 ret
= LTTNG_ERR_FATAL
;
270 reply
= zmalloc(data_size
);
272 ret
= LTTNG_ERR_NOMEM
;
276 /* Get the list with the appropriate data size. */
277 ret
= recv_reply(app
->sock
, reply
, data_size
);
282 nb_event
= be32toh(reply
->nb_event
);
283 tmp_events
= zmalloc(sizeof(*tmp_events
) * nb_event
);
285 ret
= LTTNG_ERR_NOMEM
;
289 for (i
= 0; i
< nb_event
; i
++) {
291 strncpy(tmp_events
[i
].name
, reply
->payload
+ offset
,
292 sizeof(tmp_events
[i
].name
));
293 tmp_events
[i
].pid
= app
->pid
;
294 tmp_events
[i
].enabled
= -1;
295 len
= strlen(reply
->payload
+ offset
) + 1;
298 *events
= tmp_events
;
304 ret
= LTTNG_ERR_UST_LIST_FAIL
;
313 * Internal enable agent event on a agent application. This function
314 * communicates with the agent to enable a given event.
316 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
318 static int enable_event(struct agent_app
*app
, struct agent_event
*event
)
322 struct lttcomm_agent_enable msg
;
323 struct lttcomm_agent_generic_reply reply
;
329 DBG2("Agent enabling event %s for app pid: %d and socket %d", event
->name
,
330 app
->pid
, app
->sock
->fd
);
332 data_size
= sizeof(msg
);
334 ret
= send_header(app
->sock
, data_size
, AGENT_CMD_ENABLE
, 0);
339 memset(&msg
, 0, sizeof(msg
));
340 msg
.loglevel
= event
->loglevel
;
341 msg
.loglevel_type
= event
->loglevel_type
;
342 strncpy(msg
.name
, event
->name
, sizeof(msg
.name
));
343 ret
= send_payload(app
->sock
, &msg
, sizeof(msg
));
348 ret
= recv_reply(app
->sock
, &reply
, sizeof(reply
));
353 switch (be32toh(reply
.ret_code
)) {
354 case AGENT_RET_CODE_SUCCESS
:
356 case AGENT_RET_CODE_UNKNOWN_NAME
:
357 ret
= LTTNG_ERR_UST_EVENT_NOT_FOUND
;
360 ERR("Agent returned an unknown code: %" PRIu32
,
361 be32toh(reply
.ret_code
));
362 ret
= LTTNG_ERR_FATAL
;
369 ret
= LTTNG_ERR_UST_ENABLE_FAIL
;
375 * Internal disable agent event call on a agent application. This function
376 * communicates with the agent to disable a given event.
378 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
380 static int disable_event(struct agent_app
*app
, struct agent_event
*event
)
384 struct lttcomm_agent_disable msg
;
385 struct lttcomm_agent_generic_reply reply
;
391 DBG2("Agent disabling event %s for app pid: %d and socket %d", event
->name
,
392 app
->pid
, app
->sock
->fd
);
394 data_size
= sizeof(msg
);
396 ret
= send_header(app
->sock
, data_size
, AGENT_CMD_DISABLE
, 0);
401 memset(&msg
, 0, sizeof(msg
));
402 strncpy(msg
.name
, event
->name
, sizeof(msg
.name
));
403 ret
= send_payload(app
->sock
, &msg
, sizeof(msg
));
408 ret
= recv_reply(app
->sock
, &reply
, sizeof(reply
));
413 switch (be32toh(reply
.ret_code
)) {
414 case AGENT_RET_CODE_SUCCESS
:
416 case AGENT_RET_CODE_UNKNOWN_NAME
:
417 ret
= LTTNG_ERR_UST_EVENT_NOT_FOUND
;
420 ERR("Agent returned an unknown code: %" PRIu32
,
421 be32toh(reply
.ret_code
));
422 ret
= LTTNG_ERR_FATAL
;
429 ret
= LTTNG_ERR_UST_DISABLE_FAIL
;
435 * Send back the registration DONE command to a given agent application.
437 * Return 0 on success or else a negative value.
439 int agent_send_registration_done(struct agent_app
*app
)
444 DBG("Agent sending registration done to app socket %d", app
->sock
->fd
);
446 return send_header(app
->sock
, 0, AGENT_CMD_REG_DONE
, 0);
450 * Enable agent event on every agent applications registered with the session
453 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
455 int agent_enable_event(struct agent_event
*event
,
456 enum lttng_domain_type domain
)
459 struct agent_app
*app
;
460 struct lttng_ht_iter iter
;
466 cds_lfht_for_each_entry(agent_apps_ht_by_sock
->ht
, &iter
.iter
, app
,
468 if (app
->domain
!= domain
) {
472 /* Enable event on agent application through TCP socket. */
473 ret
= enable_event(app
, event
);
474 if (ret
!= LTTNG_OK
) {
488 * Disable agent event on every agent applications registered with the session
491 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
493 int agent_disable_event(struct agent_event
*event
,
494 enum lttng_domain_type domain
)
497 struct agent_app
*app
;
498 struct lttng_ht_iter iter
;
504 cds_lfht_for_each_entry(agent_apps_ht_by_sock
->ht
, &iter
.iter
, app
,
506 if (app
->domain
!= domain
) {
510 /* Enable event on agent application through TCP socket. */
511 ret
= disable_event(app
, event
);
512 if (ret
!= LTTNG_OK
) {
526 * Ask every agent for the list of possible event. Events is allocated with the
527 * events of every agent application.
529 * Return the number of events or else a negative value.
531 int agent_list_events(struct lttng_event
**events
,
532 enum lttng_domain_type domain
)
535 size_t nbmem
, count
= 0;
536 struct agent_app
*app
;
537 struct lttng_event
*tmp_events
= NULL
;
538 struct lttng_ht_iter iter
;
542 nbmem
= UST_APP_EVENT_LIST_SIZE
;
543 tmp_events
= zmalloc(nbmem
* sizeof(*tmp_events
));
545 PERROR("zmalloc agent list events");
551 cds_lfht_for_each_entry(agent_apps_ht_by_sock
->ht
, &iter
.iter
, app
,
554 struct lttng_event
*agent_events
;
556 /* Skip domain not asked by the list. */
557 if (app
->domain
!= domain
) {
561 nb_ev
= list_events(app
, &agent_events
);
567 if (count
+ nb_ev
> nbmem
) {
568 /* In case the realloc fails, we free the memory */
569 struct lttng_event
*new_tmp_events
;
572 new_nbmem
= max_t(size_t, count
+ nb_ev
, nbmem
<< 1);
573 DBG2("Reallocating agent event list from %zu to %zu entries",
575 new_tmp_events
= realloc(tmp_events
,
576 new_nbmem
* sizeof(*new_tmp_events
));
577 if (!new_tmp_events
) {
578 PERROR("realloc agent events");
583 /* Zero the new memory */
584 memset(new_tmp_events
+ nbmem
, 0,
585 (new_nbmem
- nbmem
) * sizeof(*new_tmp_events
));
587 tmp_events
= new_tmp_events
;
589 memcpy(tmp_events
+ count
, agent_events
,
590 nb_ev
* sizeof(*tmp_events
));
597 *events
= tmp_events
;
608 * Create a agent app object using the given PID.
610 * Return newly allocated object or else NULL on error.
612 struct agent_app
*agent_create_app(pid_t pid
, enum lttng_domain_type domain
,
613 struct lttcomm_sock
*sock
)
615 struct agent_app
*app
;
619 app
= zmalloc(sizeof(*app
));
621 PERROR("zmalloc agent create");
626 app
->domain
= domain
;
628 lttng_ht_node_init_ulong(&app
->node
, (unsigned long) app
->sock
->fd
);
635 * Lookup agent app by socket in the global hash table.
637 * RCU read side lock MUST be acquired.
639 * Return object if found else NULL.
641 struct agent_app
*agent_find_app_by_sock(int sock
)
643 struct lttng_ht_node_ulong
*node
;
644 struct lttng_ht_iter iter
;
645 struct agent_app
*app
;
649 lttng_ht_lookup(agent_apps_ht_by_sock
, (void *)((unsigned long) sock
), &iter
);
650 node
= lttng_ht_iter_get_node_ulong(&iter
);
654 app
= caa_container_of(node
, struct agent_app
, node
);
656 DBG3("Agent app pid %d found by sock %d.", app
->pid
, sock
);
660 DBG3("Agent app NOT found by sock %d.", sock
);
665 * Add agent application object to the global hash table.
667 void agent_add_app(struct agent_app
*app
)
671 DBG3("Agent adding app sock: %d and pid: %d to ht", app
->sock
->fd
, app
->pid
);
674 lttng_ht_add_unique_ulong(agent_apps_ht_by_sock
, &app
->node
);
679 * Delete agent application from the global hash table.
681 void agent_delete_app(struct agent_app
*app
)
684 struct lttng_ht_iter iter
;
688 DBG3("Agent deleting app pid: %d and sock: %d", app
->pid
, app
->sock
->fd
);
690 iter
.iter
.node
= &app
->node
.node
;
692 ret
= lttng_ht_del(agent_apps_ht_by_sock
, &iter
);
698 * Destroy a agent application object by detaching it from its corresponding
699 * UST app if one is connected by closing the socket. Finally, perform a
700 * delayed memory reclaim.
702 void agent_destroy_app(struct agent_app
*app
)
707 app
->sock
->ops
->close(app
->sock
);
708 lttcomm_destroy_sock(app
->sock
);
711 call_rcu(&app
->node
.head
, destroy_app_agent_rcu
);
715 * Initialize an already allocated agent object.
717 * Return 0 on success or else a negative errno value.
719 int agent_init(struct agent
*agt
)
725 agt
->events
= lttng_ht_new(0, LTTNG_HT_TYPE_STRING
);
730 lttng_ht_node_init_u64(&agt
->node
, agt
->domain
);
739 * Add agent object to the given hash table.
741 void agent_add(struct agent
*agt
, struct lttng_ht
*ht
)
746 DBG3("Agent adding from domain %d", agt
->domain
);
749 lttng_ht_add_unique_u64(ht
, &agt
->node
);
754 * Create an agent object for the given domain.
756 * Return the allocated agent or NULL on error.
758 struct agent
*agent_create(enum lttng_domain_type domain
)
763 agt
= zmalloc(sizeof(*agt
));
767 agt
->domain
= domain
;
769 ret
= agent_init(agt
);
781 * Create a newly allocated agent event data structure. If name is valid, it's
782 * copied into the created event.
784 * Return a new object else NULL on error.
786 struct agent_event
*agent_create_event(const char *name
,
787 struct lttng_filter_bytecode
*filter
)
789 struct agent_event
*event
;
791 DBG3("Agent create new event with name %s", name
);
793 event
= zmalloc(sizeof(*event
));
799 strncpy(event
->name
, name
, sizeof(event
->name
));
800 event
->name
[sizeof(event
->name
) - 1] = '\0';
801 lttng_ht_node_init_str(&event
->node
, event
->name
);
805 event
->filter
= filter
;
813 * Unique add of a agent event to an agent object.
815 void agent_add_event(struct agent_event
*event
, struct agent
*agt
)
821 DBG3("Agent adding event %s", event
->name
);
824 add_unique_agent_event(agt
->events
, event
);
830 * Find a agent event in the given agent using name.
832 * RCU read side lock MUST be acquired.
834 * Return object if found else NULL.
836 struct agent_event
*agent_find_event_by_name(const char *name
,
839 struct lttng_ht_node_str
*node
;
840 struct lttng_ht_iter iter
;
842 struct agent_ht_key key
;
851 cds_lfht_lookup(ht
->ht
, ht
->hash_fct((void *) name
, lttng_ht_seed
),
852 ht_match_event_by_name
, &key
, &iter
.iter
);
853 node
= lttng_ht_iter_get_node_str(&iter
);
858 DBG3("Agent event found %s by name.", name
);
859 return caa_container_of(node
, struct agent_event
, node
);
862 DBG3("Agent NOT found by name %s.", name
);
867 * Find a agent event in the given agent using name and loglevel.
869 * RCU read side lock MUST be acquired.
871 * Return object if found else NULL.
873 struct agent_event
*agent_find_event(const char *name
, int loglevel
,
876 struct lttng_ht_node_str
*node
;
877 struct lttng_ht_iter iter
;
879 struct agent_ht_key key
;
887 key
.loglevel
= loglevel
;
889 cds_lfht_lookup(ht
->ht
, ht
->hash_fct((void *) name
, lttng_ht_seed
),
890 ht_match_event
, &key
, &iter
.iter
);
891 node
= lttng_ht_iter_get_node_str(&iter
);
896 DBG3("Agent event found %s.", name
);
897 return caa_container_of(node
, struct agent_event
, node
);
900 DBG3("Agent NOT found %s.", name
);
905 * Free given agent event. This event must not be globally visible at this
906 * point (only expected to be used on failure just after event creation). After
907 * this call, the pointer is not usable anymore.
909 void agent_destroy_event(struct agent_event
*event
)
917 * Destroy an agent completely. Note that the given pointer is NOT freed
918 * thus a reference to static or stack data can be passed to this function.
920 void agent_destroy(struct agent
*agt
)
922 struct lttng_ht_node_str
*node
;
923 struct lttng_ht_iter iter
;
927 DBG3("Agent destroy");
930 * Just ignore if no events hash table exists. This is possible if for
931 * instance an agent object was allocated but not initialized.
938 cds_lfht_for_each_entry(agt
->events
->ht
, &iter
.iter
, node
, node
) {
940 struct agent_event
*event
;
943 * When destroying an event, we have to try to disable it on the agent
944 * side so the event stops generating data. The return value is not
945 * important since we have to continue anyway destroying the object.
947 event
= caa_container_of(node
, struct agent_event
, node
);
948 (void) agent_disable_event(event
, agt
->domain
);
950 ret
= lttng_ht_del(agt
->events
, &iter
);
952 call_rcu(&node
->head
, destroy_event_agent_rcu
);
956 lttng_ht_destroy(agt
->events
);
960 * Initialize agent subsystem.
962 int agent_setup(void)
964 agent_apps_ht_by_sock
= lttng_ht_new(0, LTTNG_HT_TYPE_ULONG
);
965 if (!agent_apps_ht_by_sock
) {
973 * Update a agent application (given socket) using the given agent.
975 * Note that this function is most likely to be used with a tracing session
976 * thus the caller should make sure to hold the appropriate lock(s).
978 void agent_update(struct agent
*agt
, int sock
)
981 struct agent_app
*app
;
982 struct agent_event
*event
;
983 struct lttng_ht_iter iter
;
988 DBG("Agent updating app socket %d", sock
);
991 cds_lfht_for_each_entry(agt
->events
->ht
, &iter
.iter
, event
, node
.node
) {
992 /* Skip event if disabled. */
993 if (!event
->enabled
) {
997 app
= agent_find_app_by_sock(sock
);
999 * We are in the registration path thus if the application is gone,
1000 * there is a serious code flow error.
1004 ret
= enable_event(app
, event
);
1005 if (ret
!= LTTNG_OK
) {
1006 DBG2("Agent update unable to enable event %s on app pid: %d sock %d",
1007 event
->name
, app
->pid
, app
->sock
->fd
);
1008 /* Let's try the others here and don't assume the app is dead. */