#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>
#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)
+/*
+ * Stage 1.3 of the trace events.
+ *
+ * Create probe callback prototypes.
+ */
+
+/* Reset all macros within TRACEPOINT_EVENT */
+#include <lttng/events-reset.h>
+
+#undef TP_PROTO
+#define TP_PROTO(...) __VA_ARGS__
+
+#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
+#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
+static void __event_probe__##_name(void *__data, _proto);
+
+#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
+#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
+static void __event_probe__##_name(void *__data);
+
+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+
+/*
+ * Stage 1.4 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 2 of the trace events.
*
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), \
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), \
#undef TP_FIELDS
#define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */
+#ifndef TP_PROBE_CB
+#define TP_PROBE_CB(_template) &__event_probe__##_template
+#endif
+
#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
static const struct lttng_kernel_event_field *__event_fields___##_name[] = { \
_fields \
+ }; \
+ static const struct lttng_kernel_tracepoint_class lttng_kernel__event_class___##_name = { \
+ .fields = __event_fields___##_name, \
+ .nr_fields = ARRAY_SIZE(__event_fields___##_name), \
+ .probe_callback = (void (*)(void)) TP_PROBE_CB(_name), \
+ .probe_desc = &TP_ID(__probe_desc___, TRACE_SYSTEM), \
};
#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
#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), \
- };
-
-#define LTTNG_CREATE_FIELD_METADATA
-#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-#undef LTTNG_CREATE_FIELD_METADATA
+#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
-/*
- * Stage 3 of the trace events.
- *
- * Create probe callback prototypes.
- */
+#ifdef LTTNG_TRACEPOINT_TYPE_VISIBILITY
+# undef LTTNG_TRACEPOINT_TYPE
+# define LTTNG_TRACEPOINT_TYPE(_prototype, _init) \
+ LTTNG_TRACEPOINT_TYPE_VISIBILITY _prototype = _init;
+#endif
-/* Reset all macros within TRACEPOINT_EVENT */
-#include <lttng/events-reset.h>
+# 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), \
+ .probe_desc = &TP_ID(__probe_desc___, TRACE_SYSTEM), \
+ }))
-#undef TP_PROTO
-#define TP_PROTO(...) __VA_ARGS__
+#define TP_ID1(_token, _system) _token##_system
+#define TP_ID(_token, _system) TP_ID1(_token, _system)
-#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
-#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
-static void __event_probe__##_name(void *__data, _proto);
+#define LTTNG_CREATE_FIELD_METADATA
+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+#undef LTTNG_CREATE_FIELD_METADATA
-#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
-#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
-static void __event_probe__##_name(void *__data);
+#undef LTTNG_TRACEPOINT_TYPE_VISIBILITY
-#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+#undef TP_ID1
+#undef TP_ID
/*
* Stage 4 of the trace events.
{ \
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(), \
}; \
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; \
__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) { \
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; \
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 \
#undef __get_dynamic_len
/*
- * Stage 7 of the trace events.
+ * Stage 7.1 of the trace events.
*
* Create event descriptions.
*/
#include <lttng/events-reset.h> /* Reset all macros within LTTNG_TRACEPOINT_EVENT */
-#ifndef TP_PROBE_CB
-#define TP_PROBE_CB(_template) &__event_probe__##_template
-#endif
-
#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
static const struct lttng_kernel_event_desc __event_desc___##_map = { \
.event_name = #_map, \
.event_kname = #_name, \
- .probe_callback = (void (*)(void)) TP_PROBE_CB(_template), \
- .fields = __event_fields___##_template, \
- .nr_fields = ARRAY_SIZE(__event_fields___##_template), \
+ .tp_class = <tng_kernel__event_class___##_template, \
+ .probe_desc = &TP_ID(__probe_desc___, TRACE_SYSTEM), \
.owner = THIS_MODULE, \
};
#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.
*
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