X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=probes%2Flttng-tracepoint-event-impl.h;h=b40fbd8107a2f0d38f437dff5fd465ce08df4b53;hb=c89271d467715e782b76a87c8e26859ec04d9aff;hp=0fee61aea756b677ca99d12be76328316b3f7f58;hpb=3834b99f4341209754c4955ec853dc250b33ed4b;p=lttng-modules.git diff --git a/probes/lttng-tracepoint-event-impl.h b/probes/lttng-tracepoint-event-impl.h index 0fee61ae..b40fbd81 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 @@ -28,10 +15,11 @@ #include #include #include -#include /* for wrapper_vmalloc_sync_all() */ +#include /* for wrapper_vmalloc_sync_mappings() */ #include #include #include +#include #include #include #include @@ -269,9 +257,8 @@ void __event_template_proto___##_name(void); #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _user, _nowrite) \ { \ .name = #_item, \ - .type = __type_integer(_type, 0, 0, -1, _byte_order, _base, none),\ + .type = __type_integer(_type, 0, 0, -1, _byte_order, _user, _base, none),\ .nowrite = _nowrite, \ - .user = _user, \ }, #undef _ctf_array_encoded @@ -285,13 +272,12 @@ void __event_template_proto___##_name(void); { \ .array = \ { \ - .elem_type = __type_integer(_type, 0, 0, 0, _byte_order, _base, _encoding), \ + .elem_type = __type_integer(_type, 0, 0, 0, _byte_order, _user, _base, _encoding), \ .length = _length, \ } \ } \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, #undef _ctf_array_bitfield @@ -305,14 +291,13 @@ void __event_template_proto___##_name(void); { \ .array = \ { \ - .elem_type = __type_integer(_type, 1, 1, 0, __LITTLE_ENDIAN, 10, none), \ + .elem_type = __type_integer(_type, 1, 1, 0, __LITTLE_ENDIAN, _user, 10, none), \ .length = (_length) * sizeof(_type) * CHAR_BIT, \ .elem_alignment = lttng_alignof(_type), \ } \ } \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, @@ -329,13 +314,12 @@ void __event_template_proto___##_name(void); { \ .sequence = \ { \ - .length_type = __type_integer(_length_type, 0, 0, 0, __BYTE_ORDER, 10, none), \ - .elem_type = __type_integer(_type, 0, 0, -1, _byte_order, _base, _encoding), \ + .length_type = __type_integer(_length_type, 0, 0, 0, __BYTE_ORDER, 0, 10, none), \ + .elem_type = __type_integer(_type, 0, 0, -1, _byte_order, _user, _base, _encoding), \ }, \ }, \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, #undef _ctf_sequence_bitfield @@ -351,14 +335,13 @@ void __event_template_proto___##_name(void); { \ .sequence = \ { \ - .length_type = __type_integer(_length_type, 0, 0, 0, __BYTE_ORDER, 10, none), \ - .elem_type = __type_integer(_type, 1, 1, 0, __LITTLE_ENDIAN, 10, none), \ + .length_type = __type_integer(_length_type, 0, 0, 0, __BYTE_ORDER, 0, 10, none), \ + .elem_type = __type_integer(_type, 1, 1, 0, __LITTLE_ENDIAN, _user, 10, none), \ .elem_alignment = lttng_alignof(_type), \ }, \ }, \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, #undef _ctf_string @@ -370,11 +353,10 @@ void __event_template_proto___##_name(void); .atype = atype_string, \ .u = \ { \ - .basic = { .string = { .encoding = lttng_encode_UTF8 } } \ + .basic = { .string = { .encoding = lttng_encode_UTF8, .user = (_user), } } \ }, \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, #undef _ctf_enum @@ -392,6 +374,7 @@ void __event_template_proto___##_name(void); .alignment = lttng_alignof(_type) * CHAR_BIT, \ .signedness = lttng_is_signed_type(_type), \ .reverse_byte_order = 0, \ + .user = (_user), \ .base = 10, \ .encoding = lttng_encode_none, \ }, \ @@ -400,7 +383,6 @@ void __event_template_proto___##_name(void); }, \ }, \ .nowrite = _nowrite, \ - .user = _user, \ }, #undef ctf_custom_field @@ -409,7 +391,6 @@ void __event_template_proto___##_name(void); .name = #_item, \ .type = { _type }, \ .nowrite = 0, \ - .user = 0, \ }, #undef ctf_custom_type @@ -1140,18 +1121,37 @@ static void __event_probe__##_name(void *__data, _proto) \ struct probe_local_vars __tp_locvar; \ struct probe_local_vars *tp_locvar __attribute__((unused)) = \ &__tp_locvar; \ - struct lttng_pid_tracker *__lpf; \ + struct lttng_id_tracker_rcu *__lf; \ \ if (!_TP_SESSION_CHECK(session, __session)) \ return; \ - if (unlikely(!READ_ONCE(__session->active))) \ + if (unlikely(!LTTNG_READ_ONCE(__session->active))) \ + return; \ + if (unlikely(!LTTNG_READ_ONCE(__chan->enabled))) \ + return; \ + if (unlikely(!LTTNG_READ_ONCE(__event->enabled))) \ + return; \ + __lf = lttng_rcu_dereference(__session->pid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, current->tgid))) \ return; \ - if (unlikely(!READ_ONCE(__chan->enabled))) \ + __lf = lttng_rcu_dereference(__session->vpid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, task_tgid_vnr(current)))) \ return; \ - if (unlikely(!READ_ONCE(__event->enabled))) \ + __lf = lttng_rcu_dereference(__session->uid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_uid()))) \ return; \ - __lpf = lttng_rcu_dereference(__session->pid_tracker); \ - if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->tgid))) \ + __lf = lttng_rcu_dereference(__session->vuid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_vuid()))) \ + return; \ + __lf = lttng_rcu_dereference(__session->gid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_gid()))) \ + return; \ + __lf = lttng_rcu_dereference(__session->vgid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_vgid()))) \ return; \ __orig_dynamic_len_offset = this_cpu_ptr(<tng_dynamic_len_stack)->offset; \ __dynamic_len_idx = __orig_dynamic_len_offset; \ @@ -1214,18 +1214,37 @@ static void __event_probe__##_name(void *__data) \ struct probe_local_vars __tp_locvar; \ struct probe_local_vars *tp_locvar __attribute__((unused)) = \ &__tp_locvar; \ - struct lttng_pid_tracker *__lpf; \ + struct lttng_id_tracker_rcu *__lf; \ \ if (!_TP_SESSION_CHECK(session, __session)) \ return; \ - if (unlikely(!READ_ONCE(__session->active))) \ + if (unlikely(!LTTNG_READ_ONCE(__session->active))) \ + return; \ + if (unlikely(!LTTNG_READ_ONCE(__chan->enabled))) \ + return; \ + if (unlikely(!LTTNG_READ_ONCE(__event->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->vpid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, task_tgid_vnr(current)))) \ + return; \ + __lf = lttng_rcu_dereference(__session->uid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_uid()))) \ return; \ - if (unlikely(!READ_ONCE(__chan->enabled))) \ + __lf = lttng_rcu_dereference(__session->vuid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_vuid()))) \ return; \ - if (unlikely(!READ_ONCE(__event->enabled))) \ + __lf = lttng_rcu_dereference(__session->gid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_gid()))) \ return; \ - __lpf = lttng_rcu_dereference(__session->pid_tracker); \ - if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->tgid))) \ + __lf = lttng_rcu_dereference(__session->vgid_tracker.p); \ + if (__lf && likely(!lttng_id_tracker_lookup(__lf, \ + lttng_current_vgid()))) \ return; \ __orig_dynamic_len_offset = this_cpu_ptr(<tng_dynamic_len_stack)->offset; \ __dynamic_len_idx = __orig_dynamic_len_offset; \ @@ -1318,7 +1337,7 @@ static const struct lttng_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_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM)[] = { +static const struct lttng_event_desc *TP_ID(__provider_event_desc___, TRACE_SYSTEM)[] = { #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) }; @@ -1337,8 +1356,8 @@ static const struct lttng_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM)[] = { /* non-const because list head will be modified when registered. */ static __used struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { .provider = __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, @@ -1365,7 +1384,7 @@ static __used struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { #ifndef TP_MODULE_NOINIT static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void) { - wrapper_vmalloc_sync_all(); + wrapper_vmalloc_sync_mappings(); return lttng_probe_register(&TP_ID(__probe_desc___, TRACE_SYSTEM)); }