Set probe descriptor field in event descriptor
[lttng-modules.git] / include / lttng / tracepoint-event-impl.h
index d70c1f9743efbf3b10fbc091c87e4afc3daa5a39..a1eff6c242f672576cddbd0f401467572a103b17 100644 (file)
@@ -20,7 +20,6 @@
 #include <lttng/types.h>
 #include <lttng/probe-user.h>
 #include <lttng/events.h>
-#include <lttng/events-internal.h>     /* TODO: remove this include after refactoring is done. */
 #include <lttng/tracer-core.h>
 #include <lttng/tp-mempool.h>
 
@@ -199,11 +198,13 @@ void __event_template_proto___##_name(void);
 #define TP_ENUM_VALUES(...)                                            \
        __VA_ARGS__
 
-#undef LTTNG_TRACEPOINT_ENUM
-#define LTTNG_TRACEPOINT_ENUM(_name, _values)                          \
+#ifndef LTTNG_TRACEPOINT_TYPE_EXTERN
+# undef LTTNG_TRACEPOINT_ENUM
+# define LTTNG_TRACEPOINT_ENUM(_name, _values)                         \
        static const struct lttng_kernel_enum_entry *__enum_values__##_name[] = { \
                _values                                                 \
        };
+#endif
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
@@ -252,7 +253,7 @@ void __event_template_proto___##_name(void);
                lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \
                _nowrite, 0, 1),                                \
        lttng_kernel_static_event_field(#_item,                 \
-               lttng_kernel_static_type_sequence("_" #_item "_length", \
+               lttng_kernel_static_type_sequence(NULL, /* Use previous field. */ \
                        lttng_kernel_static_type_integer_from_type(_type, _byte_order, _elem_type_base), \
                        0,                                      \
                        _encoding),                             \
@@ -266,7 +267,7 @@ void __event_template_proto___##_name(void);
                lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \
                _nowrite, 0, 1),                                \
        lttng_kernel_static_event_field(#_item,                 \
-               lttng_kernel_static_type_sequence("_" #_item "_length", \
+               lttng_kernel_static_type_sequence(NULL, /* Use previous field. */ \
                        lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10), \
                        lttng_alignof(_type),                   \
                        none),                                  \
@@ -308,18 +309,37 @@ void __event_template_proto___##_name(void);
 #define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
        LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, PARAMS(_fields), _code_post)
 
-#undef LTTNG_TRACEPOINT_ENUM
-#define LTTNG_TRACEPOINT_ENUM(_name, _values)                                          \
-       static const struct lttng_kernel_enum_desc __enum_##_name = {                   \
-               .name = #_name,                                                         \
-               .entries = __enum_values__##_name,                                      \
-               .nr_entries = ARRAY_SIZE(__enum_values__##_name),                       \
-       };
+#ifdef LTTNG_TRACEPOINT_TYPE_EXTERN
+# undef LTTNG_TRACEPOINT_TYPE
+# define LTTNG_TRACEPOINT_TYPE(_prototype, _init)      \
+       extern _prototype;
+#elif defined (LTTNG_TRACEPOINT_TYPE_DEFINE_EXPORT)
+# define LTTNG_TRACEPOINT_TYPE_VISIBILITY __attribute__((visibility("hidden")))
+#else
+# define LTTNG_TRACEPOINT_TYPE_VISIBILITY static
+#endif
+
+#ifdef LTTNG_TRACEPOINT_TYPE_VISIBILITY
+# undef LTTNG_TRACEPOINT_TYPE
+# define LTTNG_TRACEPOINT_TYPE(_prototype, _init)      \
+       LTTNG_TRACEPOINT_TYPE_VISIBILITY _prototype = _init;
+#endif
+
+# undef LTTNG_TRACEPOINT_ENUM
+# define LTTNG_TRACEPOINT_ENUM(_name, _values)                                         \
+       LTTNG_TRACEPOINT_TYPE(PARAMS(const struct lttng_kernel_enum_desc __enum_##_name), \
+       PARAMS({                                                                        \
+                .name = #_name,                                                         \
+                .entries = __enum_values__##_name,                                      \
+                .nr_entries = ARRAY_SIZE(__enum_values__##_name),                       \
+        }))
 
 #define LTTNG_CREATE_FIELD_METADATA
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 #undef LTTNG_CREATE_FIELD_METADATA
 
+#undef LTTNG_TRACEPOINT_TYPE_VISIBILITY
+
 /*
  * Stage 3 of the trace events.
  *
@@ -1004,7 +1024,7 @@ static void __event_probe__##_name(_data_proto)                                           \
 {                                                                                      \
        struct probe_local_vars { _locvar };                                            \
        struct lttng_kernel_event_common *__event = __data;                             \
-       struct lttng_probe_ctx __lttng_probe_ctx = {                                    \
+       struct lttng_kernel_probe_ctx __lttng_probe_ctx = {                             \
                .event = __event,                                                       \
                .interruptible = !irqs_disabled(),                                      \
        };                                                                              \
@@ -1024,8 +1044,8 @@ static void __event_probe__##_name(_data_proto)                                           \
                struct lttng_kernel_event_recorder *__event_recorder =                  \
                        container_of(__event, struct lttng_kernel_event_recorder, parent); \
                struct lttng_channel *__chan = __event_recorder->chan;                  \
-               struct lttng_session *__session = __chan->session;                      \
-               struct lttng_id_tracker_rcu *__lf;                                      \
+               struct lttng_kernel_session *__session = __chan->session;               \
+               struct lttng_kernel_id_tracker_rcu *__lf;                               \
                                                                                        \
                if (!_TP_SESSION_CHECK(session, __session))                             \
                        return;                                                         \
@@ -1068,20 +1088,11 @@ static void __event_probe__##_name(_data_proto)                                         \
        __dynamic_len_idx = __orig_dynamic_len_offset;                                  \
        _code_pre                                                                       \
        if (unlikely(READ_ONCE(__event->eval_filter))) {                                \
-               struct lttng_bytecode_runtime *bc_runtime;                              \
-               bool __filter_record = false;                                           \
-                                                                                       \
                __event_prepare_interpreter_stack__##_name(__stackvar.__interpreter_stack_data, \
                                _locvar_args);                                          \
                __interpreter_stack_prepared = true;                                    \
-               lttng_list_for_each_entry_rcu(bc_runtime, &__event->priv->filter_bytecode_runtime_head, node) { \
-                       if (unlikely(bc_runtime->interpreter_funcs.filter(bc_runtime, &__lttng_probe_ctx, \
-                                       __stackvar.__interpreter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) { \
-                               __filter_record = true;                                 \
-                               break;                                                  \
-                       }                                                               \
-               }                                                                       \
-               if (likely(!__filter_record))                                           \
+               if (likely(__event->run_filter(__event,                                 \
+                               __stackvar.__interpreter_stack_data, &__lttng_probe_ctx, NULL) != LTTNG_KERNEL_EVENT_FILTER_ACCEPT)) \
                        goto __post;                                                    \
        }                                                                               \
        switch (__event->type) {                                                        \
@@ -1090,7 +1101,7 @@ static void __event_probe__##_name(_data_proto)                                           \
                struct lttng_kernel_event_recorder *__event_recorder =                  \
                        container_of(__event, struct lttng_kernel_event_recorder, parent); \
                struct lttng_channel *__chan = __event_recorder->chan;                  \
-               struct lib_ring_buffer_ctx __ctx;                                       \
+               struct lttng_kernel_ring_buffer_ctx __ctx;                              \
                ssize_t __event_len;                                                    \
                size_t __event_align;                                                   \
                int __ret;                                                              \
@@ -1101,9 +1112,9 @@ static void __event_probe__##_name(_data_proto)                                           \
                        goto __post;                                                    \
                }                                                                       \
                __event_align = __event_get_align__##_name(_locvar_args);               \
-               lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event_len,             \
-                                        __event_align, -1, &__lttng_probe_ctx);        \
-               __ret = __chan->ops->event_reserve(&__ctx, __event_recorder->priv->id); \
+               lib_ring_buffer_ctx_init(&__ctx, __event_recorder, __event_len,         \
+                                        __event_align, &__lttng_probe_ctx);            \
+               __ret = __chan->ops->event_reserve(&__ctx);                             \
                if (__ret < 0)                                                          \
                        goto __post;                                                    \
                _fields                                                                 \
@@ -1153,7 +1164,21 @@ __post:                                                                                  \
 #undef __get_dynamic_len
 
 /*
- * Stage 7 of the trace events.
+ * Stage 7.0 of tracepoint event generation.
+ *
+ * Declare toplevel descriptor for the whole probe.
+ */
+
+#define TP_ID1(_token, _system)        _token##_system
+#define TP_ID(_token, _system) TP_ID1(_token, _system)
+
+static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM);
+
+#undef TP_ID1
+#undef TP_ID
+
+/*
+ * Stage 7.1 of the trace events.
  *
  * Create event descriptions.
  */
@@ -1171,6 +1196,7 @@ __post:                                                                                   \
 static const struct lttng_kernel_event_desc __event_desc___##_map = {  \
        .event_name = #_map,                                            \
        .event_kname = #_name,                                          \
+       .probe_desc = &TP_ID(__probe_desc___, TRACE_SYSTEM),            \
        .probe_callback = (void (*)(void)) TP_PROBE_CB(_template),      \
        .fields = __event_fields___##_template,                         \
        .nr_fields = ARRAY_SIZE(__event_fields___##_template),          \
@@ -1181,8 +1207,14 @@ static const struct lttng_kernel_event_desc __event_desc___##_map = {    \
 #define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
        LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map)
 
+#define TP_ID1(_token, _system)        _token##_system
+#define TP_ID(_token, _system) TP_ID1(_token, _system)
+
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
+#undef TP_ID1
+#undef TP_ID
+
 /*
  * Stage 8 of the trace events.
  *
@@ -1250,12 +1282,12 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM
 static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void)
 {
        wrapper_vmalloc_sync_mappings();
-       return lttng_probe_register(&TP_ID(__probe_desc___, TRACE_SYSTEM));
+       return lttng_kernel_probe_register(&TP_ID(__probe_desc___, TRACE_SYSTEM));
 }
 
 static void TP_ID(__lttng_events_exit__, TRACE_SYSTEM)(void)
 {
-       lttng_probe_unregister(&TP_ID(__probe_desc___, TRACE_SYSTEM));
+       lttng_kernel_probe_unregister(&TP_ID(__probe_desc___, TRACE_SYSTEM));
 }
 
 #ifndef TP_MODULE_NOAUTOLOAD
This page took 0.025771 seconds and 4 git commands to generate.