diff options
Diffstat (limited to 'kernel/trace/trace_export.c')
-rw-r--r-- | kernel/trace/trace_export.c | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index bbeec31e0ae3..7b46c9bd22ae 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
@@ -18,6 +18,16 @@ | |||
18 | #undef TRACE_SYSTEM | 18 | #undef TRACE_SYSTEM |
19 | #define TRACE_SYSTEM ftrace | 19 | #define TRACE_SYSTEM ftrace |
20 | 20 | ||
21 | /* | ||
22 | * The FTRACE_ENTRY_REG macro allows ftrace entry to define register | ||
23 | * function and thus become accesible via perf. | ||
24 | */ | ||
25 | #undef FTRACE_ENTRY_REG | ||
26 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \ | ||
27 | filter, regfn) \ | ||
28 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ | ||
29 | filter) | ||
30 | |||
21 | /* not needed for this file */ | 31 | /* not needed for this file */ |
22 | #undef __field_struct | 32 | #undef __field_struct |
23 | #define __field_struct(type, item) | 33 | #define __field_struct(type, item) |
@@ -44,21 +54,22 @@ | |||
44 | #define F_printk(fmt, args...) fmt, args | 54 | #define F_printk(fmt, args...) fmt, args |
45 | 55 | ||
46 | #undef FTRACE_ENTRY | 56 | #undef FTRACE_ENTRY |
47 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 57 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
48 | struct ____ftrace_##name { \ | 58 | struct ____ftrace_##name { \ |
49 | tstruct \ | 59 | tstruct \ |
50 | }; \ | 60 | }; \ |
51 | static void __always_unused ____ftrace_check_##name(void) \ | 61 | static void __always_unused ____ftrace_check_##name(void) \ |
52 | { \ | 62 | { \ |
53 | struct ____ftrace_##name *__entry = NULL; \ | 63 | struct ____ftrace_##name *__entry = NULL; \ |
54 | \ | 64 | \ |
55 | /* force compile-time check on F_printk() */ \ | 65 | /* force compile-time check on F_printk() */ \ |
56 | printk(print); \ | 66 | printk(print); \ |
57 | } | 67 | } |
58 | 68 | ||
59 | #undef FTRACE_ENTRY_DUP | 69 | #undef FTRACE_ENTRY_DUP |
60 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \ | 70 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter) \ |
61 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 71 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ |
72 | filter) | ||
62 | 73 | ||
63 | #include "trace_entries.h" | 74 | #include "trace_entries.h" |
64 | 75 | ||
@@ -67,7 +78,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
67 | ret = trace_define_field(event_call, #type, #item, \ | 78 | ret = trace_define_field(event_call, #type, #item, \ |
68 | offsetof(typeof(field), item), \ | 79 | offsetof(typeof(field), item), \ |
69 | sizeof(field.item), \ | 80 | sizeof(field.item), \ |
70 | is_signed_type(type), FILTER_OTHER); \ | 81 | is_signed_type(type), filter_type); \ |
71 | if (ret) \ | 82 | if (ret) \ |
72 | return ret; | 83 | return ret; |
73 | 84 | ||
@@ -77,7 +88,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
77 | offsetof(typeof(field), \ | 88 | offsetof(typeof(field), \ |
78 | container.item), \ | 89 | container.item), \ |
79 | sizeof(field.container.item), \ | 90 | sizeof(field.container.item), \ |
80 | is_signed_type(type), FILTER_OTHER); \ | 91 | is_signed_type(type), filter_type); \ |
81 | if (ret) \ | 92 | if (ret) \ |
82 | return ret; | 93 | return ret; |
83 | 94 | ||
@@ -91,7 +102,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
91 | ret = trace_define_field(event_call, event_storage, #item, \ | 102 | ret = trace_define_field(event_call, event_storage, #item, \ |
92 | offsetof(typeof(field), item), \ | 103 | offsetof(typeof(field), item), \ |
93 | sizeof(field.item), \ | 104 | sizeof(field.item), \ |
94 | is_signed_type(type), FILTER_OTHER); \ | 105 | is_signed_type(type), filter_type); \ |
95 | mutex_unlock(&event_storage_mutex); \ | 106 | mutex_unlock(&event_storage_mutex); \ |
96 | if (ret) \ | 107 | if (ret) \ |
97 | return ret; \ | 108 | return ret; \ |
@@ -104,7 +115,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
104 | offsetof(typeof(field), \ | 115 | offsetof(typeof(field), \ |
105 | container.item), \ | 116 | container.item), \ |
106 | sizeof(field.container.item), \ | 117 | sizeof(field.container.item), \ |
107 | is_signed_type(type), FILTER_OTHER); \ | 118 | is_signed_type(type), filter_type); \ |
108 | if (ret) \ | 119 | if (ret) \ |
109 | return ret; | 120 | return ret; |
110 | 121 | ||
@@ -112,17 +123,18 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
112 | #define __dynamic_array(type, item) \ | 123 | #define __dynamic_array(type, item) \ |
113 | ret = trace_define_field(event_call, #type, #item, \ | 124 | ret = trace_define_field(event_call, #type, #item, \ |
114 | offsetof(typeof(field), item), \ | 125 | offsetof(typeof(field), item), \ |
115 | 0, is_signed_type(type), FILTER_OTHER);\ | 126 | 0, is_signed_type(type), filter_type);\ |
116 | if (ret) \ | 127 | if (ret) \ |
117 | return ret; | 128 | return ret; |
118 | 129 | ||
119 | #undef FTRACE_ENTRY | 130 | #undef FTRACE_ENTRY |
120 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 131 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
121 | int \ | 132 | int \ |
122 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | 133 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ |
123 | { \ | 134 | { \ |
124 | struct struct_name field; \ | 135 | struct struct_name field; \ |
125 | int ret; \ | 136 | int ret; \ |
137 | int filter_type = filter; \ | ||
126 | \ | 138 | \ |
127 | tstruct; \ | 139 | tstruct; \ |
128 | \ | 140 | \ |
@@ -152,13 +164,15 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | |||
152 | #undef F_printk | 164 | #undef F_printk |
153 | #define F_printk(fmt, args...) #fmt ", " __stringify(args) | 165 | #define F_printk(fmt, args...) #fmt ", " __stringify(args) |
154 | 166 | ||
155 | #undef FTRACE_ENTRY | 167 | #undef FTRACE_ENTRY_REG |
156 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \ | 168 | #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\ |
169 | regfn) \ | ||
157 | \ | 170 | \ |
158 | struct ftrace_event_class event_class_ftrace_##call = { \ | 171 | struct ftrace_event_class event_class_ftrace_##call = { \ |
159 | .system = __stringify(TRACE_SYSTEM), \ | 172 | .system = __stringify(TRACE_SYSTEM), \ |
160 | .define_fields = ftrace_define_fields_##call, \ | 173 | .define_fields = ftrace_define_fields_##call, \ |
161 | .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\ | 174 | .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\ |
175 | .reg = regfn, \ | ||
162 | }; \ | 176 | }; \ |
163 | \ | 177 | \ |
164 | struct ftrace_event_call __used event_##call = { \ | 178 | struct ftrace_event_call __used event_##call = { \ |
@@ -170,4 +184,14 @@ struct ftrace_event_call __used event_##call = { \ | |||
170 | struct ftrace_event_call __used \ | 184 | struct ftrace_event_call __used \ |
171 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; | 185 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; |
172 | 186 | ||
187 | #undef FTRACE_ENTRY | ||
188 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \ | ||
189 | FTRACE_ENTRY_REG(call, struct_name, etype, \ | ||
190 | PARAMS(tstruct), PARAMS(print), filter, NULL) | ||
191 | |||
192 | int ftrace_event_is_function(struct ftrace_event_call *call) | ||
193 | { | ||
194 | return call == &event_function; | ||
195 | } | ||
196 | |||
173 | #include "trace_entries.h" | 197 | #include "trace_entries.h" |