Warn on event registration/unregistration failure
[lttng-modules.git] / src / lttng-events.c
index 8d2bf46991d78703a2bbeed96333282211319600..31c1145748361ee894992b293505597348ce032b 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/vmalloc.h>
 #include <linux/dmi.h>
 
+#include <wrapper/compiler_attributes.h>
 #include <wrapper/uuid.h>
 #include <wrapper/vmalloc.h>   /* for wrapper_vmalloc_sync_mappings() */
 #include <wrapper/random.h>
@@ -71,8 +72,8 @@ static void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier
 
 static void _lttng_event_destroy(struct lttng_kernel_event_common *event);
 static void _lttng_channel_destroy(struct lttng_kernel_channel_buffer *chan);
-static int _lttng_event_unregister(struct lttng_kernel_event_recorder *event);
-static int _lttng_event_notifier_unregister(struct lttng_kernel_event_notifier *event_notifier);
+static void _lttng_event_unregister(struct lttng_kernel_event_recorder *event);
+static void _lttng_event_notifier_unregister(struct lttng_kernel_event_notifier *event_notifier);
 static
 int _lttng_event_metadata_statedump(struct lttng_kernel_session *session,
                                  struct lttng_kernel_channel_buffer *chan,
@@ -93,7 +94,8 @@ int _lttng_field_statedump(struct lttng_kernel_session *session,
 
 void synchronize_trace(void)
 {
-#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,1,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,1,0) || \
+       LTTNG_RHEL_KERNEL_RANGE(4,18,0,193,0,0, 4,19,0,0,0,0))
        synchronize_rcu();
 #else
        synchronize_sched();
@@ -362,10 +364,8 @@ void lttng_session_destroy(struct lttng_kernel_session *session)
                ret = lttng_syscalls_unregister_channel(chan_priv->pub);
                WARN_ON(ret);
        }
-       list_for_each_entry(event_recorder_priv, &session->priv->events, node) {
-               ret = _lttng_event_unregister(event_recorder_priv->pub);
-               WARN_ON(ret);
-       }
+       list_for_each_entry(event_recorder_priv, &session->priv->events, node)
+               _lttng_event_unregister(event_recorder_priv->pub);
        synchronize_trace();    /* Wait for in-flight events to complete */
        list_for_each_entry(chan_priv, &session->priv->chan, node) {
                ret = lttng_syscalls_destroy_event(chan_priv->pub);
@@ -413,10 +413,8 @@ void lttng_event_notifier_group_destroy(
        WARN_ON(ret);
 
        list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
-                       &event_notifier_group->event_notifiers_head, node) {
-               ret = _lttng_event_notifier_unregister(event_notifier_priv->pub);
-               WARN_ON(ret);
-       }
+                       &event_notifier_group->event_notifiers_head, node)
+               _lttng_event_notifier_unregister(event_notifier_priv->pub);
 
        /* Wait for in-flight event notifier to complete */
        synchronize_trace();
@@ -658,12 +656,14 @@ int lttng_event_enable(struct lttng_kernel_event_common *event)
                goto end;
        }
        switch (event->priv->instrumentation) {
-       case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
+       case LTTNG_KERNEL_ABI_TRACEPOINT:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_SYSCALL:
                ret = -EINVAL;
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_UPROBE:
                WRITE_ONCE(event->enabled, 1);
                break;
@@ -672,8 +672,10 @@ int lttng_event_enable(struct lttng_kernel_event_common *event)
                ret = lttng_kretprobes_event_enable_state(event, 1);
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -718,12 +720,14 @@ int lttng_event_disable(struct lttng_kernel_event_common *event)
                goto end;
        }
        switch (event->priv->instrumentation) {
-       case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
+       case LTTNG_KERNEL_ABI_TRACEPOINT:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_SYSCALL:
                ret = -EINVAL;
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_UPROBE:
                WRITE_ONCE(event->enabled, 0);
                break;
@@ -732,8 +736,10 @@ int lttng_event_disable(struct lttng_kernel_event_common *event)
                ret = lttng_kretprobes_event_enable_state(event, 0);
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -872,15 +878,20 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l
                event_name = event_desc->event_name;
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_UPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_UPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_SYSCALL:
                event_name = event_param->name;
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -1092,8 +1103,10 @@ struct lttng_kernel_event_recorder *_lttng_kernel_event_recorder_create(struct l
                WARN_ON_ONCE(!ret);
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -1140,15 +1153,20 @@ struct lttng_kernel_event_notifier *_lttng_event_notifier_create(
                event_name = event_desc->event_name;
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_UPROBE:           /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_UPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_SYSCALL:
                event_name = event_notifier_param->event.name;
                break;
 
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -1295,9 +1313,12 @@ struct lttng_kernel_event_notifier *_lttng_event_notifier_create(
                WARN_ON_ONCE(!ret);
                break;
 
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
                ret = -EINVAL;
@@ -1407,8 +1428,7 @@ void register_event(struct lttng_kernel_event_recorder *event_recorder)
        const struct lttng_kernel_event_desc *desc;
        int ret = -EINVAL;
 
-       if (event_recorder->priv->parent.registered)
-               return;
+       WARN_ON_ONCE(event_recorder->priv->parent.registered);
 
        desc = event_recorder->priv->parent.desc;
        switch (event_recorder->priv->parent.instrumentation) {
@@ -1422,14 +1442,18 @@ void register_event(struct lttng_kernel_event_recorder *event_recorder)
                ret = lttng_syscall_filter_enable_event(event_recorder->chan, event_recorder);
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
-       case LTTNG_KERNEL_ABI_UPROBE:           /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_UPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_KRETPROBE:
                ret = 0;
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
        }
@@ -1440,14 +1464,14 @@ void register_event(struct lttng_kernel_event_recorder *event_recorder)
 /*
  * Only used internally at session destruction.
  */
-int _lttng_event_unregister(struct lttng_kernel_event_recorder *event_recorder)
+static
+void unregister_event(struct lttng_kernel_event_recorder *event_recorder)
 {
        struct lttng_kernel_event_common_private *event_priv = &event_recorder->priv->parent;
        const struct lttng_kernel_event_desc *desc;
        int ret = -EINVAL;
 
-       if (!event_priv->registered)
-               return 0;
+       WARN_ON_ONCE(!event_priv->registered);
 
        desc = event_priv->desc;
        switch (event_priv->instrumentation) {
@@ -1480,13 +1504,21 @@ int _lttng_event_unregister(struct lttng_kernel_event_recorder *event_recorder)
                ret = 0;
                break;
 
-       case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
        }
+       WARN_ON_ONCE(ret);
        if (!ret)
                event_priv->registered = 0;
-       return ret;
+}
+
+static
+void _lttng_event_unregister(struct lttng_kernel_event_recorder *event_recorder)
+{
+       if (event_recorder->priv->parent.registered)
+               unregister_event(event_recorder);
 }
 
 /* Only used for tracepoints for now. */
@@ -1496,8 +1528,7 @@ void register_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
        const struct lttng_kernel_event_desc *desc;
        int ret = -EINVAL;
 
-       if (event_notifier->priv->parent.registered)
-               return;
+       WARN_ON_ONCE(event_notifier->priv->parent.registered);
 
        desc = event_notifier->priv->parent.desc;
        switch (event_notifier->priv->parent.instrumentation) {
@@ -1511,14 +1542,18 @@ void register_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
                ret = lttng_syscall_filter_enable_event_notifier(event_notifier);
                break;
 
-       case LTTNG_KERNEL_ABI_KPROBE:           /* Fall-through */
+       case LTTNG_KERNEL_ABI_KPROBE:
+               lttng_fallthrough;
        case LTTNG_KERNEL_ABI_UPROBE:
                ret = 0;
                break;
 
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
        }
@@ -1527,14 +1562,12 @@ void register_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
 }
 
 static
-int _lttng_event_notifier_unregister(
-               struct lttng_kernel_event_notifier *event_notifier)
+int unregister_event_notifier(struct lttng_kernel_event_notifier *event_notifier)
 {
        const struct lttng_kernel_event_desc *desc;
        int ret = -EINVAL;
 
-       if (!event_notifier->priv->parent.registered)
-               return 0;
+       WARN_ON_ONCE(!event_notifier->priv->parent.registered);
 
        desc = event_notifier->priv->parent.desc;
        switch (event_notifier->priv->parent.instrumentation) {
@@ -1558,9 +1591,12 @@ int _lttng_event_notifier_unregister(
                ret = lttng_syscall_filter_disable_event_notifier(event_notifier);
                break;
 
-       case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-       case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-       case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+       case LTTNG_KERNEL_ABI_KRETPROBE:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_FUNCTION:
+               lttng_fallthrough;
+       case LTTNG_KERNEL_ABI_NOOP:
+               lttng_fallthrough;
        default:
                WARN_ON_ONCE(1);
        }
@@ -1569,6 +1605,13 @@ int _lttng_event_notifier_unregister(
        return ret;
 }
 
+static
+void _lttng_event_notifier_unregister(struct lttng_kernel_event_notifier *event_notifier)
+{
+       if (event_notifier->priv->parent.registered)
+               unregister_event_notifier(event_notifier);
+}
+
 /*
  * Only used internally at session destruction.
  */
@@ -1613,8 +1656,10 @@ void _lttng_event_destroy(struct lttng_kernel_event_common *event)
                        lttng_uprobes_destroy_event_private(event_recorder);
                        break;
 
-               case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-               case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+               case LTTNG_KERNEL_ABI_FUNCTION:
+                       lttng_fallthrough;
+               case LTTNG_KERNEL_ABI_NOOP:
+                       lttng_fallthrough;
                default:
                        WARN_ON_ONCE(1);
                }
@@ -1646,9 +1691,12 @@ void _lttng_event_destroy(struct lttng_kernel_event_common *event)
                        lttng_uprobes_destroy_event_notifier_private(event_notifier);
                        break;
 
-               case LTTNG_KERNEL_ABI_KRETPROBE:        /* Fall-through */
-               case LTTNG_KERNEL_ABI_FUNCTION:         /* Fall-through */
-               case LTTNG_KERNEL_ABI_NOOP:             /* Fall-through */
+               case LTTNG_KERNEL_ABI_KRETPROBE:
+                       lttng_fallthrough;
+               case LTTNG_KERNEL_ABI_FUNCTION:
+                       lttng_fallthrough;
+               case LTTNG_KERNEL_ABI_NOOP:
+                       lttng_fallthrough;
                default:
                        WARN_ON_ONCE(1);
                }
@@ -2712,7 +2760,8 @@ void lttng_session_sync_event_enablers(struct lttng_kernel_session *session)
                int nr_filters = 0;
 
                switch (event_recorder_priv->parent.instrumentation) {
-               case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
+               case LTTNG_KERNEL_ABI_TRACEPOINT:
+                       lttng_fallthrough;
                case LTTNG_KERNEL_ABI_SYSCALL:
                        /* Enable events */
                        list_for_each_entry(enabler_ref,
@@ -2741,9 +2790,11 @@ void lttng_session_sync_event_enablers(struct lttng_kernel_session *session)
                 * state.
                 */
                if (enabled) {
-                       register_event(event_recorder);
+                       if (!event_recorder_priv->parent.registered)
+                               register_event(event_recorder);
                } else {
-                       _lttng_event_unregister(event_recorder);
+                       if (event_recorder_priv->parent.registered)
+                               _lttng_event_unregister(event_recorder);
                }
 
                /* Check if has enablers without bytecode enabled */
@@ -2806,7 +2857,8 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group
                int nr_filters = 0, nr_captures = 0;
 
                switch (event_notifier_priv->parent.instrumentation) {
-               case LTTNG_KERNEL_ABI_TRACEPOINT:       /* Fall-through */
+               case LTTNG_KERNEL_ABI_TRACEPOINT:
+                       lttng_fallthrough;
                case LTTNG_KERNEL_ABI_SYSCALL:
                        /* Enable event_notifiers */
                        list_for_each_entry(enabler_ref,
@@ -2833,7 +2885,7 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group
                                register_event_notifier(event_notifier);
                } else {
                        if (event_notifier_priv->parent.registered)
-                               _lttng_event_notifier_unregister(event_notifier);
+                               unregister_event_notifier(event_notifier);
                }
 
                /* Check if has enablers without bytecode enabled */
@@ -2924,7 +2976,7 @@ int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
        }
        stream->transport->ops.event_write(&ctx,
                        stream->metadata_cache->data + stream->metadata_in,
-                       reserve_len);
+                       reserve_len, 1);
        stream->transport->ops.event_commit(&ctx);
        stream->metadata_in += reserve_len;
        if (reserve_len < len)
@@ -3876,7 +3928,7 @@ int print_escaped_ctf_string(struct lttng_kernel_session *session, const char *s
                        if (ret)
                                goto error;
                        /* We still print the current char */
-                       /* Fallthrough */
+                       lttng_fallthrough;
                default:
                        ret = lttng_metadata_printf(session, "%c", cur);
                        break;
@@ -4362,6 +4414,9 @@ static int __init lttng_events_init(void)
 #else
                "");
 #endif
+#ifdef CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM
+       printk(KERN_NOTICE "LTTng: Experimental bitwise enum enabled.\n");
+#endif /* CONFIG_LTTNG_EXPERIMENTAL_BITWISE_ENUM */
        return 0;
 
 error_hotplug:
This page took 0.028284 seconds and 4 git commands to generate.