Add macros to allow to specify some raw metadata for a tracepoint event field. Add macros to copy dynamic length data without the length field with it, for instance for variant event types.
Signed-off-by: Geneviève Bastien <[email protected]> --- lttng-events.c | 7 +++++++ lttng-events.h | 4 ++++ probes/lttng-events-reset.h | 6 ++++++ probes/lttng-events.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/lttng-events.c b/lttng-events.c index 4f30904..8ceecf5 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -654,6 +654,13 @@ int _lttng_field_statedump(struct lttng_session *session, " { encoding = ASCII; }" : "", field->name); break; + case atype_raw: + /* field contains raw metadata! No guarantee it is valid */ + ret = lttng_metadata_printf(session, + " %s _%s;\n", + field->type.u.raw.raw_data, + field->name); + break; default: WARN_ON_ONCE(1); return -EINVAL; diff --git a/lttng-events.h b/lttng-events.h index 09d5618..968e2a4 100644 --- a/lttng-events.h +++ b/lttng-events.h @@ -48,6 +48,7 @@ enum abstract_types { atype_array, atype_sequence, atype_string, + atype_raw, NR_ABSTRACT_TYPES, }; @@ -116,6 +117,9 @@ struct lttng_type { struct lttng_basic_type length_type; struct lttng_basic_type elem_type; } sequence; + struct { + char *raw_data; + } raw; } u; }; diff --git a/probes/lttng-events-reset.h b/probes/lttng-events-reset.h index 7355e18..8c9cf4d 100644 --- a/probes/lttng-events-reset.h +++ b/probes/lttng-events-reset.h @@ -35,6 +35,9 @@ #undef __string #define __string(_item, _src) +#undef __variant_raw +#define __variant_raw(_item, _raw_metadata, _length) + #undef tp_assign #define tp_assign(dest, src) @@ -44,6 +47,9 @@ #undef tp_memcpy_dyn #define tp_memcpy_dyn(dest, src, len) +#undef tp_memcpy_var +#define tp_memcpy_var(dest, src, len) + #undef tp_strcpy #define tp_strcpy(dest, src) diff --git a/probes/lttng-events.h b/probes/lttng-events.h index 33cabcf..ce5b647 100644 --- a/probes/lttng-events.h +++ b/probes/lttng-events.h @@ -205,6 +205,21 @@ void trace_##_name(void *__data); #define __string_from_user(_item, _src) \ __string(_item, _src) +#undef __variant_raw +#define __variant_raw(_item, _raw_metadata, _length) \ + { \ + .name = #_item, \ + .type = \ + { \ + .atype = atype_raw, \ + .u.raw.raw_data = #_raw_metadata, \ + }, \ + }, + +#undef __variant_raw_from_user +#define __variant_raw_from_user(_item, _raw_metadata, _length) \ + __variant_raw(_item, _raw_metadata, _length) + #undef TP_STRUCT__entry #define TP_STRUCT__entry(args...) args /* Only one used in this phase */ @@ -353,6 +368,11 @@ static __used struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { #define __string(_item, _src) \ __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1; +#undef __variant_raw +#define __variant_raw(_item, _raw_metadata, _length) \ + __event_len += __dynamic_len[__dynamic_len_idx++] = (_length); + + /* * strlen_user includes \0. If returns 0, it faulted, so we set size to * 1 (\0 only). @@ -459,6 +479,10 @@ static inline size_t __event_get_align__##_name(_proto) \ #define __string_from_user(_item, _src) \ __string(_item, _src) +#undef __variant_raw +#define __variant_raw(_item, _raw_metadata, _length) \ + char *_item; + #undef TP_STRUCT__entry #define TP_STRUCT__entry(args...) args @@ -510,6 +534,11 @@ __end_field_##_item: #define __string_from_user(_item, _src) \ __string(_item, _src) +#undef __variant_raw +#define __variant_raw(_item, _raw_metadata, _length) \ + goto __assign_##_item; \ +__end_field_##_item: + /* * Macros mapping tp_assign() to "=", tp_memcpy() to memcpy() and tp_strcpy() to * strcpy(). @@ -566,6 +595,22 @@ __assign_##dest##_2: \ #define tp_memcpy_dyn_from_user(dest, src) \ tp_memcpy_dyn_gen(event_write_from_user, dest, src) +/* variable length sequence copy, with no size in metadata */ +#undef tp_memcpy_var_gen +#define tp_memcpy_var_gen(write_ops, dest, src) \ +__assign_##dest: \ + lib_ring_buffer_align_ctx(&__ctx, 8); \ + __chan->ops->write_ops(&__ctx, src, __get_dynamic_array_len(dest)); \ + goto __end_field_##dest; + +#undef tp_memcpy_var +#define tp_memcpy_var(dest, src) \ + tp_memcpy_var_gen(event_write, dest, src) + +#undef tp_memcpy_var_from_user +#define tp_memcpy_var_from_user(dest, src) \ + tp_memcpy_var_gen(event_write_from_user, dest, src) + /* * The string length including the final \0. */ -- 1.8.2 _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
