X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng-sessiond%2Fmain.c;h=9af001dfd63d3de910d8de5f14a6beca4872f334;hp=4bb7240378161540cb4573e4a3fc91e076dbdbae;hb=cc920def6dae913bb4d78788fd440b4d87928134;hpb=596219f7620add67e61a4666e7b5f4b1e79ade1a diff --git a/lttng-sessiond/main.c b/lttng-sessiond/main.c index 4bb724037..9af001dfd 100644 --- a/lttng-sessiond/main.c +++ b/lttng-sessiond/main.c @@ -1921,8 +1921,13 @@ static void list_lttng_channels(int domain, struct ltt_session *session, uchan->attr.switch_timer_interval; channels[i].attr.read_timer_interval = uchan->attr.read_timer_interval; - channels[i].attr.output = uchan->attr.output; channels[i].enabled = uchan->enabled; + switch (uchan->attr.output) { + case LTTNG_UST_MMAP: + default: + channels[i].attr.output = LTTNG_EVENT_MMAP; + break; + } i++; } break; @@ -1941,6 +1946,7 @@ static int list_lttng_ust_global_events(char *channel_name, int i = 0, ret = 0; unsigned int nb_event = 0; struct cds_lfht_iter iter; + struct cds_lfht_node *node; struct ltt_ust_channel *uchan; struct ltt_ust_event *uevent; struct lttng_event *tmp; @@ -1949,11 +1955,17 @@ static int list_lttng_ust_global_events(char *channel_name, rcu_read_lock(); - /* Count events in all channels */ - cds_lfht_for_each_entry(ust_global->channels, &iter, uchan, node) { - nb_event += hashtable_get_count(uchan->events); + node = hashtable_lookup(ust_global->channels, (void *) channel_name, + strlen(channel_name), &iter); + if (node == NULL) { + ret = -LTTCOMM_UST_CHAN_NOT_FOUND; + goto error; } + uchan = caa_container_of(node, struct ltt_ust_channel, node); + + nb_event += hashtable_get_count(uchan->events); + if (nb_event == 0) { ret = nb_event; goto error; @@ -1967,24 +1979,22 @@ static int list_lttng_ust_global_events(char *channel_name, goto error; } - cds_lfht_for_each_entry(ust_global->channels, &iter, uchan, node) { - cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) { - strncpy(tmp[i].name, uevent->attr.name, LTTNG_SYMBOL_NAME_LEN); - tmp[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; - tmp[i].enabled = uevent->enabled; - switch (uevent->attr.instrumentation) { - case LTTNG_UST_TRACEPOINT: - tmp[i].type = LTTNG_EVENT_TRACEPOINT; - break; - case LTTNG_UST_PROBE: - tmp[i].type = LTTNG_EVENT_PROBE; - break; - case LTTNG_UST_FUNCTION: - tmp[i].type = LTTNG_EVENT_FUNCTION; - break; - } - i++; + cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) { + strncpy(tmp[i].name, uevent->attr.name, LTTNG_SYMBOL_NAME_LEN); + tmp[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; + tmp[i].enabled = uevent->enabled; + switch (uevent->attr.instrumentation) { + case LTTNG_UST_TRACEPOINT: + tmp[i].type = LTTNG_EVENT_TRACEPOINT; + break; + case LTTNG_UST_PROBE: + tmp[i].type = LTTNG_EVENT_PROBE; + break; + case LTTNG_UST_FUNCTION: + tmp[i].type = LTTNG_EVENT_FUNCTION; + break; } + i++; } ret = nb_event; @@ -2266,15 +2276,17 @@ static int cmd_disable_event(struct ltt_session *session, int domain, case LTTNG_DOMAIN_KERNEL: { struct ltt_kernel_channel *kchan; + struct ltt_kernel_session *ksess; - kchan = trace_kernel_get_channel_by_name(channel_name, - session->kernel_session); + ksess = session->kernel_session; + + kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; } - ret = event_kernel_disable_tracepoint(session->kernel_session, kchan, event_name); + ret = event_kernel_disable_tracepoint(ksess, kchan, event_name); if (ret != LTTCOMM_OK) { goto error; } @@ -2283,11 +2295,34 @@ static int cmd_disable_event(struct ltt_session *session, int domain, break; } case LTTNG_DOMAIN_UST: + { + struct ltt_ust_session *usess; + struct ltt_ust_channel *uchan; + + usess = session->ust_session; + + uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, + channel_name); + if (uchan == NULL) { + ret = LTTCOMM_UST_CHAN_NOT_FOUND; + goto error; + } + + ret = ust_app_disable_event(usess, uchan, event_name); + if (ret < 0) { + ret = LTTCOMM_UST_DISABLE_FAIL; + goto error; + } + + DBG2("Disable UST event %s in channel %s completed", event_name, + channel_name); + + break; + } case LTTNG_DOMAIN_UST_EXEC_NAME: case LTTNG_DOMAIN_UST_PID: case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: default: - /* TODO: Other UST domains */ ret = LTTCOMM_NOT_IMPLEMENTED; goto error; } @@ -2305,26 +2340,57 @@ static int cmd_disable_event_all(struct ltt_session *session, int domain, char *channel_name) { int ret; - struct ltt_kernel_channel *kchan; switch (domain) { case LTTNG_DOMAIN_KERNEL: - kchan = trace_kernel_get_channel_by_name(channel_name, - session->kernel_session); + { + struct ltt_kernel_session *ksess; + struct ltt_kernel_channel *kchan; + + ksess = session->kernel_session; + + kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; } - ret = event_kernel_disable_all(session->kernel_session, kchan); + ret = event_kernel_disable_all(ksess, kchan); if (ret != LTTCOMM_OK) { goto error; } kernel_wait_quiescent(kernel_tracer_fd); break; + } + case LTTNG_DOMAIN_UST: + { + struct ltt_ust_session *usess; + struct ltt_ust_channel *uchan; + + usess = session->ust_session; + + uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, + channel_name); + if (uchan == NULL) { + ret = LTTCOMM_UST_CHAN_NOT_FOUND; + goto error; + } + + ret = ust_app_disable_event_all(usess, uchan); + if (ret < 0) { + ret = LTTCOMM_UST_DISABLE_FAIL; + goto error; + } + + DBG2("Disable all UST event in channel %s completed", channel_name); + + break; + } + case LTTNG_DOMAIN_UST_EXEC_NAME: + case LTTNG_DOMAIN_UST_PID: + case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: default: - /* TODO: Userspace tracing */ ret = LTTCOMM_NOT_IMPLEMENTED; goto error; } @@ -2408,8 +2474,10 @@ static int cmd_enable_event(struct ltt_session *session, int domain, ret = channel_kernel_create(session->kernel_session, attr, kernel_poll_pipe[1]); if (ret != LTTCOMM_OK) { + free(attr); goto error; } + free(attr); } /* Get the newly created kernel channel pointer */ @@ -2450,6 +2518,7 @@ static int cmd_enable_event(struct ltt_session *session, int domain, /* Use the internal command enable channel */ ret = cmd_enable_channel(session, domain, attr); if (ret < 0) { + free(attr); goto error; }