Commit 4d4c9cc8 authored by Steven Rostedt's avatar Steven Rostedt

tracing: Add __field_struct macro for TRACE_EVENT()

Currently the __field() macro in TRACE_EVENT is only good for primitive
values, such as integers and pointers, but it fails on complex data types
such as structures or unions. This is because the __field() macro
determines if the variable is signed or not with the test of:

  (((type)(-1)) < (type)1)

Unfortunately, that fails when type is a structure.

Since trace events should support structures as fields a new macro
is created for such a case called __field_struct() which acts exactly
the same as __field() does but it does not do the signed type check
and just uses a constant false for that answer.

Cc: Tony Luck <tony.luck@gmail.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent ea73c79e
...@@ -44,6 +44,12 @@ ...@@ -44,6 +44,12 @@
#undef __field_ext #undef __field_ext
#define __field_ext(type, item, filter_type) type item; #define __field_ext(type, item, filter_type) type item;
#undef __field_struct
#define __field_struct(type, item) type item;
#undef __field_struct_ext
#define __field_struct_ext(type, item, filter_type) type item;
#undef __array #undef __array
#define __array(type, item, len) type item[len]; #define __array(type, item, len) type item[len];
...@@ -122,6 +128,12 @@ ...@@ -122,6 +128,12 @@
#undef __field_ext #undef __field_ext
#define __field_ext(type, item, filter_type) #define __field_ext(type, item, filter_type)
#undef __field_struct
#define __field_struct(type, item)
#undef __field_struct_ext
#define __field_struct_ext(type, item, filter_type)
#undef __array #undef __array
#define __array(type, item, len) #define __array(type, item, len)
...@@ -315,9 +327,21 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \ ...@@ -315,9 +327,21 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \
if (ret) \ if (ret) \
return ret; return ret;
#undef __field_struct_ext
#define __field_struct_ext(type, item, filter_type) \
ret = trace_define_field(event_call, #type, #item, \
offsetof(typeof(field), item), \
sizeof(field.item), \
0, filter_type); \
if (ret) \
return ret;
#undef __field #undef __field
#define __field(type, item) __field_ext(type, item, FILTER_OTHER) #define __field(type, item) __field_ext(type, item, FILTER_OTHER)
#undef __field_struct
#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
#undef __array #undef __array
#define __array(type, item, len) \ #define __array(type, item, len) \
do { \ do { \
...@@ -379,6 +403,12 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ ...@@ -379,6 +403,12 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
#undef __field_ext #undef __field_ext
#define __field_ext(type, item, filter_type) #define __field_ext(type, item, filter_type)
#undef __field_struct
#define __field_struct(type, item)
#undef __field_struct_ext
#define __field_struct_ext(type, item, filter_type)
#undef __array #undef __array
#define __array(type, item, len) #define __array(type, item, len)
...@@ -550,6 +580,9 @@ static inline notrace int ftrace_get_offsets_##call( \ ...@@ -550,6 +580,9 @@ static inline notrace int ftrace_get_offsets_##call( \
#undef __field #undef __field
#define __field(type, item) #define __field(type, item)
#undef __field_struct
#define __field_struct(type, item)
#undef __array #undef __array
#define __array(type, item, len) #define __array(type, item, len)
......
...@@ -56,7 +56,8 @@ ...@@ -56,7 +56,8 @@
* struct: This defines the way the data will be stored in the ring buffer. * struct: This defines the way the data will be stored in the ring buffer.
* There are currently two types of elements. __field and __array. * There are currently two types of elements. __field and __array.
* a __field is broken up into (type, name). Where type can be any * a __field is broken up into (type, name). Where type can be any
* type but an array. * primitive type (integer, long or pointer). __field_struct() can
* be any static complex data value (struct, union, but not an array).
* For an array. there are three fields. (type, name, size). The * For an array. there are three fields. (type, name, size). The
* type of elements in the array, the name of the field and the size * type of elements in the array, the name of the field and the size
* of the array. * of the array.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment