Move alignment into event write callback
[lttng-modules.git] / include / lttng / tracepoint-event-impl.h
index b75a791ea4e3e88e17921c83fab2ffbb08adf49d..e3a858a397c5d49a8dfde63e97f5d61cf8e9b764 100644 (file)
@@ -198,14 +198,52 @@ void __event_template_proto___##_name(void);
 #define TP_ENUM_VALUES(...)                                            \
        __VA_ARGS__
 
-#undef LTTNG_TRACEPOINT_ENUM
-#define LTTNG_TRACEPOINT_ENUM(_name, _values)                          \
-       static const struct lttng_kernel_enum_entry *__enum_values__##_name[] = { \
+#ifndef LTTNG_TRACEPOINT_TYPE_EXTERN
+# undef LTTNG_TRACEPOINT_ENUM
+# define LTTNG_TRACEPOINT_ENUM(_name, _values)                         \
+       static const struct lttng_kernel_enum_entry * const __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.
  *
@@ -297,49 +335,63 @@ void __event_template_proto___##_name(void);
 #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[] = { \
+       static const struct lttng_kernel_event_field * const __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.
@@ -761,8 +813,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)        \
 #define _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite) \
        {                                                               \
                _type __tmp = _src;                                     \
-               lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp));\
-               __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\
+               __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp), lttng_alignof(__tmp)); \
        }
 
 #undef _ctf_integer_ext_isuser0
@@ -788,21 +839,19 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)              \
 
 #undef _ctf_array_encoded
 #define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));        \
        if (_user) {                                                    \
-               __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length)); \
+               __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \
        } else {                                                        \
-               __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); \
+               __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \
        }
 
 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
 #undef _ctf_array_bitfield
 #define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));        \
        if (_user) {                                                    \
-               __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length)); \
+               __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \
        } else {                                                        \
-               __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); \
+               __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \
        }
 #else /* #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
 /*
@@ -838,7 +887,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)        \
                        default:                                        \
                                BUG_ON(1);                              \
                        }                                               \
-                       __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type)); \
+                       __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type), 1); \
                }                                                       \
        }
 #endif /* #else #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
@@ -848,16 +897,14 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)              \
                        _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
        {                                                               \
                _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx]; \
-               lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
-               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
+               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type), lttng_alignof(_length_type));\
        }                                                               \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));        \
        if (_user) {                                                    \
                __chan->ops->event_write_from_user(&__ctx, _src,        \
-                       sizeof(_type) * __get_dynamic_len(dest));       \
+                       sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \
        } else {                                                        \
                __chan->ops->event_write(&__ctx, _src,                  \
-                       sizeof(_type) * __get_dynamic_len(dest));       \
+                       sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \
        }
 
 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
@@ -867,16 +914,14 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)              \
                        _user, _nowrite)                        \
        {                                                               \
                _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx] * sizeof(_type) * CHAR_BIT; \
-               lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
-               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
+               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type), lttng_alignof(_length_type)); \
        }                                                               \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));        \
        if (_user) {                                                    \
                __chan->ops->event_write_from_user(&__ctx, _src,        \
-                       sizeof(_type) * __get_dynamic_len(dest));       \
+                       sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \
        } else {                                                        \
                __chan->ops->event_write(&__ctx, _src,                  \
-                       sizeof(_type) * __get_dynamic_len(dest));       \
+                       sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \
        }
 #else /* #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
 /*
@@ -888,8 +933,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)        \
                        _user, _nowrite)                        \
        {                                                       \
                _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx] * sizeof(_type) * CHAR_BIT; \
-               lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
-               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
+               __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type), lttng_alignof(_length_type)); \
        }                                                               \
        lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));        \
        {                                                               \
@@ -920,7 +964,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)        \
                        default:                                        \
                                BUG_ON(1);                              \
                        }                                               \
-                       __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type)); \
+                       __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type), 1); \
                }                                                       \
        }
 #endif /* #else #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
@@ -1022,15 +1066,15 @@ 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_channel_buffer *__chan = __event_recorder->chan;    \
+               struct lttng_kernel_session *__session = __chan->parent.session;        \
+               struct lttng_kernel_id_tracker_rcu *__lf;                               \
                                                                                        \
                if (!_TP_SESSION_CHECK(session, __session))                             \
                        return;                                                         \
                if (unlikely(!LTTNG_READ_ONCE(__session->active)))                      \
                        return;                                                         \
-               if (unlikely(!LTTNG_READ_ONCE(__chan->enabled)))                        \
+               if (unlikely(!LTTNG_READ_ONCE(__chan->parent.enabled)))                 \
                        return;                                                         \
                __lf = lttng_rcu_dereference(__session->pid_tracker.p);                 \
                if (__lf && likely(!lttng_id_tracker_lookup(__lf, current->tgid)))      \
@@ -1079,7 +1123,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 lttng_kernel_channel_buffer *__chan = __event_recorder->chan;    \
                struct lttng_kernel_ring_buffer_ctx __ctx;                              \
                ssize_t __event_len;                                                    \
                size_t __event_align;                                                   \
@@ -1087,7 +1131,7 @@ static void __event_probe__##_name(_data_proto)                                           \
                                                                                        \
                __event_len = __event_get_size__##_name(_locvar_args);                  \
                if (unlikely(__event_len < 0)) {                                        \
-                       lib_ring_buffer_lost_event_too_big(__chan->chan);               \
+                       __chan->ops->lost_event_too_big(__chan);                        \
                        goto __post;                                                    \
                }                                                                       \
                __event_align = __event_get_align__##_name(_locvar_args);               \
@@ -1143,7 +1187,7 @@ __post:                                                                                   \
 #undef __get_dynamic_len
 
 /*
- * Stage 7 of the trace events.
+ * Stage 7.1 of the trace events.
  *
  * Create event descriptions.
  */
@@ -1152,18 +1196,13 @@ __post:                                                                                 \
 
 #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 = &lttng_kernel__event_class___##_template,           \
+       .probe_desc = &TP_ID(__probe_desc___, TRACE_SYSTEM),            \
        .owner = THIS_MODULE,                                           \
 };
 
@@ -1171,8 +1210,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.
  *
@@ -1192,7 +1237,7 @@ static const struct lttng_kernel_event_desc __event_desc___##_map = {     \
 #define TP_ID1(_token, _system)        _token##_system
 #define TP_ID(_token, _system) TP_ID1(_token, _system)
 
-static const struct lttng_kernel_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM)[] = {
+static const struct lttng_kernel_event_desc * const TP_ID(__event_desc___, TRACE_SYSTEM)[] = {
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 };
 
This page took 0.027952 seconds and 4 git commands to generate.