X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=570747f183ac96f479fd0a7480919b27345221bd;hb=7daee9326d6c79d83d1095b8f732dbed2a3a4516;hp=59d86f45ae1b399866d8656228cedb9c49ce5a37;hpb=a5dfbb9db7ba31913657ed921006b13977b7b426;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 59d86f45a..570747f18 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -177,7 +177,9 @@ error: * We own filter_expression and filter. */ int kernel_create_event(struct lttng_event *ev, - struct ltt_kernel_channel *channel) + struct ltt_kernel_channel *channel, + char *filter_expression, + struct lttng_filter_bytecode *filter) { int ret; struct ltt_kernel_event *event; @@ -185,7 +187,9 @@ int kernel_create_event(struct lttng_event *ev, assert(ev); assert(channel); - event = trace_kernel_create_event(ev); + /* We pass ownership of filter_expression and filter */ + event = trace_kernel_create_event(ev, filter_expression, + filter); if (event == NULL) { ret = -1; goto error; @@ -209,19 +213,7 @@ int kernel_create_event(struct lttng_event *ev, goto free_event; } - /* - * LTTNG_KERNEL_SYSCALL event creation will return 0 on success. - */ - if (ret == 0 && event->event->instrumentation == LTTNG_KERNEL_SYSCALL) { - DBG2("Kernel event syscall creation success"); - /* - * We use fd == -1 to ensure that we never trigger a close of fd - * 0. - */ - event->fd = -1; - goto add_list; - } - + event->type = ev->type; event->fd = ret; /* Prevent fd duplication after execlp() */ ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC); @@ -229,7 +221,26 @@ int kernel_create_event(struct lttng_event *ev, PERROR("fcntl session fd"); } -add_list: + if (filter) { + ret = kernctl_filter(event->fd, filter); + if (ret) { + goto filter_error; + } + } + + ret = kernctl_enable(event->fd); + if (ret < 0) { + switch (errno) { + case EEXIST: + ret = LTTNG_ERR_KERN_EVENT_EXIST; + break; + default: + PERROR("enable kernel event"); + break; + } + goto enable_error; + } + /* Add event to event list */ cds_list_add(&event->list, &channel->events_list.head); channel->event_count++; @@ -238,6 +249,16 @@ add_list: return 0; +enable_error: +filter_error: + { + int closeret; + + closeret = close(event->fd); + if (closeret) { + PERROR("close event fd"); + } + } free_event: free(event); error: @@ -355,17 +376,6 @@ error: return ret; } -int kernel_enable_syscall(const char *syscall_name, - struct ltt_kernel_channel *channel) -{ - return kernctl_enable_syscall(channel->fd, syscall_name); -} - -int kernel_disable_syscall(const char *syscall_name, - struct ltt_kernel_channel *channel) -{ - return kernctl_disable_syscall(channel->fd, syscall_name); -} int kernel_track_pid(struct ltt_kernel_session *session, int pid) {