X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fevent.c;h=0efdc9253d59adc98da8508c8909b9a6d9e58f06;hb=d0ae4ea864f84fa2456563abb20fe42e5cc29625;hp=3db3089b66f203d0afbf0aec432933d6a772d3e0;hpb=6c1c0768320135c6936c371b09731851b508c023;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/event.c b/src/bin/lttng-sessiond/event.c index 3db3089b6..0efdc9253 100644 --- a/src/bin/lttng-sessiond/event.c +++ b/src/bin/lttng-sessiond/event.c @@ -61,7 +61,7 @@ static void add_unique_ust_event(struct lttng_ht *ht, /* * Disable kernel tracepoint event for a channel from the kernel session. */ -int event_kernel_disable_tracepoint(struct ltt_kernel_channel *kchan, +int event_kernel_disable_event(struct ltt_kernel_channel *kchan, char *event_name) { int ret; @@ -69,7 +69,8 @@ int event_kernel_disable_tracepoint(struct ltt_kernel_channel *kchan, assert(kchan); - kevent = trace_kernel_get_event_by_name(event_name, kchan); + kevent = trace_kernel_get_event_by_name(event_name, kchan, + LTTNG_EVENT_ALL); if (kevent == NULL) { ret = LTTNG_ERR_NO_EVENT; goto error; @@ -90,61 +91,11 @@ error: return ret; } -/* - * Enable kernel system call for a channel from the kernel session. - */ -int event_kernel_enable_syscall(struct ltt_kernel_channel *kchan, - char *syscall_name) -{ - int ret; - - assert(kchan); - - ret = kernel_enable_syscall(syscall_name, kchan); - if (ret < 0) { - ret = LTTNG_ERR_KERN_ENABLE_FAIL; - goto error; - } - - DBG("Kernel event %s enable for channel %s.", - syscall_name, kchan->channel->name); - - ret = LTTNG_OK; - -error: - return ret; -} - -/* - * Disable kernel system call for a channel from the kernel session. - */ -int event_kernel_disable_syscall(struct ltt_kernel_channel *kchan, - char *syscall_name) -{ - int ret; - - assert(kchan); - - ret = kernel_disable_syscall(syscall_name, kchan); - if (ret < 0) { - ret = LTTNG_ERR_KERN_DISABLE_FAIL; - goto error; - } - - DBG("Kernel syscall %s disable for channel %s.", - syscall_name[0] == '\0' ? "" : syscall_name, - kchan->channel->name); - - ret = LTTNG_OK; - -error: - return ret; -} - /* * Disable kernel tracepoint events for a channel from the kernel session. */ -int event_kernel_disable_all_tracepoints(struct ltt_kernel_channel *kchan) +int event_kernel_disable_event_type(struct ltt_kernel_channel *kchan, + enum lttng_event_type type) { int ret; struct ltt_kernel_event *kevent; @@ -153,6 +104,8 @@ int event_kernel_disable_all_tracepoints(struct ltt_kernel_channel *kchan) /* For each event in the kernel session */ cds_list_for_each_entry(kevent, &kchan->events_list.head, list) { + if (type != LTTNG_EVENT_ALL && kevent->type != type) + continue; ret = kernel_disable_event(kevent); if (ret < 0) { /* We continue disabling the rest */ @@ -166,23 +119,16 @@ int event_kernel_disable_all_tracepoints(struct ltt_kernel_channel *kchan) /* * Disable all kernel event for a channel from the kernel session. */ -int event_kernel_disable_all(struct ltt_kernel_channel *kchan) +int event_kernel_disable_event_all(struct ltt_kernel_channel *kchan) { - int ret; - - assert(kchan); - - ret = event_kernel_disable_all_tracepoints(kchan); - if (ret != LTTNG_OK) - return ret; - ret = event_kernel_disable_syscall(kchan, ""); - return ret; + return event_kernel_disable_event_type(kchan, LTTNG_EVENT_ALL); } /* * Enable kernel tracepoint event for a channel from the kernel session. + * We own filter_expression and filter. */ -int event_kernel_enable_tracepoint(struct ltt_kernel_channel *kchan, +int event_kernel_enable_event(struct ltt_kernel_channel *kchan, struct lttng_event *event) { int ret; @@ -191,7 +137,8 @@ int event_kernel_enable_tracepoint(struct ltt_kernel_channel *kchan, assert(kchan); assert(event); - kevent = trace_kernel_get_event_by_name(event->name, kchan); + kevent = trace_kernel_get_event_by_name(event->name, kchan, + event->type); if (kevent == NULL) { ret = kernel_create_event(event, kchan); if (ret < 0) { @@ -225,84 +172,6 @@ end: return ret; } -/* - * Enable all kernel tracepoint events of a channel of the kernel session. - */ -int event_kernel_enable_all_tracepoints(struct ltt_kernel_channel *kchan, - int kernel_tracer_fd) -{ - int size, i, ret; - struct ltt_kernel_event *kevent; - struct lttng_event *event_list = NULL; - - assert(kchan); - - /* For each event in the kernel session */ - cds_list_for_each_entry(kevent, &kchan->events_list.head, list) { - if (kevent->enabled == 0) { - ret = kernel_enable_event(kevent); - if (ret < 0) { - /* Enable failed but still continue */ - continue; - } - } - } - - size = kernel_list_events(kernel_tracer_fd, &event_list); - if (size < 0) { - ret = LTTNG_ERR_KERN_LIST_FAIL; - goto end; - } - - for (i = 0; i < size; i++) { - kevent = trace_kernel_get_event_by_name(event_list[i].name, kchan); - if (kevent == NULL) { - /* Default event type for enable all */ - event_list[i].type = LTTNG_EVENT_TRACEPOINT; - /* Enable each single tracepoint event */ - ret = kernel_create_event(&event_list[i], kchan); - if (ret < 0) { - /* Ignore error here and continue */ - } - } - } - free(event_list); - - ret = LTTNG_OK; -end: - return ret; -} - -/* - * Enable all kernel events of a channel of the kernel session. - */ -int event_kernel_enable_all(struct ltt_kernel_channel *kchan, - int kernel_tracer_fd) -{ - int tp_ret; - - assert(kchan); - - tp_ret = event_kernel_enable_all_tracepoints(kchan, kernel_tracer_fd); - if (tp_ret != LTTNG_OK) { - goto end; - } - - /* - * Reaching this code path means that all tracepoints were enabled without - * errors so we ignore the error value of syscalls. - * - * At the moment, failing to enable syscalls on "lttng enable-event -a -k" - * is not considered an error that need to be returned to the client since - * tracepoints did not fail. Future work will allow us to send back - * multiple errors to the client in one API call. - */ - (void) event_kernel_enable_syscall(kchan, ""); - -end: - return tp_ret; -} - /* * ============================ * UST : The Ultimate Frontier! @@ -408,6 +277,7 @@ error: /* * Enable UST tracepoint event for a channel from a UST session. + * We own filter_expression, filter, and exclusion. */ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan, struct lttng_event *event, @@ -429,6 +299,10 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, if (uevent == NULL) { uevent = trace_ust_create_event(event, filter_expression, filter, exclusion); + /* We have passed ownership */ + filter_expression = NULL; + filter = NULL; + exclusion = NULL; if (uevent == NULL) { ret = LTTNG_ERR_UST_ENABLE_FAIL; goto error; @@ -476,6 +350,9 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, end: rcu_read_unlock(); + free(filter_expression); + free(filter); + free(exclusion); return ret; error: @@ -491,6 +368,9 @@ error: trace_ust_destroy_event(uevent); } rcu_read_unlock(); + free(filter_expression); + free(filter); + free(exclusion); return ret; }