#include <linux/rculist.h>
#include <asm/byteorder.h>
#include <linux/swab.h>
+#include <linux/user_namespace.h>
#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
#include <ringbuffer/frontend_types.h>
#include <ringbuffer/backend.h>
#include <wrapper/rcu.h>
-#include <wrapper/user_namespace.h>
#include <lttng/types.h>
#include <lttng/probe-user.h>
#include <lttng/events.h>
#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, \
_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, \
_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)
#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__
#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
#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) */
/*
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)
_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) */
/*
_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)); \
{ \
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) */
{ \
struct probe_local_vars { _locvar }; \
struct lttng_kernel_event_common *__event = __data; \
+ struct lttng_kernel_channel_common *__chan_common; \
struct lttng_kernel_probe_ctx __lttng_probe_ctx = { \
.event = __event, \
.interruptible = !irqs_disabled(), \
&__tp_locvar; \
bool __interpreter_stack_prepared = false; \
\
- switch (__event->type) { \
- case LTTNG_KERNEL_EVENT_TYPE_RECORDER: \
- { \
- struct lttng_kernel_event_recorder *__event_recorder = \
- container_of(__event, struct lttng_kernel_event_recorder, parent); \
- struct lttng_kernel_channel_buffer *__chan = __event_recorder->chan; \
- struct lttng_kernel_session *__session = __chan->parent.session; \
+ if (unlikely(!READ_ONCE(__event->enabled))) \
+ return; \
+ __chan_common = lttng_kernel_get_chan_common_from_event_common(__event); \
+ if (__chan_common) { \
+ struct lttng_kernel_session *__session = __chan_common->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->parent.enabled))) \
+ if (unlikely(!LTTNG_READ_ONCE(__chan_common->enabled))) \
return; \
__lf = lttng_rcu_dereference(__session->pid_tracker.p); \
if (__lf && likely(!lttng_id_tracker_lookup(__lf, current->tgid))) \
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; \
- } \
- case LTTNG_KERNEL_EVENT_TYPE_NOTIFIER: \
- break; \
- default: \
- WARN_ON_ONCE(1); \
} \
- if (unlikely(!READ_ONCE(__event->enabled))) \
- return; \
__orig_dynamic_len_offset = this_cpu_ptr(<tng_dynamic_len_stack)->offset; \
__dynamic_len_idx = __orig_dynamic_len_offset; \
_code_pre \
&__notif_ctx); \
break; \
} \
+ case LTTNG_KERNEL_EVENT_TYPE_COUNTER: \
+ { \
+ struct lttng_kernel_event_counter *__event_counter = \
+ container_of(__event, struct lttng_kernel_event_counter, parent); \
+ struct lttng_kernel_event_counter_ctx __event_counter_ctx; \
+ \
+ __event_counter_ctx.args_available = LTTNG_READ_ONCE(__event_counter->use_args); \
+ if (unlikely(!__interpreter_stack_prepared && __event_counter_ctx.args_available)) \
+ __event_prepare_interpreter_stack__##_name( \
+ __stackvar.__interpreter_stack_data, \
+ _locvar_args); \
+ \
+ (void) __event_counter->chan->ops->counter_hit(__event_counter, \
+ __stackvar.__interpreter_stack_data, \
+ &__lttng_probe_ctx, \
+ &__event_counter_ctx); \
+ break; \
+ } \
default: \
WARN_ON_ONCE(1); \
} \
#define TP_ID1(_token, _system) _token##_system
#define TP_ID(_token, _system) TP_ID1(_token, _system)
-static const struct lttng_kernel_event_desc * const 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)
};
/* 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,