Version 2.13.0-rc1
[lttng-modules.git] / src / lttng-events.c
index 0c5b49d981bb6a864061277c282d4d24fc78877c..d881bddceb4c94fc0033f42b23b8c9a89b012c40 100644 (file)
@@ -603,57 +603,37 @@ end:
        return ret;
 }
 
-int lttng_event_enable(struct lttng_kernel_event_recorder *event_recorder)
+int lttng_event_enable(struct lttng_kernel_event_common *event)
 {
-       struct lttng_kernel_event_common *event = &event_recorder->parent;
        int ret = 0;
 
        mutex_lock(&sessions_mutex);
-       if (event_recorder->chan->channel_type == METADATA_CHANNEL) {
-               ret = -EPERM;
-               goto end;
-       }
-       if (event->enabled) {
-               ret = -EEXIST;
-               goto end;
-       }
-       switch (event->priv->instrumentation) {
-       case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
-       case LTTNG_KERNEL_ABI_SYSCALL:
-               ret = -EINVAL;
-               break;
+       switch (event->type) {
+       case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
+       {
+               struct lttng_kernel_event_recorder *event_recorder =
+                       container_of(event, struct lttng_kernel_event_recorder, parent);
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_UPROBE:
-               WRITE_ONCE(event->enabled, 1);
+               if (event_recorder->chan->channel_type == METADATA_CHANNEL) {
+                       ret = -EPERM;
+                       goto end;
+               }
                break;
-
-       case LTTNG_KERNEL_ABI_KRETPROBE:
-               ret = lttng_kretprobes_event_enable_state(event_recorder, 1);
+       }
+       case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
+               switch (event->priv->instrumentation) {
+               case LTTNG_KERNEL_ABI_KRETPROBE:
+                       ret = -EINVAL;
+                       goto end;
+               default:
+                       break;
+               }
                break;
-
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
        default:
-               WARN_ON_ONCE(1);
-               ret = -EINVAL;
+               break;
        }
-end:
-       mutex_unlock(&sessions_mutex);
-       return ret;
-}
-
-int lttng_event_disable(struct lttng_kernel_event_recorder *event_recorder)
-{
-       struct lttng_kernel_event_common *event = &event_recorder->parent;
-       int ret = 0;
 
-       mutex_lock(&sessions_mutex);
-       if (event_recorder->chan->channel_type == METADATA_CHANNEL) {
-               ret = -EPERM;
-               goto end;
-       }
-       if (!event->enabled) {
+       if (event->enabled) {
                ret = -EEXIST;
                goto end;
        }
@@ -665,12 +645,11 @@ int lttng_event_disable(struct lttng_kernel_event_recorder *event_recorder)
 
        case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
        case LTTNG_KERNEL_ABI_UPROBE:
-               WRITE_ONCE(event->enabled, 0);
+               WRITE_ONCE(event->enabled, 1);
                break;
 
        case LTTNG_KERNEL_ABI_KRETPROBE:
-
-               ret = lttng_kretprobes_event_enable_state(event_recorder, 0);
+               ret = lttng_kretprobes_event_enable_state(event, 1);
                break;
 
        case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
@@ -684,45 +663,36 @@ end:
        return ret;
 }
 
-int lttng_event_notifier_enable(struct lttng_kernel_event_notifier *event_notifier)
+int lttng_event_disable(struct lttng_kernel_event_common *event)
 {
-       struct lttng_kernel_event_common *event = &event_notifier->parent;
        int ret = 0;
 
        mutex_lock(&sessions_mutex);
-       if (event->enabled) {
-               ret = -EEXIST;
-               goto end;
-       }
-       switch (event->priv->instrumentation) {
-       case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
-       case LTTNG_KERNEL_ABI_SYSCALL:
-               ret = -EINVAL;
-               break;
+       switch (event->type) {
+       case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
+       {
+               struct lttng_kernel_event_recorder *event_recorder =
+                       container_of(event, struct lttng_kernel_event_recorder, parent);
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_UPROBE:
-               WRITE_ONCE(event->enabled, 1);
+               if (event_recorder->chan->channel_type == METADATA_CHANNEL) {
+                       ret = -EPERM;
+                       goto end;
+               }
+               break;
+       }
+       case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER:
+               switch (event->priv->instrumentation) {
+               case LTTNG_KERNEL_ABI_KRETPROBE:
+                       ret = -EINVAL;
+                       goto end;
+               default:
+                       break;
+               }
                break;
-
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
        default:
-               WARN_ON_ONCE(1);
-               ret = -EINVAL;
+               break;
        }
-end:
-       mutex_unlock(&sessions_mutex);
-       return ret;
-}
 
-int lttng_event_notifier_disable(struct lttng_kernel_event_notifier *event_notifier)
-{
-       struct lttng_kernel_event_common *event = &event_notifier->parent;
-       int ret = 0;
-
-       mutex_lock(&sessions_mutex);
        if (!event->enabled) {
                ret = -EEXIST;
                goto end;
@@ -738,8 +708,11 @@ int lttng_event_notifier_disable(struct lttng_kernel_event_notifier *event_notif
                WRITE_ONCE(event->enabled, 0);
                break;
 
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               ret = lttng_kretprobes_event_enable_state(event, 0);
+               break;
+
        case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
        case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
        default:
                WARN_ON_ONCE(1);
@@ -912,6 +885,7 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l
        event_recorder->parent.priv = &event_recorder_priv->parent;
        event_recorder->parent.type = LTTNG_KERNEL_EVENT_TYPE_RECORDER;
 
+       event_recorder->parent.run_filter = lttng_kernel_interpret_event_filter;
        event_recorder->chan = chan;
        event_recorder->priv->id = chan->free_event_id++;
        event_recorder->priv->parent.instrumentation = itype;
@@ -987,6 +961,7 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l
                event_recorder_return->parent.priv = &event_recorder_return_priv->parent;
                event_recorder_return->parent.type = LTTNG_KERNEL_EVENT_TYPE_RECORDER;
 
+               event_recorder_return->parent.run_filter = lttng_kernel_interpret_event_filter;
                event_recorder_return->chan = chan;
                event_recorder_return->priv->id = chan->free_event_id++;
                event_recorder_return->priv->parent.instrumentation = itype;
@@ -1188,6 +1163,7 @@ struct lttng_kernel_event_notifier *_lttng_event_notifier_create(
        INIT_LIST_HEAD(&event_notifier->priv->parent.filter_bytecode_runtime_head);
        INIT_LIST_HEAD(&event_notifier->priv->parent.enablers_ref_head);
        INIT_LIST_HEAD(&event_notifier->priv->capture_bytecode_runtime_head);
+       event_notifier->parent.run_filter = lttng_kernel_interpret_event_filter;
 
        switch (itype) {
        case LTTNG_KERNEL_ABI_TRACEPOINT:
@@ -1497,7 +1473,7 @@ void register_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
        switch (event_notifier->priv->parent.instrumentation) {
        case LTTNG_KERNEL_ABI_TRACEPOINT:
                ret = lttng_wrapper_tracepoint_probe_register(desc->event_kname,
-                                                 desc->event_notifier_callback,
+                                                 desc->probe_callback,
                                                  event_notifier);
                break;
 
@@ -1534,7 +1510,7 @@ int _lttng_event_notifier_unregister(
        switch (event_notifier->priv->parent.instrumentation) {
        case LTTNG_KERNEL_ABI_TRACEPOINT:
                ret = lttng_wrapper_tracepoint_probe_unregister(event_notifier->priv->parent.desc->event_kname,
-                                                 event_notifier->priv->parent.desc->event_notifier_callback,
+                                                 event_notifier->priv->parent.desc->probe_callback,
                                                  event_notifier);
                break;
 
@@ -2489,7 +2465,7 @@ int lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler,
        if (ret)
                goto error_free;
 
-       bytecode_node->type = LTTNG_BYTECODE_NODE_TYPE_FILTER;
+       bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_FILTER;
        bytecode_node->enabler = enabler;
        /* Enforce length based on allocated size */
        bytecode_node->bc.len = bytecode_len;
@@ -2518,13 +2494,13 @@ error:
        return ret;
 }
 
-int lttng_event_add_callsite(struct lttng_kernel_event_recorder *event_recorder,
+int lttng_event_add_callsite(struct lttng_kernel_event_common *event,
                struct lttng_kernel_abi_event_callsite __user *callsite)
 {
 
-       switch (event_recorder->priv->parent.instrumentation) {
+       switch (event->priv->instrumentation) {
        case LTTNG_KERNEL_ABI_UPROBE:
-               return lttng_uprobes_event_add_callsite(event_recorder, callsite);
+               return lttng_uprobes_event_add_callsite(event, callsite);
        default:
                return -EINVAL;
        }
@@ -2648,7 +2624,7 @@ int lttng_event_notifier_enabler_attach_capture_bytecode(
        if (ret)
                goto error_free;
 
-       bytecode_node->type = LTTNG_BYTECODE_NODE_TYPE_CAPTURE;
+       bytecode_node->type = LTTNG_KERNEL_BYTECODE_TYPE_CAPTURE;
        bytecode_node->enabler = enabler;
 
        /* Enforce length based on allocated size */
@@ -2666,19 +2642,6 @@ end:
        return ret;
 }
 
-int lttng_event_notifier_add_callsite(struct lttng_kernel_event_notifier *event_notifier,
-               struct lttng_kernel_abi_event_callsite __user *callsite)
-{
-
-       switch (event_notifier->priv->parent.instrumentation) {
-       case LTTNG_KERNEL_ABI_UPROBE:
-               return lttng_uprobes_event_notifier_add_callsite(event_notifier,
-                               callsite);
-       default:
-               return -EINVAL;
-       }
-}
-
 static
 void lttng_event_notifier_enabler_destroy(
                struct lttng_event_notifier_enabler *event_notifier_enabler)
@@ -2715,7 +2678,8 @@ void lttng_session_sync_event_enablers(struct lttng_session *session)
                struct lttng_kernel_event_recorder *event_recorder = event_recorder_priv->pub;
                struct lttng_enabler_ref *enabler_ref;
                struct lttng_bytecode_runtime *runtime;
-               int enabled = 0, has_enablers_without_bytecode = 0;
+               int enabled = 0, has_enablers_without_filter_bytecode = 0;
+               int nr_filters = 0;
 
                switch (event_recorder_priv->parent.instrumentation) {
                case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
@@ -2757,17 +2721,21 @@ void lttng_session_sync_event_enablers(struct lttng_session *session)
                                &event_recorder_priv->parent.enablers_ref_head, node) {
                        if (enabler_ref->ref->enabled
                                        && list_empty(&enabler_ref->ref->filter_bytecode_head)) {
-                               has_enablers_without_bytecode = 1;
+                               has_enablers_without_filter_bytecode = 1;
                                break;
                        }
                }
                event_recorder_priv->parent.has_enablers_without_filter_bytecode =
-                       has_enablers_without_bytecode;
+                       has_enablers_without_filter_bytecode;
 
                /* Enable filters */
                list_for_each_entry(runtime,
-                               &event_recorder_priv->parent.filter_bytecode_runtime_head, node)
-                       lttng_bytecode_filter_sync_state(runtime);
+                               &event_recorder_priv->parent.filter_bytecode_runtime_head, node) {
+                       lttng_bytecode_sync_state(runtime);
+                       nr_filters++;
+               }
+               WRITE_ONCE(event_recorder_priv->parent.pub->eval_filter,
+                       !(has_enablers_without_filter_bytecode || !nr_filters));
        }
 }
 
@@ -2804,7 +2772,8 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group
                struct lttng_kernel_event_notifier *event_notifier = event_notifier_priv->pub;
                struct lttng_enabler_ref *enabler_ref;
                struct lttng_bytecode_runtime *runtime;
-               int enabled = 0, has_enablers_without_bytecode = 0;
+               int enabled = 0, has_enablers_without_filter_bytecode = 0;
+               int nr_filters = 0, nr_captures = 0;
 
                switch (event_notifier_priv->parent.instrumentation) {
                case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
@@ -2842,24 +2811,29 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group
                                &event_notifier_priv->parent.enablers_ref_head, node) {
                        if (enabler_ref->ref->enabled
                                        && list_empty(&enabler_ref->ref->filter_bytecode_head)) {
-                               has_enablers_without_bytecode = 1;
+                               has_enablers_without_filter_bytecode = 1;
                                break;
                        }
                }
                event_notifier_priv->parent.has_enablers_without_filter_bytecode =
-                       has_enablers_without_bytecode;
+                       has_enablers_without_filter_bytecode;
 
                /* Enable filters */
                list_for_each_entry(runtime,
-                               &event_notifier_priv->parent.filter_bytecode_runtime_head, node)
-                       lttng_bytecode_filter_sync_state(runtime);
+                               &event_notifier_priv->parent.filter_bytecode_runtime_head, node) {
+                       lttng_bytecode_sync_state(runtime);
+                       nr_filters++;
+               }
+               WRITE_ONCE(event_notifier_priv->parent.pub->eval_filter,
+                       !(has_enablers_without_filter_bytecode || !nr_filters));
 
                /* Enable captures */
                list_for_each_entry(runtime,
-                               &event_notifier_priv->capture_bytecode_runtime_head, node)
-                       lttng_bytecode_capture_sync_state(runtime);
-
-               WRITE_ONCE(event_notifier->eval_capture, !!event_notifier_priv->num_captures);
+                               &event_notifier_priv->capture_bytecode_runtime_head, node) {
+                       lttng_bytecode_sync_state(runtime);
+                       nr_captures++;
+               }
+               WRITE_ONCE(event_notifier->eval_capture, !!nr_captures);
        }
 }
 
@@ -2907,8 +2881,8 @@ int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
        reserve_len = min_t(size_t,
                        stream->transport->ops.packet_avail_size(chan),
                        len);
-       lib_ring_buffer_ctx_init(&ctx, chan, NULL, reserve_len,
-                       sizeof(char), -1);
+       lib_ring_buffer_ctx_init(&ctx, chan, reserve_len,
+                       sizeof(char), -1, NULL);
        /*
         * If reservation failed, return an error to the caller.
         */
This page took 0.028289 seconds and 4 git commands to generate.