X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=e88ad0d0de4b3439f88d417ad58e82f58b9c99f3;hb=d9f0c7c7ce520c309f8e7148ecaff9aacbe52b55;hp=c5c7564b69afd9f01a36c1b402d9ec39b8fe1937;hpb=bbcab087101aeaf9811074f9e622290e503104ca;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index c5c7564b6..e88ad0d0d 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include "channel.h" @@ -384,9 +385,13 @@ end: } } -static void increment_extended_len(const char *filter_expression, - struct lttng_event_exclusion *exclusion, size_t *extended_len) +static int increment_extended_len(const char *filter_expression, + struct lttng_event_exclusion *exclusion, + const struct lttng_userspace_probe_location *probe_location, + size_t *extended_len) { + int ret = 0; + *extended_len += sizeof(struct lttcomm_event_extended_header); if (filter_expression) { @@ -396,14 +401,31 @@ static void increment_extended_len(const char *filter_expression, if (exclusion) { *extended_len += exclusion->count * LTTNG_SYMBOL_NAME_LEN; } + + if (probe_location) { + ret = lttng_userspace_probe_location_serialize(probe_location, + NULL, NULL); + if (ret < 0) { + goto end; + } + *extended_len += ret; + } + ret = 0; +end: + return ret; } -static void append_extended_info(const char *filter_expression, - struct lttng_event_exclusion *exclusion, void **extended_at) +static int append_extended_info(const char *filter_expression, + struct lttng_event_exclusion *exclusion, + struct lttng_userspace_probe_location *probe_location, + void **extended_at) { - struct lttcomm_event_extended_header extended_header; + int ret = 0; size_t filter_len = 0; size_t nb_exclusions = 0; + size_t userspace_probe_location_len = 0; + struct lttng_dynamic_buffer location_buffer; + struct lttcomm_event_extended_header extended_header; if (filter_expression) { filter_len = strlen(filter_expression) + 1; @@ -413,9 +435,21 @@ static void append_extended_info(const char *filter_expression, nb_exclusions = exclusion->count; } + if (probe_location) { + lttng_dynamic_buffer_init(&location_buffer); + ret = lttng_userspace_probe_location_serialize(probe_location, + &location_buffer, NULL); + if (ret < 0) { + ret = -1; + goto end; + } + userspace_probe_location_len = location_buffer.size; + } + /* Set header fields */ extended_header.filter_len = filter_len; extended_header.nb_exclusions = nb_exclusions; + extended_header.userspace_probe_location_len = userspace_probe_location_len; /* Copy header */ memcpy(*extended_at, &extended_header, sizeof(extended_header)); @@ -434,6 +468,15 @@ static void append_extended_info(const char *filter_expression, memcpy(*extended_at, &exclusion->names, len); *extended_at += len; } + + if (probe_location) { + memcpy(*extended_at, location_buffer.data, location_buffer.size); + *extended_at += location_buffer.size; + lttng_dynamic_buffer_reset(&location_buffer); + } + ret = 0; +end: + return ret; } /* @@ -447,7 +490,7 @@ static int list_lttng_agent_events(struct agent *agt, int i = 0, ret = 0; unsigned int nb_event = 0; struct agent_event *event; - struct lttng_event *tmp_events; + struct lttng_event *tmp_events = NULL; struct lttng_ht_iter iter; size_t extended_len = 0; void *extended_at; @@ -475,8 +518,13 @@ static int list_lttng_agent_events(struct agent *agt, */ rcu_read_lock(); cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) { - increment_extended_len(event->filter_expression, NULL, + ret = increment_extended_len(event->filter_expression, NULL, NULL, &extended_len); + if (ret) { + DBG("Error computing the length of extended info message"); + ret = -LTTNG_ERR_FATAL; + goto error; + } } rcu_read_unlock(); @@ -501,17 +549,25 @@ static int list_lttng_agent_events(struct agent *agt, i++; /* Append extended info */ - append_extended_info(event->filter_expression, NULL, + ret = append_extended_info(event->filter_expression, NULL, NULL, &extended_at); + if (ret) { + DBG("Error appending extended info message"); + ret = -LTTNG_ERR_FATAL; + goto error; + } } - rcu_read_unlock(); *events = tmp_events; ret = nb_event; - -error: assert(nb_event == i); + +end: + rcu_read_unlock(); return ret; +error: + free(tmp_events); + goto end; } /* @@ -560,8 +616,13 @@ static int list_lttng_ust_global_events(char *channel_name, continue; } - increment_extended_len(uevent->filter_expression, - uevent->exclusion, &extended_len); + ret = increment_extended_len(uevent->filter_expression, + uevent->exclusion, NULL, &extended_len); + if (ret) { + DBG("Error computing the length of extended info message"); + ret = -LTTNG_ERR_FATAL; + goto end; + } } if (nb_event == 0) { /* All events are internal, skip. */ @@ -621,8 +682,13 @@ static int list_lttng_ust_global_events(char *channel_name, i++; /* Append extended info */ - append_extended_info(uevent->filter_expression, - uevent->exclusion, &extended_at); + ret = append_extended_info(uevent->filter_expression, + uevent->exclusion, NULL, &extended_at); + if (ret) { + DBG("Error appending extended info message"); + ret = -LTTNG_ERR_FATAL; + goto end; + } } ret = nb_event; @@ -664,14 +730,20 @@ static int list_lttng_kernel_events(char *channel_name, /* Compute required extended infos size */ cds_list_for_each_entry(event, &kchan->events_list.head, list) { - increment_extended_len(event->filter_expression, NULL, + ret = increment_extended_len(event->filter_expression, NULL, + event->userspace_probe_location, &extended_len); + if (ret) { + DBG("Error computing the length of extended info message"); + ret = -LTTNG_ERR_FATAL; + goto error; + } } *total_size = nb_event * sizeof(struct lttng_event) + extended_len; *events = zmalloc(*total_size); if (*events == NULL) { - ret = LTTNG_ERR_FATAL; + ret = -LTTNG_ERR_FATAL; goto error; } @@ -700,6 +772,9 @@ static int list_lttng_kernel_events(char *channel_name, memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe, sizeof(struct lttng_kernel_kprobe)); break; + case LTTNG_KERNEL_UPROBE: + (*events)[i].type = LTTNG_EVENT_USERSPACE_PROBE; + break; case LTTNG_KERNEL_FUNCTION: (*events)[i].type = LTTNG_EVENT_FUNCTION; memcpy(&((*events)[i].attr.ftrace), &event->event->u.ftrace, @@ -712,14 +787,21 @@ static int list_lttng_kernel_events(char *channel_name, (*events)[i].type = LTTNG_EVENT_SYSCALL; break; case LTTNG_KERNEL_ALL: + /* fall-through. */ + default: assert(0); break; } i++; /* Append extended info */ - append_extended_info(event->filter_expression, NULL, - &extended_at); + ret = append_extended_info(event->filter_expression, NULL, + event->userspace_probe_location, &extended_at); + if (ret) { + DBG("Error appending extended info message"); + ret = -LTTNG_ERR_FATAL; + goto error; + } } end: @@ -1996,6 +2078,7 @@ static int _cmd_enable_event(struct ltt_session *session, break; } case LTTNG_EVENT_PROBE: + case LTTNG_EVENT_USERSPACE_PROBE: case LTTNG_EVENT_FUNCTION: case LTTNG_EVENT_FUNCTION_ENTRY: case LTTNG_EVENT_TRACEPOINT: @@ -4964,58 +5047,6 @@ end: return ret; } -/* - * Command ROTATE_GET_CURRENT_PATH from the lttng-ctl library. - * - * Configure the automatic rotation parameters. - * Set to -1ULL to disable them. - * - * Return LTTNG_OK on success or else a LTTNG_ERR code. - */ -int cmd_session_get_current_output(struct ltt_session *session, - struct lttng_session_get_current_output_return *output_return) -{ - int ret; - const char *path; - - if (!session->snapshot_mode) { - if (session->current_archive_id == 0) { - if (session->kernel_session) { - path = session_get_base_path(session); - } else if (session->ust_session) { - path = session_get_base_path(session); - } else { - abort(); - } - assert(path); - } else { - path = session->rotation_chunk.active_tracing_path; - } - } else { - /* - * A snapshot session does not have a "current" trace archive - * location. - */ - path = ""; - } - - DBG("Cmd get current output for session %s, returning %s", - session->name, path); - - ret = lttng_strncpy(output_return->path, - path, - sizeof(output_return->path)); - if (ret) { - ERR("Failed to copy trace output path to session get current output command reply"); - ret = -LTTNG_ERR_UNK; - goto end; - } - - ret = LTTNG_OK; -end: - return ret; -} - /* Wait for a given path to be removed before continuing. */ static enum lttng_error_code wait_on_path(void *path_data) {