Implement kernel filter support
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index 59d86f45ae1b399866d8656228cedb9c49ce5a37..45d958546f2cae75d938a8960af3c3fd5690be64 100644 (file)
@@ -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;
@@ -209,19 +212,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 +220,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 +248,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 +375,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)
 {
This page took 0.023716 seconds and 4 git commands to generate.