Update to 3.4-final.
[linux-flexiantxendom0-3.2.10.git] / kernel / trace / trace_export.c
index 7f16e21..e039906 100644 (file)
 #undef TRACE_SYSTEM
 #define TRACE_SYSTEM   ftrace
 
-struct ftrace_event_class event_class_ftrace = {
-       .system                 = __stringify(TRACE_SYSTEM),
-};
+/*
+ * The FTRACE_ENTRY_REG macro allows ftrace entry to define register
+ * function and thus become accesible via perf.
+ */
+#undef FTRACE_ENTRY_REG
+#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \
+                        filter, regfn) \
+       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
+                    filter)
 
 /* not needed for this file */
 #undef __field_struct
@@ -48,21 +54,22 @@ struct ftrace_event_class event_class_ftrace = {
 #define F_printk(fmt, args...) fmt, args
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)    \
-struct ____ftrace_##name {                                     \
-       tstruct                                                 \
-};                                                             \
-static void __always_unused ____ftrace_check_##name(void)      \
-{                                                              \
-       struct ____ftrace_##name *__entry = NULL;               \
-                                                               \
-       /* force compile-time check on F_printk() */            \
-       printk(print);                                          \
+#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter)    \
+struct ____ftrace_##name {                                             \
+       tstruct                                                         \
+};                                                                     \
+static void __always_unused ____ftrace_check_##name(void)              \
+{                                                                      \
+       struct ____ftrace_##name *__entry = NULL;                       \
+                                                                       \
+       /* force compile-time check on F_printk() */                    \
+       printk(print);                                                  \
 }
 
 #undef FTRACE_ENTRY_DUP
-#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print)        \
-       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
+#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter)        \
+       FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
+                    filter)
 
 #include "trace_entries.h"
 
@@ -71,7 +78,7 @@ static void __always_unused ____ftrace_check_##name(void)     \
        ret = trace_define_field(event_call, #type, #item,              \
                                 offsetof(typeof(field), item),         \
                                 sizeof(field.item),                    \
-                                is_signed_type(type), FILTER_OTHER);   \
+                                is_signed_type(type), filter_type);    \
        if (ret)                                                        \
                return ret;
 
@@ -81,19 +88,25 @@ static void __always_unused ____ftrace_check_##name(void)   \
                                 offsetof(typeof(field),                \
                                          container.item),              \
                                 sizeof(field.container.item),          \
-                                is_signed_type(type), FILTER_OTHER);   \
+                                is_signed_type(type), filter_type);    \
        if (ret)                                                        \
                return ret;
 
 #undef __array
 #define __array(type, item, len)                                       \
-       BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                         \
-       ret = trace_define_field(event_call, #type "[" #len "]", #item, \
+       do {                                                            \
+               BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);                 \
+               mutex_lock(&event_storage_mutex);                       \
+               snprintf(event_storage, sizeof(event_storage),          \
+                        "%s[%d]", #type, len);                         \
+               ret = trace_define_field(event_call, event_storage, #item, \
                                 offsetof(typeof(field), item),         \
                                 sizeof(field.item),                    \
-                                is_signed_type(type), FILTER_OTHER);   \
-       if (ret)                                                        \
-               return ret;
+                                is_signed_type(type), filter_type);    \
+               mutex_unlock(&event_storage_mutex);                     \
+               if (ret)                                                \
+                       return ret;                                     \
+       } while (0);
 
 #undef __array_desc
 #define __array_desc(type, container, item, len)                       \
@@ -102,7 +115,7 @@ static void __always_unused ____ftrace_check_##name(void)   \
                                 offsetof(typeof(field),                \
                                          container.item),              \
                                 sizeof(field.container.item),          \
-                                is_signed_type(type), FILTER_OTHER);   \
+                                is_signed_type(type), filter_type);    \
        if (ret)                                                        \
                return ret;
 
@@ -110,17 +123,18 @@ static void __always_unused ____ftrace_check_##name(void) \
 #define __dynamic_array(type, item)                                    \
        ret = trace_define_field(event_call, #type, #item,              \
                                 offsetof(typeof(field), item),         \
-                                0, is_signed_type(type), FILTER_OTHER);\
+                                0, is_signed_type(type), filter_type);\
        if (ret)                                                        \
                return ret;
 
 #undef FTRACE_ENTRY
-#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)            \
+#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter)    \
 int                                                                    \
 ftrace_define_fields_##name(struct ftrace_event_call *event_call)      \
 {                                                                      \
        struct struct_name field;                                       \
        int ret;                                                        \
+       int filter_type = filter;                                       \
                                                                        \
        tstruct;                                                        \
                                                                        \
@@ -129,12 +143,6 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call)  \
 
 #include "trace_entries.h"
 
-static int ftrace_raw_init_event(struct ftrace_event_call *call)
-{
-       INIT_LIST_HEAD(&call->fields);
-       return 0;
-}
-
 #undef __entry
 #define __entry REC
 
@@ -154,20 +162,37 @@ static int ftrace_raw_init_event(struct ftrace_event_call *call)
 #define __dynamic_array(type, item)
 
 #undef F_printk
-#define F_printk(fmt, args...) #fmt ", "  __stringify(args)
+#define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)
 
-#undef FTRACE_ENTRY
-#define FTRACE_ENTRY(call, struct_name, type, tstruct, print)          \
+#undef FTRACE_ENTRY_REG
+#define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\
+                        regfn)                                         \
                                                                        \
-struct ftrace_event_call __used                                                \
-__attribute__((__aligned__(4)))                                                \
-__attribute__((section("_ftrace_events"))) event_##call = {            \
+struct ftrace_event_class event_class_ftrace_##call = {                        \
+       .system                 = __stringify(TRACE_SYSTEM),            \
+       .define_fields          = ftrace_define_fields_##call,          \
+       .fields                 = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
+       .reg                    = regfn,                                \
+};                                                                     \
+                                                                       \
+struct ftrace_event_call __used event_##call = {                       \
        .name                   = #call,                                \
-       .id                     = type,                                 \
-       .class                  = &event_class_ftrace,                  \
-       .raw_init               = ftrace_raw_init_event,                \
+       .event.type             = etype,                                \
+       .class                  = &event_class_ftrace_##call,           \
        .print_fmt              = print,                                \
-       .define_fields          = ftrace_define_fields_##call,          \
+       .flags                  = TRACE_EVENT_FL_IGNORE_ENABLE,         \
 };                                                                     \
+struct ftrace_event_call __used                                                \
+__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
+
+#undef FTRACE_ENTRY
+#define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \
+       FTRACE_ENTRY_REG(call, struct_name, etype,                      \
+                        PARAMS(tstruct), PARAMS(print), filter, NULL)
+
+int ftrace_event_is_function(struct ftrace_event_call *call)
+{
+       return call == &event_function;
+}
 
 #include "trace_entries.h"