tracing: Add __get_dynamic_array_len() macro for trace events
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Wed, 4 Jun 2014 18:29:33 +0000 (14:29 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Wed, 4 Jun 2014 18:29:33 +0000 (14:29 -0400)
If a trace event uses a dynamic array for something other than a string
then there's currently no way the TP_printk() can figure out what size
it is. A __get_dynamic_array_len() is required to know the length.

This also simplifies the __get_bitmask() macro which required it as well,
but instead just hardcoded it.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/trace/ftrace.h

index 9b7a989dcbccdc594019874d03697abc3c34d153..0fd06fef9fac9044cf42e6352a9116bfad820847 100644 (file)
 #define __get_dynamic_array(field)     \
                ((void *)__entry + (__entry->__data_loc_##field & 0xffff))
 
+#undef __get_dynamic_array_len
+#define __get_dynamic_array_len(field) \
+               ((__entry->__data_loc_##field >> 16) & 0xffff)
+
 #undef __get_str
 #define __get_str(field) (char *)__get_dynamic_array(field)
 
        ({                                                              \
                void *__bitmask = __get_dynamic_array(field);           \
                unsigned int __bitmask_size;                            \
-               __bitmask_size = (__entry->__data_loc_##field >> 16) & 0xffff; \
+               __bitmask_size = __get_dynamic_array_len(field);        \
                ftrace_print_bitmask_seq(p, __bitmask, __bitmask_size); \
        })
 
@@ -636,6 +640,7 @@ static inline void ftrace_test_probe_##call(void)                   \
 #undef __print_symbolic
 #undef __print_hex
 #undef __get_dynamic_array
+#undef __get_dynamic_array_len
 #undef __get_str
 #undef __get_bitmask
 
@@ -700,6 +705,10 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
 #define __get_dynamic_array(field)     \
                ((void *)__entry + (__entry->__data_loc_##field & 0xffff))
 
+#undef __get_dynamic_array_len
+#define __get_dynamic_array_len(field) \
+               ((__entry->__data_loc_##field >> 16) & 0xffff)
+
 #undef __get_str
 #define __get_str(field) (char *)__get_dynamic_array(field)