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

Reply via email to