X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=45d958546f2cae75d938a8960af3c3fd5690be64;hp=bf9f8b623288eb2e7eb58652bb5f26493ecf399e;hb=00a620843422e5c972aee0ada2181b811fc81b92;hpb=fac26884aa477a653fb72cc009fb14f970833baf diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index bf9f8b623..45d958546 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,8 @@ int kernel_create_event(struct lttng_event *ev, assert(ev); assert(channel); - event = trace_kernel_create_event(ev); + event = trace_kernel_create_event(ev, filter_expression, + filter); if (event == NULL) { ret = -1; goto error; @@ -217,6 +220,26 @@ int kernel_create_event(struct lttng_event *ev, PERROR("fcntl session fd"); } + 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++; @@ -225,6 +248,16 @@ int kernel_create_event(struct lttng_event *ev, return 0; +enable_error: +filter_error: + { + int closeret; + + closeret = close(event->fd); + if (closeret) { + PERROR("close event fd"); + } + } free_event: free(event); error: