X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=include%2Flttng%2Ftracepoint-event-impl.h;h=88a2bccccb21b4f6fab9d06a86184503a3fe1b5d;hb=b03cf820f4aea4e37df6603ddd499c96e23d66fc;hp=35b0059b1739ef11968de2b0adc093d632a9a287;hpb=6c8c025bf7552b6073c5c1884e1493badd842f42;p=lttng-modules.git diff --git a/include/lttng/tracepoint-event-impl.h b/include/lttng/tracepoint-event-impl.h index 35b0059b..88a2bccc 100644 --- a/include/lttng/tracepoint-event-impl.h +++ b/include/lttng/tracepoint-event-impl.h @@ -11,12 +11,12 @@ #include #include #include +#include #include /* for wrapper_vmalloc_sync_mappings() */ #include #include #include -#include #include #include #include @@ -201,7 +201,7 @@ void __event_template_proto___##_name(void); #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[] = { \ + static const struct lttng_kernel_enum_entry * const __enum_values__##_name[] = { \ _values \ }; #endif @@ -259,27 +259,27 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM #undef _ctf_integer_ext #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _user, _nowrite) \ lttng_kernel_static_event_field(#_item, \ - lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base), \ - _nowrite, _user, 0), + _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base), \ + _nowrite, 0), #undef _ctf_array_encoded #define _ctf_array_encoded(_type, _item, _src, _length, \ _encoding, _byte_order, _elem_type_base, _user, _nowrite) \ lttng_kernel_static_event_field(#_item, \ lttng_kernel_static_type_array(_length, \ - lttng_kernel_static_type_integer_from_type(_type, _byte_order, _elem_type_base), \ + _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _elem_type_base), \ 0, \ _encoding), \ - _nowrite, _user, 0), + _nowrite, 0), #undef _ctf_array_bitfield #define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \ lttng_kernel_static_event_field(#_item, \ lttng_kernel_static_type_array((_length) * sizeof(_type) * CHAR_BIT, \ - lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10), \ + _lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, _user, 10), \ lttng_alignof(_type), \ none), \ - _nowrite, _user, 0), + _nowrite, 0), #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, \ @@ -287,13 +287,13 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM _byte_order, _elem_type_base, _user, _nowrite) \ lttng_kernel_static_event_field("_" #_item "_length", \ lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \ - _nowrite, 0, 1), \ + _nowrite, 1), \ lttng_kernel_static_event_field(#_item, \ lttng_kernel_static_type_sequence(NULL, /* Use previous field. */ \ - lttng_kernel_static_type_integer_from_type(_type, _byte_order, _elem_type_base), \ + _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _elem_type_base), \ 0, \ _encoding), \ - _nowrite, _user, 0), + _nowrite, 0), #undef _ctf_sequence_bitfield #define _ctf_sequence_bitfield(_type, _item, _src, \ @@ -301,19 +301,19 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM _user, _nowrite) \ lttng_kernel_static_event_field("_" #_item "_length", \ lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \ - _nowrite, 0, 1), \ + _nowrite, 1), \ lttng_kernel_static_event_field(#_item, \ lttng_kernel_static_type_sequence(NULL, /* Use previous field. */ \ - lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10), \ + _lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, _user, 10), \ lttng_alignof(_type), \ none), \ - _nowrite, _user, 0), + _nowrite, 0), #undef _ctf_string #define _ctf_string(_item, _src, _user, _nowrite) \ lttng_kernel_static_event_field(#_item, \ - lttng_kernel_static_type_string(UTF8), \ - _nowrite, _user, 0), + lttng_kernel_static_type_string(UTF8, _user), \ + _nowrite, 0), #undef _ctf_unused #define _ctf_unused(_src) @@ -322,12 +322,12 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM #define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ lttng_kernel_static_event_field(#_item, \ lttng_kernel_static_type_enum(&__enum_##_name, \ - lttng_kernel_static_type_integer_from_type(_type, __BYTE_ORDER, 10)), \ - _nowrite, _user, 0), + _lttng_kernel_static_type_integer_from_type(_type, __BYTE_ORDER, _user, 10)), \ + _nowrite, 0), #undef ctf_custom_field #define ctf_custom_field(_type, _item, _code) \ - lttng_kernel_static_event_field(#_item, PARAMS(_type), 0, 0, 1), + lttng_kernel_static_event_field(#_item, PARAMS(_type), 0, 1), #undef ctf_custom_type #define ctf_custom_type(...) __VA_ARGS__ @@ -341,7 +341,7 @@ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM #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 = { \ @@ -813,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 @@ -840,21 +839,27 @@ 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)); \ - } else { \ - __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); \ + if (lttng_kernel_string_encoding_##_encoding == lttng_kernel_string_encoding_none) { \ + if (_user) { \ + __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \ + } else { \ + __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length), lttng_alignof(_type)); \ + } \ + } else { \ + if (_user) { \ + __chan->ops->event_pstrcpy_pad_from_user(&__ctx, (const char __user *) (_src), _length); \ + } else { \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), _length); \ + } \ } #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) */ /* @@ -890,26 +895,34 @@ 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) */ #undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ +#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ _src_length, _encoding, _byte_order, _base, _user, _nowrite) \ - { \ + { \ _length_type __tmpl = this_cpu_ptr(<tng_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));\ - } \ - 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)); \ - } else { \ - __chan->ops->event_write(&__ctx, _src, \ - sizeof(_type) * __get_dynamic_len(dest)); \ + __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type), lttng_alignof(_length_type));\ + } \ + if (lttng_kernel_string_encoding_##_encoding == lttng_kernel_string_encoding_none) { \ + if (_user) { \ + __chan->ops->event_write_from_user(&__ctx, _src, \ + sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \ + } else { \ + __chan->ops->event_write(&__ctx, _src, \ + sizeof(_type) * __get_dynamic_len(dest), lttng_alignof(_type)); \ + } \ + } else { \ + if (_user) { \ + __chan->ops->event_pstrcpy_pad_from_user(&__ctx, (const char __user *) (_src), \ + __get_dynamic_len(dest)); \ + } else { \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), \ + __get_dynamic_len(dest)); \ + } \ } #if (__BYTE_ORDER == __LITTLE_ENDIAN) @@ -919,16 +932,14 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar) \ _user, _nowrite) \ { \ _length_type __tmpl = this_cpu_ptr(<tng_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) */ /* @@ -940,8 +951,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar) \ _user, _nowrite) \ { \ _length_type __tmpl = this_cpu_ptr(<tng_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)); \ { \ @@ -972,7 +982,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) */ @@ -1074,15 +1084,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_kernel_session *__session = __chan->session; \ + 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))) \ @@ -1092,19 +1102,19 @@ static void __event_probe__##_name(_data_proto) \ return; \ __lf = lttng_rcu_dereference(__session->uid_tracker.p); \ if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ - lttng_current_uid()))) \ + from_kuid_munged(&init_user_ns, current_uid())))) \ return; \ __lf = lttng_rcu_dereference(__session->vuid_tracker.p); \ if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ - lttng_current_vuid()))) \ + from_kuid_munged(current_user_ns(), current_uid())))) \ return; \ __lf = lttng_rcu_dereference(__session->gid_tracker.p); \ if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ - lttng_current_gid()))) \ + from_kgid_munged(&init_user_ns, current_gid())))) \ return; \ __lf = lttng_rcu_dereference(__session->vgid_tracker.p); \ if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ - lttng_current_vgid()))) \ + from_kgid_munged(current_user_ns(), current_gid())))) \ return; \ break; \ } \ @@ -1131,7 +1141,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; \ @@ -1139,7 +1149,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); \ @@ -1245,7 +1255,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(__provider_event_desc___, TRACE_SYSTEM)[] = { #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) }; @@ -1264,8 +1274,8 @@ static const struct lttng_kernel_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM /* non-const because list head will be modified when registered. */ static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { .provider_name = __stringify(TRACE_SYSTEM), - .event_desc = TP_ID(__event_desc___, TRACE_SYSTEM), - .nr_events = ARRAY_SIZE(TP_ID(__event_desc___, TRACE_SYSTEM)), + .event_desc = TP_ID(__provider_event_desc___, TRACE_SYSTEM), + .nr_events = ARRAY_SIZE(TP_ID(__provider_event_desc___, TRACE_SYSTEM)), .head = { NULL, NULL }, .lazy_init_head = { NULL, NULL }, .lazy = 0,