aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2014-06-17 08:59:16 -0400
committerSteven Rostedt <rostedt@goodmis.org>2014-06-21 00:18:42 -0400
commit4d4c9cc839a308be3289a361ccba4447ee140552 (patch)
tree404a0a22a3700c16ef3437b69fefe46c06cf5f91
parentea73c79e33c45e1fa0071e216f06fd5682314490 (diff)
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: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--include/trace/ftrace.h33
-rw-r--r--samples/trace_events/trace-events-sample.h3
2 files changed, 35 insertions, 1 deletions
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
index 0fd06fef9fac..26b4f2e13275 100644
--- a/include/trace/ftrace.h
+++ b/include/trace/ftrace.h
@@ -44,6 +44,12 @@
44#undef __field_ext 44#undef __field_ext
45#define __field_ext(type, item, filter_type) type item; 45#define __field_ext(type, item, filter_type) type item;
46 46
47#undef __field_struct
48#define __field_struct(type, item) type item;
49
50#undef __field_struct_ext
51#define __field_struct_ext(type, item, filter_type) type item;
52
47#undef __array 53#undef __array
48#define __array(type, item, len) type item[len]; 54#define __array(type, item, len) type item[len];
49 55
@@ -122,6 +128,12 @@
122#undef __field_ext 128#undef __field_ext
123#define __field_ext(type, item, filter_type) 129#define __field_ext(type, item, filter_type)
124 130
131#undef __field_struct
132#define __field_struct(type, item)
133
134#undef __field_struct_ext
135#define __field_struct_ext(type, item, filter_type)
136
125#undef __array 137#undef __array
126#define __array(type, item, len) 138#define __array(type, item, len)
127 139
@@ -315,9 +327,21 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \
315 if (ret) \ 327 if (ret) \
316 return ret; 328 return ret;
317 329
330#undef __field_struct_ext
331#define __field_struct_ext(type, item, filter_type) \
332 ret = trace_define_field(event_call, #type, #item, \
333 offsetof(typeof(field), item), \
334 sizeof(field.item), \
335 0, filter_type); \
336 if (ret) \
337 return ret;
338
318#undef __field 339#undef __field
319#define __field(type, item) __field_ext(type, item, FILTER_OTHER) 340#define __field(type, item) __field_ext(type, item, FILTER_OTHER)
320 341
342#undef __field_struct
343#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
344
321#undef __array 345#undef __array
322#define __array(type, item, len) \ 346#define __array(type, item, len) \
323 do { \ 347 do { \
@@ -379,6 +403,12 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
379#undef __field_ext 403#undef __field_ext
380#define __field_ext(type, item, filter_type) 404#define __field_ext(type, item, filter_type)
381 405
406#undef __field_struct
407#define __field_struct(type, item)
408
409#undef __field_struct_ext
410#define __field_struct_ext(type, item, filter_type)
411
382#undef __array 412#undef __array
383#define __array(type, item, len) 413#define __array(type, item, len)
384 414
@@ -550,6 +580,9 @@ static inline notrace int ftrace_get_offsets_##call( \
550#undef __field 580#undef __field
551#define __field(type, item) 581#define __field(type, item)
552 582
583#undef __field_struct
584#define __field_struct(type, item)
585
553#undef __array 586#undef __array
554#define __array(type, item, len) 587#define __array(type, item, len)
555 588
diff --git a/samples/trace_events/trace-events-sample.h b/samples/trace_events/trace-events-sample.h
index 6af373236d73..4b0113f73ee9 100644
--- a/samples/trace_events/trace-events-sample.h
+++ b/samples/trace_events/trace-events-sample.h
@@ -56,7 +56,8 @@
56 * struct: This defines the way the data will be stored in the ring buffer. 56 * struct: This defines the way the data will be stored in the ring buffer.
57 * There are currently two types of elements. __field and __array. 57 * There are currently two types of elements. __field and __array.
58 * a __field is broken up into (type, name). Where type can be any 58 * a __field is broken up into (type, name). Where type can be any
59 * type but an array. 59 * primitive type (integer, long or pointer). __field_struct() can
60 * be any static complex data value (struct, union, but not an array).
60 * For an array. there are three fields. (type, name, size). The 61 * For an array. there are three fields. (type, name, size). The
61 * type of elements in the array, the name of the field and the size 62 * type of elements in the array, the name of the field and the size
62 * of the array. 63 * of the array.