X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=probes%2Flttng-tracepoint-event-impl.h;h=3fe9d995cf310bbc9d15b794b92892dd475c9afd;hb=9f36eaed6f91d5897924b551b44d1edd8cee00e2;hp=42a4be30233c35d74bd56a64d25100a3a3faeb2c;hpb=114667d5aa4ec11334787e04a9f90fe9184fc16f;p=lttng-modules.git diff --git a/probes/lttng-tracepoint-event-impl.h b/probes/lttng-tracepoint-event-impl.h index 42a4be30..3fe9d995 100644 --- a/probes/lttng-tracepoint-event-impl.h +++ b/probes/lttng-tracepoint-event-impl.h @@ -1,22 +1,9 @@ -/* +/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1) + * * lttng-tracepoint-event-impl.h * * Copyright (C) 2009 Steven Rostedt * Copyright (C) 2009-2014 Mathieu Desnoyers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; only - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -34,6 +21,9 @@ #include #include #include +#include + +#define __LTTNG_NULL_STRING "(null)" /* * Macro declarations used for all stages. @@ -179,6 +169,77 @@ void __event_template_proto___##_name(void); #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) +/* + * Stage 1.2 of tracepoint event generation + * + * Unfolding the enums + */ +#include /* Reset all macros within TRACE_EVENT */ + +/* Enumeration entry (single value) */ +#undef ctf_enum_value +#define ctf_enum_value(_string, _value) \ + { \ + .start = { \ + .signedness = lttng_is_signed_type(__typeof__(_value)), \ + .value = lttng_is_signed_type(__typeof__(_value)) ? \ + (long long) (_value) : (_value), \ + }, \ + .end = { \ + .signedness = lttng_is_signed_type(__typeof__(_value)), \ + .value = lttng_is_signed_type(__typeof__(_value)) ? \ + (long long) (_value) : (_value), \ + }, \ + .string = (_string), \ + }, + +/* Enumeration entry (range) */ +#undef ctf_enum_range +#define ctf_enum_range(_string, _range_start, _range_end) \ + { \ + .start = { \ + .signedness = lttng_is_signed_type(__typeof__(_range_start)), \ + .value = lttng_is_signed_type(__typeof__(_range_start)) ? \ + (long long) (_range_start) : (_range_start), \ + }, \ + .end = { \ + .signedness = lttng_is_signed_type(__typeof__(_range_end)), \ + .value = lttng_is_signed_type(__typeof__(_range_end)) ? \ + (long long) (_range_end) : (_range_end), \ + }, \ + .string = (_string), \ + }, + +/* Enumeration entry (automatic value; follows the rules of CTF) */ +#undef ctf_enum_auto +#define ctf_enum_auto(_string) \ + { \ + .start = { \ + .signedness = -1, \ + .value = -1, \ + }, \ + .end = { \ + .signedness = -1, \ + .value = -1, \ + }, \ + .string = (_string), \ + .options = { \ + .is_auto = 1, \ + } \ + }, + +#undef TP_ENUM_VALUES +#define TP_ENUM_VALUES(...) \ + __VA_ARGS__ + +#undef LTTNG_TRACEPOINT_ENUM +#define LTTNG_TRACEPOINT_ENUM(_name, _values) \ + const struct lttng_enum_entry __enum_values__##_name[] = { \ + _values \ + }; + +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + /* * Stage 2 of the trace events. * @@ -201,7 +262,7 @@ void __event_template_proto___##_name(void); }, #undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _user, _nowrite) \ +#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \ { \ .name = #_item, \ .type = \ @@ -211,7 +272,7 @@ void __event_template_proto___##_name(void); { \ .array = \ { \ - .elem_type = __type_integer(_type, 0, 0, 0, __BYTE_ORDER, 10, _encoding), \ + .elem_type = __type_integer(_type, 0, 0, 0, _byte_order, _base, _encoding), \ .length = _length, \ } \ } \ @@ -226,7 +287,7 @@ void __event_template_proto___##_name(void); .name = #_item, \ .type = \ { \ - .atype = atype_array, \ + .atype = atype_array_bitfield, \ .u = \ { \ .array = \ @@ -272,7 +333,7 @@ void __event_template_proto___##_name(void); .name = #_item, \ .type = \ { \ - .atype = atype_sequence, \ + .atype = atype_sequence_bitfield, \ .u = \ { \ .sequence = \ @@ -303,6 +364,44 @@ void __event_template_proto___##_name(void); .user = _user, \ }, +#undef _ctf_enum +#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ + { \ + .name = #_item, \ + .type = { \ + .atype = atype_enum, \ + .u = { \ + .basic = { \ + .enumeration = { \ + .desc = &__enum_##_name, \ + .container_type = { \ + .size = sizeof(_type) * CHAR_BIT, \ + .alignment = lttng_alignof(_type) * CHAR_BIT, \ + .signedness = lttng_is_signed_type(_type), \ + .reverse_byte_order = 0, \ + .base = 10, \ + .encoding = lttng_encode_none, \ + }, \ + }, \ + }, \ + }, \ + }, \ + .nowrite = _nowrite, \ + .user = _user, \ + }, + +#undef ctf_custom_field +#define ctf_custom_field(_type, _item, _code) \ + { \ + .name = #_item, \ + .type = { _type }, \ + .nowrite = 0, \ + .user = 0, \ + }, + +#undef ctf_custom_type +#define ctf_custom_type(...) __VA_ARGS__ + #undef TP_FIELDS #define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ @@ -316,6 +415,14 @@ 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_enum_desc __enum_##_name = { \ + .name = #_name, \ + .entries = __enum_values__##_name, \ + .nr_entries = ARRAY_SIZE(__enum_values__##_name), \ + }; + #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) /* @@ -356,13 +463,13 @@ static void __event_probe__##_name(void *__data); __event_len += sizeof(_type); #undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _user, _nowrite) \ +#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \ __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ __event_len += sizeof(_type) * (_length); #undef _ctf_array_bitfield #define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \ - _ctf_array_encoded(_type, _item, _src, _length, none, _user, _nowrite) + _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite) #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ @@ -401,9 +508,26 @@ static void __event_probe__##_name(void *__data); max_t(size_t, lttng_strlen_user_inatomic(_src), 1); \ } else { \ __event_len += this_cpu_ptr(<tng_dynamic_len_stack)->stack[this_cpu_ptr(<tng_dynamic_len_stack)->offset - 1] = \ - strlen(_src) + 1; \ + strlen((_src) ? (_src) : __LTTNG_NULL_STRING) + 1; \ } +#undef _ctf_enum +#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite) + +#undef ctf_align +#define ctf_align(_type) \ + __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); + +#undef ctf_custom_field +#define ctf_custom_field(_type, _item, _code) \ + { \ + _code \ + } + +#undef ctf_custom_code +#define ctf_custom_code(...) __VA_ARGS__ + #undef TP_PROTO #define TP_PROTO(...) __VA_ARGS__ @@ -561,7 +685,7 @@ error: \ _ctf_integer_ext_isuser##_user(_type, _item, _user_src, _byte_order, _base, _nowrite) #undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _user, _nowrite) \ +#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \ { \ unsigned long __ctf_tmp_ulong = (unsigned long) (_length); \ const void *__ctf_tmp_ptr = (_src); \ @@ -573,7 +697,7 @@ error: \ #undef _ctf_array_bitfield #define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \ - _ctf_array_encoded(_type, _item, _src, _length, none, _user, _nowrite) + _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite) #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ @@ -597,11 +721,16 @@ error: \ #undef _ctf_string #define _ctf_string(_item, _src, _user, _nowrite) \ { \ - const void *__ctf_tmp_ptr = (_src); \ + const void *__ctf_tmp_ptr = \ + ((_src) ? (_src) : __LTTNG_NULL_STRING); \ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \ __stack_data += sizeof(void *); \ } +#undef _ctf_enum +#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite) + #undef TP_PROTO #define TP_PROTO(...) __VA_ARGS__ @@ -650,12 +779,12 @@ void __event_prepare_filter_stack__##_name(char *__stack_data, \ __event_align = max_t(size_t, __event_align, lttng_alignof(_type)); #undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _user, _nowrite) \ +#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \ __event_align = max_t(size_t, __event_align, lttng_alignof(_type)); #undef _ctf_array_bitfield #define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \ - _ctf_array_encoded(_type, _item, _src, _length, none, _user, _nowrite) + _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite) #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ @@ -673,6 +802,14 @@ void __event_prepare_filter_stack__##_name(char *__stack_data, \ #undef _ctf_string #define _ctf_string(_item, _src, _user, _nowrite) +#undef _ctf_enum +#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite) + +#undef ctf_align +#define ctf_align(_type) \ + __event_align = max_t(size_t, __event_align, lttng_alignof(_type)); + #undef TP_PROTO #define TP_PROTO(...) __VA_ARGS__ @@ -682,6 +819,15 @@ void __event_prepare_filter_stack__##_name(char *__stack_data, \ #undef TP_locvar #define TP_locvar(...) __VA_ARGS__ +#undef ctf_custom_field +#define ctf_custom_field(_type, _item, _code) _code + +#undef ctf_custom_code +#define ctf_custom_code(...) \ + { \ + __VA_ARGS__ \ + } + #undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE #define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \ static inline size_t __event_get_align__##_name(void *__tp_locvar, _proto) \ @@ -747,7 +893,7 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar) \ _ctf_integer_ext_isuser##_user(_type, _item, _user_src, _byte_order, _base, _nowrite) #undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _user, _nowrite) \ +#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)); \ @@ -887,15 +1033,36 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar) \ #undef _ctf_string #define _ctf_string(_item, _src, _user, _nowrite) \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \ if (_user) { \ + lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \ __chan->ops->event_strcpy_from_user(&__ctx, _src, \ __get_dynamic_len(dest)); \ } else { \ - __chan->ops->event_strcpy(&__ctx, _src, \ + const char *__ctf_tmp_string = \ + ((_src) ? (_src) : __LTTNG_NULL_STRING); \ + lib_ring_buffer_align_ctx(&__ctx, \ + lttng_alignof(*__ctf_tmp_string)); \ + __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \ __get_dynamic_len(dest)); \ } +#undef _ctf_enum +#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite) + +#undef ctf_align +#define ctf_align(_type) \ + lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); + +#undef ctf_custom_field +#define ctf_custom_field(_type, _item, _code) _code + +#undef ctf_custom_code +#define ctf_custom_code(...) \ + { \ + __VA_ARGS__ \ + } + /* Beware: this get len actually consumes the len value */ #undef __get_dynamic_len #define __get_dynamic_len(field) this_cpu_ptr(<tng_dynamic_len_stack)->stack[__dynamic_len_idx++] @@ -951,7 +1118,7 @@ static void __event_probe__##_name(void *__data, _proto) \ struct lib_ring_buffer_ctx __ctx; \ ssize_t __event_len; \ size_t __event_align; \ - size_t __orig_dynamic_len_offset, __dynamic_len_idx; \ + size_t __orig_dynamic_len_offset, __dynamic_len_idx __attribute__((unused)); \ union { \ size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \ char __filter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \ @@ -964,14 +1131,14 @@ static void __event_probe__##_name(void *__data, _proto) \ \ if (!_TP_SESSION_CHECK(session, __session)) \ return; \ - if (unlikely(!ACCESS_ONCE(__session->active))) \ + if (unlikely(!READ_ONCE(__session->active))) \ return; \ - if (unlikely(!ACCESS_ONCE(__chan->enabled))) \ + if (unlikely(!READ_ONCE(__chan->enabled))) \ return; \ - if (unlikely(!ACCESS_ONCE(__event->enabled))) \ + if (unlikely(!READ_ONCE(__event->enabled))) \ return; \ __lpf = lttng_rcu_dereference(__session->pid_tracker); \ - if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->pid))) \ + if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->tgid))) \ return; \ __orig_dynamic_len_offset = this_cpu_ptr(<tng_dynamic_len_stack)->offset; \ __dynamic_len_idx = __orig_dynamic_len_offset; \ @@ -1025,7 +1192,7 @@ static void __event_probe__##_name(void *__data) \ struct lib_ring_buffer_ctx __ctx; \ ssize_t __event_len; \ size_t __event_align; \ - size_t __orig_dynamic_len_offset, __dynamic_len_idx; \ + size_t __orig_dynamic_len_offset, __dynamic_len_idx __attribute__((unused)); \ union { \ size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \ char __filter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \ @@ -1038,14 +1205,14 @@ static void __event_probe__##_name(void *__data) \ \ if (!_TP_SESSION_CHECK(session, __session)) \ return; \ - if (unlikely(!ACCESS_ONCE(__session->active))) \ + if (unlikely(!READ_ONCE(__session->active))) \ return; \ - if (unlikely(!ACCESS_ONCE(__chan->enabled))) \ + if (unlikely(!READ_ONCE(__chan->enabled))) \ return; \ - if (unlikely(!ACCESS_ONCE(__event->enabled))) \ + if (unlikely(!READ_ONCE(__event->enabled))) \ return; \ __lpf = lttng_rcu_dereference(__session->pid_tracker); \ - if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->pid))) \ + if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->tgid))) \ return; \ __orig_dynamic_len_offset = this_cpu_ptr(<tng_dynamic_len_stack)->offset; \ __dynamic_len_idx = __orig_dynamic_len_offset; \