diff options
Diffstat (limited to 'include/trace')
-rw-r--r-- | include/trace/events/ext4.h | 105 | ||||
-rw-r--r-- | include/trace/events/kvm.h | 1 | ||||
-rw-r--r-- | include/trace/events/sched.h | 19 | ||||
-rw-r--r-- | include/trace/events/signal.h | 3 | ||||
-rw-r--r-- | include/trace/ftrace.h | 249 | ||||
-rw-r--r-- | include/trace/syscall.h | 10 |
6 files changed, 172 insertions, 215 deletions
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 2aa6aa3e8f61..f3865c7b4166 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
@@ -306,7 +306,6 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
306 | __field( int, pages_written ) | 306 | __field( int, pages_written ) |
307 | __field( long, pages_skipped ) | 307 | __field( long, pages_skipped ) |
308 | __field( char, more_io ) | 308 | __field( char, more_io ) |
309 | __field( char, no_nrwrite_index_update ) | ||
310 | __field( pgoff_t, writeback_index ) | 309 | __field( pgoff_t, writeback_index ) |
311 | ), | 310 | ), |
312 | 311 | ||
@@ -317,16 +316,14 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
317 | __entry->pages_written = pages_written; | 316 | __entry->pages_written = pages_written; |
318 | __entry->pages_skipped = wbc->pages_skipped; | 317 | __entry->pages_skipped = wbc->pages_skipped; |
319 | __entry->more_io = wbc->more_io; | 318 | __entry->more_io = wbc->more_io; |
320 | __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; | ||
321 | __entry->writeback_index = inode->i_mapping->writeback_index; | 319 | __entry->writeback_index = inode->i_mapping->writeback_index; |
322 | ), | 320 | ), |
323 | 321 | ||
324 | TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d no_nrwrite_index_update %d writeback_index %lu", | 322 | TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", |
325 | jbd2_dev_to_name(__entry->dev), | 323 | jbd2_dev_to_name(__entry->dev), |
326 | (unsigned long) __entry->ino, __entry->ret, | 324 | (unsigned long) __entry->ino, __entry->ret, |
327 | __entry->pages_written, __entry->pages_skipped, | 325 | __entry->pages_written, __entry->pages_skipped, |
328 | __entry->more_io, | 326 | __entry->more_io, |
329 | __entry->no_nrwrite_index_update, | ||
330 | (unsigned long) __entry->writeback_index) | 327 | (unsigned long) __entry->writeback_index) |
331 | ); | 328 | ); |
332 | 329 | ||
@@ -353,7 +350,7 @@ TRACE_EVENT(ext4_discard_blocks, | |||
353 | jbd2_dev_to_name(__entry->dev), __entry->blk, __entry->count) | 350 | jbd2_dev_to_name(__entry->dev), __entry->blk, __entry->count) |
354 | ); | 351 | ); |
355 | 352 | ||
356 | TRACE_EVENT(ext4_mb_new_inode_pa, | 353 | DECLARE_EVENT_CLASS(ext4__mb_new_pa, |
357 | TP_PROTO(struct ext4_allocation_context *ac, | 354 | TP_PROTO(struct ext4_allocation_context *ac, |
358 | struct ext4_prealloc_space *pa), | 355 | struct ext4_prealloc_space *pa), |
359 | 356 | ||
@@ -381,32 +378,20 @@ TRACE_EVENT(ext4_mb_new_inode_pa, | |||
381 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) | 378 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) |
382 | ); | 379 | ); |
383 | 380 | ||
384 | TRACE_EVENT(ext4_mb_new_group_pa, | 381 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_inode_pa, |
382 | |||
385 | TP_PROTO(struct ext4_allocation_context *ac, | 383 | TP_PROTO(struct ext4_allocation_context *ac, |
386 | struct ext4_prealloc_space *pa), | 384 | struct ext4_prealloc_space *pa), |
387 | 385 | ||
388 | TP_ARGS(ac, pa), | 386 | TP_ARGS(ac, pa) |
389 | 387 | ); | |
390 | TP_STRUCT__entry( | ||
391 | __field( dev_t, dev ) | ||
392 | __field( ino_t, ino ) | ||
393 | __field( __u64, pa_pstart ) | ||
394 | __field( __u32, pa_len ) | ||
395 | __field( __u64, pa_lstart ) | ||
396 | 388 | ||
397 | ), | 389 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_group_pa, |
398 | 390 | ||
399 | TP_fast_assign( | 391 | TP_PROTO(struct ext4_allocation_context *ac, |
400 | __entry->dev = ac->ac_sb->s_dev; | 392 | struct ext4_prealloc_space *pa), |
401 | __entry->ino = ac->ac_inode->i_ino; | ||
402 | __entry->pa_pstart = pa->pa_pstart; | ||
403 | __entry->pa_len = pa->pa_len; | ||
404 | __entry->pa_lstart = pa->pa_lstart; | ||
405 | ), | ||
406 | 393 | ||
407 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", | 394 | TP_ARGS(ac, pa) |
408 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
409 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) | ||
410 | ); | 395 | ); |
411 | 396 | ||
412 | TRACE_EVENT(ext4_mb_release_inode_pa, | 397 | TRACE_EVENT(ext4_mb_release_inode_pa, |
@@ -618,9 +603,9 @@ TRACE_EVENT(ext4_free_blocks, | |||
618 | ); | 603 | ); |
619 | 604 | ||
620 | TRACE_EVENT(ext4_sync_file, | 605 | TRACE_EVENT(ext4_sync_file, |
621 | TP_PROTO(struct file *file, struct dentry *dentry, int datasync), | 606 | TP_PROTO(struct file *file, int datasync), |
622 | 607 | ||
623 | TP_ARGS(file, dentry, datasync), | 608 | TP_ARGS(file, datasync), |
624 | 609 | ||
625 | TP_STRUCT__entry( | 610 | TP_STRUCT__entry( |
626 | __field( dev_t, dev ) | 611 | __field( dev_t, dev ) |
@@ -630,6 +615,8 @@ TRACE_EVENT(ext4_sync_file, | |||
630 | ), | 615 | ), |
631 | 616 | ||
632 | TP_fast_assign( | 617 | TP_fast_assign( |
618 | struct dentry *dentry = file->f_path.dentry; | ||
619 | |||
633 | __entry->dev = dentry->d_inode->i_sb->s_dev; | 620 | __entry->dev = dentry->d_inode->i_sb->s_dev; |
634 | __entry->ino = dentry->d_inode->i_ino; | 621 | __entry->ino = dentry->d_inode->i_ino; |
635 | __entry->datasync = datasync; | 622 | __entry->datasync = datasync; |
@@ -790,7 +777,7 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
790 | __entry->result_len, __entry->result_logical) | 777 | __entry->result_len, __entry->result_logical) |
791 | ); | 778 | ); |
792 | 779 | ||
793 | TRACE_EVENT(ext4_mballoc_discard, | 780 | DECLARE_EVENT_CLASS(ext4__mballoc, |
794 | TP_PROTO(struct ext4_allocation_context *ac), | 781 | TP_PROTO(struct ext4_allocation_context *ac), |
795 | 782 | ||
796 | TP_ARGS(ac), | 783 | TP_ARGS(ac), |
@@ -819,33 +806,18 @@ TRACE_EVENT(ext4_mballoc_discard, | |||
819 | __entry->result_len, __entry->result_logical) | 806 | __entry->result_len, __entry->result_logical) |
820 | ); | 807 | ); |
821 | 808 | ||
822 | TRACE_EVENT(ext4_mballoc_free, | 809 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_discard, |
810 | |||
823 | TP_PROTO(struct ext4_allocation_context *ac), | 811 | TP_PROTO(struct ext4_allocation_context *ac), |
824 | 812 | ||
825 | TP_ARGS(ac), | 813 | TP_ARGS(ac) |
814 | ); | ||
826 | 815 | ||
827 | TP_STRUCT__entry( | 816 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_free, |
828 | __field( dev_t, dev ) | ||
829 | __field( ino_t, ino ) | ||
830 | __field( __u32, result_logical ) | ||
831 | __field( int, result_start ) | ||
832 | __field( __u32, result_group ) | ||
833 | __field( int, result_len ) | ||
834 | ), | ||
835 | 817 | ||
836 | TP_fast_assign( | 818 | TP_PROTO(struct ext4_allocation_context *ac), |
837 | __entry->dev = ac->ac_inode->i_sb->s_dev; | ||
838 | __entry->ino = ac->ac_inode->i_ino; | ||
839 | __entry->result_logical = ac->ac_b_ex.fe_logical; | ||
840 | __entry->result_start = ac->ac_b_ex.fe_start; | ||
841 | __entry->result_group = ac->ac_b_ex.fe_group; | ||
842 | __entry->result_len = ac->ac_b_ex.fe_len; | ||
843 | ), | ||
844 | 819 | ||
845 | TP_printk("dev %s inode %lu extent %u/%d/%u@%u ", | 820 | TP_ARGS(ac) |
846 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
847 | __entry->result_group, __entry->result_start, | ||
848 | __entry->result_len, __entry->result_logical) | ||
849 | ); | 821 | ); |
850 | 822 | ||
851 | TRACE_EVENT(ext4_forget, | 823 | TRACE_EVENT(ext4_forget, |
@@ -974,6 +946,39 @@ TRACE_EVENT(ext4_da_release_space, | |||
974 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) | 946 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) |
975 | ); | 947 | ); |
976 | 948 | ||
949 | DECLARE_EVENT_CLASS(ext4__bitmap_load, | ||
950 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
951 | |||
952 | TP_ARGS(sb, group), | ||
953 | |||
954 | TP_STRUCT__entry( | ||
955 | __field( dev_t, dev ) | ||
956 | __field( __u32, group ) | ||
957 | |||
958 | ), | ||
959 | |||
960 | TP_fast_assign( | ||
961 | __entry->dev = sb->s_dev; | ||
962 | __entry->group = group; | ||
963 | ), | ||
964 | |||
965 | TP_printk("dev %s group %u", | ||
966 | jbd2_dev_to_name(__entry->dev), __entry->group) | ||
967 | ); | ||
968 | |||
969 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_bitmap_load, | ||
970 | |||
971 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
972 | |||
973 | TP_ARGS(sb, group) | ||
974 | ); | ||
975 | |||
976 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_buddy_bitmap_load, | ||
977 | |||
978 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
979 | |||
980 | TP_ARGS(sb, group) | ||
981 | ); | ||
977 | 982 | ||
978 | #endif /* _TRACE_EXT4_H */ | 983 | #endif /* _TRACE_EXT4_H */ |
979 | 984 | ||
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index b17d49dfc3ef..6dd3a51ab1cb 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h | |||
@@ -5,7 +5,6 @@ | |||
5 | 5 | ||
6 | #undef TRACE_SYSTEM | 6 | #undef TRACE_SYSTEM |
7 | #define TRACE_SYSTEM kvm | 7 | #define TRACE_SYSTEM kvm |
8 | #define TRACE_INCLUDE_FILE kvm | ||
9 | 8 | ||
10 | #if defined(__KVM_HAVE_IOAPIC) | 9 | #if defined(__KVM_HAVE_IOAPIC) |
11 | TRACE_EVENT(kvm_set_irq, | 10 | TRACE_EVENT(kvm_set_irq, |
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 4f733ecea46e..b9e1dd6c6208 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h | |||
@@ -115,6 +115,23 @@ DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new, | |||
115 | TP_PROTO(struct task_struct *p, int success), | 115 | TP_PROTO(struct task_struct *p, int success), |
116 | TP_ARGS(p, success)); | 116 | TP_ARGS(p, success)); |
117 | 117 | ||
118 | #ifdef CREATE_TRACE_POINTS | ||
119 | static inline long __trace_sched_switch_state(struct task_struct *p) | ||
120 | { | ||
121 | long state = p->state; | ||
122 | |||
123 | #ifdef CONFIG_PREEMPT | ||
124 | /* | ||
125 | * For all intents and purposes a preempted task is a running task. | ||
126 | */ | ||
127 | if (task_thread_info(p)->preempt_count & PREEMPT_ACTIVE) | ||
128 | state = TASK_RUNNING; | ||
129 | #endif | ||
130 | |||
131 | return state; | ||
132 | } | ||
133 | #endif | ||
134 | |||
118 | /* | 135 | /* |
119 | * Tracepoint for task switches, performed by the scheduler: | 136 | * Tracepoint for task switches, performed by the scheduler: |
120 | */ | 137 | */ |
@@ -139,7 +156,7 @@ TRACE_EVENT(sched_switch, | |||
139 | memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); | 156 | memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); |
140 | __entry->prev_pid = prev->pid; | 157 | __entry->prev_pid = prev->pid; |
141 | __entry->prev_prio = prev->prio; | 158 | __entry->prev_prio = prev->prio; |
142 | __entry->prev_state = prev->state; | 159 | __entry->prev_state = __trace_sched_switch_state(prev); |
143 | memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); | 160 | memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); |
144 | __entry->next_pid = next->pid; | 161 | __entry->next_pid = next->pid; |
145 | __entry->next_prio = next->prio; | 162 | __entry->next_prio = next->prio; |
diff --git a/include/trace/events/signal.h b/include/trace/events/signal.h index 814566c99d29..17df43464df0 100644 --- a/include/trace/events/signal.h +++ b/include/trace/events/signal.h | |||
@@ -10,7 +10,8 @@ | |||
10 | 10 | ||
11 | #define TP_STORE_SIGINFO(__entry, info) \ | 11 | #define TP_STORE_SIGINFO(__entry, info) \ |
12 | do { \ | 12 | do { \ |
13 | if (info == SEND_SIG_NOINFO) { \ | 13 | if (info == SEND_SIG_NOINFO || \ |
14 | info == SEND_SIG_FORCED) { \ | ||
14 | __entry->errno = 0; \ | 15 | __entry->errno = 0; \ |
15 | __entry->code = SI_USER; \ | 16 | __entry->code = SI_USER; \ |
16 | } else if (info == SEND_SIG_PRIV) { \ | 17 | } else if (info == SEND_SIG_PRIV) { \ |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 88c59c13ea7b..5a64905d7278 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
@@ -62,10 +62,13 @@ | |||
62 | struct trace_entry ent; \ | 62 | struct trace_entry ent; \ |
63 | tstruct \ | 63 | tstruct \ |
64 | char __data[0]; \ | 64 | char __data[0]; \ |
65 | }; | 65 | }; \ |
66 | \ | ||
67 | static struct ftrace_event_class event_class_##name; | ||
68 | |||
66 | #undef DEFINE_EVENT | 69 | #undef DEFINE_EVENT |
67 | #define DEFINE_EVENT(template, name, proto, args) \ | 70 | #define DEFINE_EVENT(template, name, proto, args) \ |
68 | static struct ftrace_event_call \ | 71 | static struct ftrace_event_call __used \ |
69 | __attribute__((__aligned__(4))) event_##name | 72 | __attribute__((__aligned__(4))) event_##name |
70 | 73 | ||
71 | #undef DEFINE_EVENT_PRINT | 74 | #undef DEFINE_EVENT_PRINT |
@@ -147,7 +150,7 @@ | |||
147 | * | 150 | * |
148 | * entry = iter->ent; | 151 | * entry = iter->ent; |
149 | * | 152 | * |
150 | * if (entry->type != event_<call>.id) { | 153 | * if (entry->type != event_<call>->event.type) { |
151 | * WARN_ON_ONCE(1); | 154 | * WARN_ON_ONCE(1); |
152 | * return TRACE_TYPE_UNHANDLED; | 155 | * return TRACE_TYPE_UNHANDLED; |
153 | * } | 156 | * } |
@@ -206,18 +209,22 @@ | |||
206 | #undef DECLARE_EVENT_CLASS | 209 | #undef DECLARE_EVENT_CLASS |
207 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | 210 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ |
208 | static notrace enum print_line_t \ | 211 | static notrace enum print_line_t \ |
209 | ftrace_raw_output_id_##call(int event_id, const char *name, \ | 212 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ |
210 | struct trace_iterator *iter, int flags) \ | 213 | struct trace_event *trace_event) \ |
211 | { \ | 214 | { \ |
215 | struct ftrace_event_call *event; \ | ||
212 | struct trace_seq *s = &iter->seq; \ | 216 | struct trace_seq *s = &iter->seq; \ |
213 | struct ftrace_raw_##call *field; \ | 217 | struct ftrace_raw_##call *field; \ |
214 | struct trace_entry *entry; \ | 218 | struct trace_entry *entry; \ |
215 | struct trace_seq *p; \ | 219 | struct trace_seq *p; \ |
216 | int ret; \ | 220 | int ret; \ |
217 | \ | 221 | \ |
222 | event = container_of(trace_event, struct ftrace_event_call, \ | ||
223 | event); \ | ||
224 | \ | ||
218 | entry = iter->ent; \ | 225 | entry = iter->ent; \ |
219 | \ | 226 | \ |
220 | if (entry->type != event_id) { \ | 227 | if (entry->type != event->event.type) { \ |
221 | WARN_ON_ONCE(1); \ | 228 | WARN_ON_ONCE(1); \ |
222 | return TRACE_TYPE_UNHANDLED; \ | 229 | return TRACE_TYPE_UNHANDLED; \ |
223 | } \ | 230 | } \ |
@@ -226,7 +233,7 @@ ftrace_raw_output_id_##call(int event_id, const char *name, \ | |||
226 | \ | 233 | \ |
227 | p = &get_cpu_var(ftrace_event_seq); \ | 234 | p = &get_cpu_var(ftrace_event_seq); \ |
228 | trace_seq_init(p); \ | 235 | trace_seq_init(p); \ |
229 | ret = trace_seq_printf(s, "%s: ", name); \ | 236 | ret = trace_seq_printf(s, "%s: ", event->name); \ |
230 | if (ret) \ | 237 | if (ret) \ |
231 | ret = trace_seq_printf(s, print); \ | 238 | ret = trace_seq_printf(s, print); \ |
232 | put_cpu(); \ | 239 | put_cpu(); \ |
@@ -234,21 +241,16 @@ ftrace_raw_output_id_##call(int event_id, const char *name, \ | |||
234 | return TRACE_TYPE_PARTIAL_LINE; \ | 241 | return TRACE_TYPE_PARTIAL_LINE; \ |
235 | \ | 242 | \ |
236 | return TRACE_TYPE_HANDLED; \ | 243 | return TRACE_TYPE_HANDLED; \ |
237 | } | 244 | } \ |
238 | 245 | static struct trace_event_functions ftrace_event_type_funcs_##call = { \ | |
239 | #undef DEFINE_EVENT | 246 | .trace = ftrace_raw_output_##call, \ |
240 | #define DEFINE_EVENT(template, name, proto, args) \ | 247 | }; |
241 | static notrace enum print_line_t \ | ||
242 | ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \ | ||
243 | { \ | ||
244 | return ftrace_raw_output_id_##template(event_##name.id, \ | ||
245 | #name, iter, flags); \ | ||
246 | } | ||
247 | 248 | ||
248 | #undef DEFINE_EVENT_PRINT | 249 | #undef DEFINE_EVENT_PRINT |
249 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ | 250 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ |
250 | static notrace enum print_line_t \ | 251 | static notrace enum print_line_t \ |
251 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | 252 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ |
253 | struct trace_event *event) \ | ||
252 | { \ | 254 | { \ |
253 | struct trace_seq *s = &iter->seq; \ | 255 | struct trace_seq *s = &iter->seq; \ |
254 | struct ftrace_raw_##template *field; \ | 256 | struct ftrace_raw_##template *field; \ |
@@ -258,7 +260,7 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | |||
258 | \ | 260 | \ |
259 | entry = iter->ent; \ | 261 | entry = iter->ent; \ |
260 | \ | 262 | \ |
261 | if (entry->type != event_##call.id) { \ | 263 | if (entry->type != event_##call.event.type) { \ |
262 | WARN_ON_ONCE(1); \ | 264 | WARN_ON_ONCE(1); \ |
263 | return TRACE_TYPE_UNHANDLED; \ | 265 | return TRACE_TYPE_UNHANDLED; \ |
264 | } \ | 266 | } \ |
@@ -275,7 +277,10 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | |||
275 | return TRACE_TYPE_PARTIAL_LINE; \ | 277 | return TRACE_TYPE_PARTIAL_LINE; \ |
276 | \ | 278 | \ |
277 | return TRACE_TYPE_HANDLED; \ | 279 | return TRACE_TYPE_HANDLED; \ |
278 | } | 280 | } \ |
281 | static struct trace_event_functions ftrace_event_type_funcs_##call = { \ | ||
282 | .trace = ftrace_raw_output_##call, \ | ||
283 | }; | ||
279 | 284 | ||
280 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 285 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
281 | 286 | ||
@@ -381,80 +386,18 @@ static inline notrace int ftrace_get_offsets_##call( \ | |||
381 | 386 | ||
382 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 387 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
383 | 388 | ||
384 | #ifdef CONFIG_PERF_EVENTS | ||
385 | |||
386 | /* | ||
387 | * Generate the functions needed for tracepoint perf_event support. | ||
388 | * | ||
389 | * NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later | ||
390 | * | ||
391 | * static int ftrace_profile_enable_<call>(void) | ||
392 | * { | ||
393 | * return register_trace_<call>(ftrace_profile_<call>); | ||
394 | * } | ||
395 | * | ||
396 | * static void ftrace_profile_disable_<call>(void) | ||
397 | * { | ||
398 | * unregister_trace_<call>(ftrace_profile_<call>); | ||
399 | * } | ||
400 | * | ||
401 | */ | ||
402 | |||
403 | #undef DECLARE_EVENT_CLASS | ||
404 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) | ||
405 | |||
406 | #undef DEFINE_EVENT | ||
407 | #define DEFINE_EVENT(template, name, proto, args) \ | ||
408 | \ | ||
409 | static void perf_trace_##name(proto); \ | ||
410 | \ | ||
411 | static notrace int \ | ||
412 | perf_trace_enable_##name(struct ftrace_event_call *unused) \ | ||
413 | { \ | ||
414 | return register_trace_##name(perf_trace_##name); \ | ||
415 | } \ | ||
416 | \ | ||
417 | static notrace void \ | ||
418 | perf_trace_disable_##name(struct ftrace_event_call *unused) \ | ||
419 | { \ | ||
420 | unregister_trace_##name(perf_trace_##name); \ | ||
421 | } | ||
422 | |||
423 | #undef DEFINE_EVENT_PRINT | ||
424 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
425 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
426 | |||
427 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||
428 | |||
429 | #endif /* CONFIG_PERF_EVENTS */ | ||
430 | |||
431 | /* | 389 | /* |
432 | * Stage 4 of the trace events. | 390 | * Stage 4 of the trace events. |
433 | * | 391 | * |
434 | * Override the macros in <trace/trace_events.h> to include the following: | 392 | * Override the macros in <trace/trace_events.h> to include the following: |
435 | * | 393 | * |
436 | * static void ftrace_event_<call>(proto) | ||
437 | * { | ||
438 | * event_trace_printk(_RET_IP_, "<call>: " <fmt>); | ||
439 | * } | ||
440 | * | ||
441 | * static int ftrace_reg_event_<call>(struct ftrace_event_call *unused) | ||
442 | * { | ||
443 | * return register_trace_<call>(ftrace_event_<call>); | ||
444 | * } | ||
445 | * | ||
446 | * static void ftrace_unreg_event_<call>(struct ftrace_event_call *unused) | ||
447 | * { | ||
448 | * unregister_trace_<call>(ftrace_event_<call>); | ||
449 | * } | ||
450 | * | ||
451 | * | ||
452 | * For those macros defined with TRACE_EVENT: | 394 | * For those macros defined with TRACE_EVENT: |
453 | * | 395 | * |
454 | * static struct ftrace_event_call event_<call>; | 396 | * static struct ftrace_event_call event_<call>; |
455 | * | 397 | * |
456 | * static void ftrace_raw_event_<call>(proto) | 398 | * static void ftrace_raw_event_<call>(void *__data, proto) |
457 | * { | 399 | * { |
400 | * struct ftrace_event_call *event_call = __data; | ||
458 | * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; | 401 | * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; |
459 | * struct ring_buffer_event *event; | 402 | * struct ring_buffer_event *event; |
460 | * struct ftrace_raw_<call> *entry; <-- defined in stage 1 | 403 | * struct ftrace_raw_<call> *entry; <-- defined in stage 1 |
@@ -469,7 +412,7 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \ | |||
469 | * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args); | 412 | * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args); |
470 | * | 413 | * |
471 | * event = trace_current_buffer_lock_reserve(&buffer, | 414 | * event = trace_current_buffer_lock_reserve(&buffer, |
472 | * event_<call>.id, | 415 | * event_<call>->event.type, |
473 | * sizeof(*entry) + __data_size, | 416 | * sizeof(*entry) + __data_size, |
474 | * irq_flags, pc); | 417 | * irq_flags, pc); |
475 | * if (!event) | 418 | * if (!event) |
@@ -484,43 +427,42 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \ | |||
484 | * event, irq_flags, pc); | 427 | * event, irq_flags, pc); |
485 | * } | 428 | * } |
486 | * | 429 | * |
487 | * static int ftrace_raw_reg_event_<call>(struct ftrace_event_call *unused) | ||
488 | * { | ||
489 | * return register_trace_<call>(ftrace_raw_event_<call>); | ||
490 | * } | ||
491 | * | ||
492 | * static void ftrace_unreg_event_<call>(struct ftrace_event_call *unused) | ||
493 | * { | ||
494 | * unregister_trace_<call>(ftrace_raw_event_<call>); | ||
495 | * } | ||
496 | * | ||
497 | * static struct trace_event ftrace_event_type_<call> = { | 430 | * static struct trace_event ftrace_event_type_<call> = { |
498 | * .trace = ftrace_raw_output_<call>, <-- stage 2 | 431 | * .trace = ftrace_raw_output_<call>, <-- stage 2 |
499 | * }; | 432 | * }; |
500 | * | 433 | * |
501 | * static const char print_fmt_<call>[] = <TP_printk>; | 434 | * static const char print_fmt_<call>[] = <TP_printk>; |
502 | * | 435 | * |
436 | * static struct ftrace_event_class __used event_class_<template> = { | ||
437 | * .system = "<system>", | ||
438 | * .define_fields = ftrace_define_fields_<call>, | ||
439 | * .fields = LIST_HEAD_INIT(event_class_##call.fields), | ||
440 | * .raw_init = trace_event_raw_init, | ||
441 | * .probe = ftrace_raw_event_##call, | ||
442 | * }; | ||
443 | * | ||
503 | * static struct ftrace_event_call __used | 444 | * static struct ftrace_event_call __used |
504 | * __attribute__((__aligned__(4))) | 445 | * __attribute__((__aligned__(4))) |
505 | * __attribute__((section("_ftrace_events"))) event_<call> = { | 446 | * __attribute__((section("_ftrace_events"))) event_<call> = { |
506 | * .name = "<call>", | 447 | * .name = "<call>", |
507 | * .system = "<system>", | 448 | * .class = event_class_<template>, |
508 | * .raw_init = trace_event_raw_init, | 449 | * .event = &ftrace_event_type_<call>, |
509 | * .regfunc = ftrace_reg_event_<call>, | ||
510 | * .unregfunc = ftrace_unreg_event_<call>, | ||
511 | * .print_fmt = print_fmt_<call>, | 450 | * .print_fmt = print_fmt_<call>, |
512 | * .define_fields = ftrace_define_fields_<call>, | 451 | * }; |
513 | * } | ||
514 | * | 452 | * |
515 | */ | 453 | */ |
516 | 454 | ||
517 | #ifdef CONFIG_PERF_EVENTS | 455 | #ifdef CONFIG_PERF_EVENTS |
518 | 456 | ||
457 | #define _TRACE_PERF_PROTO(call, proto) \ | ||
458 | static notrace void \ | ||
459 | perf_trace_##call(void *__data, proto); | ||
460 | |||
519 | #define _TRACE_PERF_INIT(call) \ | 461 | #define _TRACE_PERF_INIT(call) \ |
520 | .perf_event_enable = perf_trace_enable_##call, \ | 462 | .perf_probe = perf_trace_##call, |
521 | .perf_event_disable = perf_trace_disable_##call, | ||
522 | 463 | ||
523 | #else | 464 | #else |
465 | #define _TRACE_PERF_PROTO(call, proto) | ||
524 | #define _TRACE_PERF_INIT(call) | 466 | #define _TRACE_PERF_INIT(call) |
525 | #endif /* CONFIG_PERF_EVENTS */ | 467 | #endif /* CONFIG_PERF_EVENTS */ |
526 | 468 | ||
@@ -554,9 +496,9 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \ | |||
554 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | 496 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ |
555 | \ | 497 | \ |
556 | static notrace void \ | 498 | static notrace void \ |
557 | ftrace_raw_event_id_##call(struct ftrace_event_call *event_call, \ | 499 | ftrace_raw_event_##call(void *__data, proto) \ |
558 | proto) \ | ||
559 | { \ | 500 | { \ |
501 | struct ftrace_event_call *event_call = __data; \ | ||
560 | struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ | 502 | struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ |
561 | struct ring_buffer_event *event; \ | 503 | struct ring_buffer_event *event; \ |
562 | struct ftrace_raw_##call *entry; \ | 504 | struct ftrace_raw_##call *entry; \ |
@@ -571,7 +513,7 @@ ftrace_raw_event_id_##call(struct ftrace_event_call *event_call, \ | |||
571 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ | 513 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ |
572 | \ | 514 | \ |
573 | event = trace_current_buffer_lock_reserve(&buffer, \ | 515 | event = trace_current_buffer_lock_reserve(&buffer, \ |
574 | event_call->id, \ | 516 | event_call->event.type, \ |
575 | sizeof(*entry) + __data_size, \ | 517 | sizeof(*entry) + __data_size, \ |
576 | irq_flags, pc); \ | 518 | irq_flags, pc); \ |
577 | if (!event) \ | 519 | if (!event) \ |
@@ -586,34 +528,21 @@ ftrace_raw_event_id_##call(struct ftrace_event_call *event_call, \ | |||
586 | trace_nowake_buffer_unlock_commit(buffer, \ | 528 | trace_nowake_buffer_unlock_commit(buffer, \ |
587 | event, irq_flags, pc); \ | 529 | event, irq_flags, pc); \ |
588 | } | 530 | } |
531 | /* | ||
532 | * The ftrace_test_probe is compiled out, it is only here as a build time check | ||
533 | * to make sure that if the tracepoint handling changes, the ftrace probe will | ||
534 | * fail to compile unless it too is updated. | ||
535 | */ | ||
589 | 536 | ||
590 | #undef DEFINE_EVENT | 537 | #undef DEFINE_EVENT |
591 | #define DEFINE_EVENT(template, call, proto, args) \ | 538 | #define DEFINE_EVENT(template, call, proto, args) \ |
592 | \ | 539 | static inline void ftrace_test_probe_##call(void) \ |
593 | static notrace void ftrace_raw_event_##call(proto) \ | ||
594 | { \ | ||
595 | ftrace_raw_event_id_##template(&event_##call, args); \ | ||
596 | } \ | ||
597 | \ | ||
598 | static notrace int \ | ||
599 | ftrace_raw_reg_event_##call(struct ftrace_event_call *unused) \ | ||
600 | { \ | 540 | { \ |
601 | return register_trace_##call(ftrace_raw_event_##call); \ | 541 | check_trace_callback_type_##call(ftrace_raw_event_##template); \ |
602 | } \ | 542 | } |
603 | \ | ||
604 | static notrace void \ | ||
605 | ftrace_raw_unreg_event_##call(struct ftrace_event_call *unused) \ | ||
606 | { \ | ||
607 | unregister_trace_##call(ftrace_raw_event_##call); \ | ||
608 | } \ | ||
609 | \ | ||
610 | static struct trace_event ftrace_event_type_##call = { \ | ||
611 | .trace = ftrace_raw_output_##call, \ | ||
612 | }; | ||
613 | 543 | ||
614 | #undef DEFINE_EVENT_PRINT | 544 | #undef DEFINE_EVENT_PRINT |
615 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | 545 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) |
616 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
617 | 546 | ||
618 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 547 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
619 | 548 | ||
@@ -630,7 +559,16 @@ static struct trace_event ftrace_event_type_##call = { \ | |||
630 | 559 | ||
631 | #undef DECLARE_EVENT_CLASS | 560 | #undef DECLARE_EVENT_CLASS |
632 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | 561 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ |
633 | static const char print_fmt_##call[] = print; | 562 | _TRACE_PERF_PROTO(call, PARAMS(proto)); \ |
563 | static const char print_fmt_##call[] = print; \ | ||
564 | static struct ftrace_event_class __used event_class_##call = { \ | ||
565 | .system = __stringify(TRACE_SYSTEM), \ | ||
566 | .define_fields = ftrace_define_fields_##call, \ | ||
567 | .fields = LIST_HEAD_INIT(event_class_##call.fields),\ | ||
568 | .raw_init = trace_event_raw_init, \ | ||
569 | .probe = ftrace_raw_event_##call, \ | ||
570 | _TRACE_PERF_INIT(call) \ | ||
571 | }; | ||
634 | 572 | ||
635 | #undef DEFINE_EVENT | 573 | #undef DEFINE_EVENT |
636 | #define DEFINE_EVENT(template, call, proto, args) \ | 574 | #define DEFINE_EVENT(template, call, proto, args) \ |
@@ -639,15 +577,10 @@ static struct ftrace_event_call __used \ | |||
639 | __attribute__((__aligned__(4))) \ | 577 | __attribute__((__aligned__(4))) \ |
640 | __attribute__((section("_ftrace_events"))) event_##call = { \ | 578 | __attribute__((section("_ftrace_events"))) event_##call = { \ |
641 | .name = #call, \ | 579 | .name = #call, \ |
642 | .system = __stringify(TRACE_SYSTEM), \ | 580 | .class = &event_class_##template, \ |
643 | .event = &ftrace_event_type_##call, \ | 581 | .event.funcs = &ftrace_event_type_funcs_##template, \ |
644 | .raw_init = trace_event_raw_init, \ | ||
645 | .regfunc = ftrace_raw_reg_event_##call, \ | ||
646 | .unregfunc = ftrace_raw_unreg_event_##call, \ | ||
647 | .print_fmt = print_fmt_##template, \ | 582 | .print_fmt = print_fmt_##template, \ |
648 | .define_fields = ftrace_define_fields_##template, \ | 583 | }; |
649 | _TRACE_PERF_INIT(call) \ | ||
650 | } | ||
651 | 584 | ||
652 | #undef DEFINE_EVENT_PRINT | 585 | #undef DEFINE_EVENT_PRINT |
653 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ | 586 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ |
@@ -658,14 +591,9 @@ static struct ftrace_event_call __used \ | |||
658 | __attribute__((__aligned__(4))) \ | 591 | __attribute__((__aligned__(4))) \ |
659 | __attribute__((section("_ftrace_events"))) event_##call = { \ | 592 | __attribute__((section("_ftrace_events"))) event_##call = { \ |
660 | .name = #call, \ | 593 | .name = #call, \ |
661 | .system = __stringify(TRACE_SYSTEM), \ | 594 | .class = &event_class_##template, \ |
662 | .event = &ftrace_event_type_##call, \ | 595 | .event.funcs = &ftrace_event_type_funcs_##call, \ |
663 | .raw_init = trace_event_raw_init, \ | ||
664 | .regfunc = ftrace_raw_reg_event_##call, \ | ||
665 | .unregfunc = ftrace_raw_unreg_event_##call, \ | ||
666 | .print_fmt = print_fmt_##call, \ | 596 | .print_fmt = print_fmt_##call, \ |
667 | .define_fields = ftrace_define_fields_##template, \ | ||
668 | _TRACE_PERF_INIT(call) \ | ||
669 | } | 597 | } |
670 | 598 | ||
671 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 599 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
@@ -765,17 +693,20 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
765 | #undef DECLARE_EVENT_CLASS | 693 | #undef DECLARE_EVENT_CLASS |
766 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | 694 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ |
767 | static notrace void \ | 695 | static notrace void \ |
768 | perf_trace_templ_##call(struct ftrace_event_call *event_call, \ | 696 | perf_trace_##call(void *__data, proto) \ |
769 | struct pt_regs *__regs, proto) \ | ||
770 | { \ | 697 | { \ |
698 | struct ftrace_event_call *event_call = __data; \ | ||
771 | struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ | 699 | struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ |
772 | struct ftrace_raw_##call *entry; \ | 700 | struct ftrace_raw_##call *entry; \ |
701 | struct pt_regs __regs; \ | ||
773 | u64 __addr = 0, __count = 1; \ | 702 | u64 __addr = 0, __count = 1; \ |
774 | unsigned long irq_flags; \ | 703 | struct hlist_head *head; \ |
775 | int __entry_size; \ | 704 | int __entry_size; \ |
776 | int __data_size; \ | 705 | int __data_size; \ |
777 | int rctx; \ | 706 | int rctx; \ |
778 | \ | 707 | \ |
708 | perf_fetch_caller_regs(&__regs, 1); \ | ||
709 | \ | ||
779 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ | 710 | __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ |
780 | __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ | 711 | __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ |
781 | sizeof(u64)); \ | 712 | sizeof(u64)); \ |
@@ -784,32 +715,34 @@ perf_trace_templ_##call(struct ftrace_event_call *event_call, \ | |||
784 | if (WARN_ONCE(__entry_size > PERF_MAX_TRACE_SIZE, \ | 715 | if (WARN_ONCE(__entry_size > PERF_MAX_TRACE_SIZE, \ |
785 | "profile buffer not large enough")) \ | 716 | "profile buffer not large enough")) \ |
786 | return; \ | 717 | return; \ |
718 | \ | ||
787 | entry = (struct ftrace_raw_##call *)perf_trace_buf_prepare( \ | 719 | entry = (struct ftrace_raw_##call *)perf_trace_buf_prepare( \ |
788 | __entry_size, event_call->id, &rctx, &irq_flags); \ | 720 | __entry_size, event_call->event.type, &__regs, &rctx); \ |
789 | if (!entry) \ | 721 | if (!entry) \ |
790 | return; \ | 722 | return; \ |
723 | \ | ||
791 | tstruct \ | 724 | tstruct \ |
792 | \ | 725 | \ |
793 | { assign; } \ | 726 | { assign; } \ |
794 | \ | 727 | \ |
728 | head = this_cpu_ptr(event_call->perf_events); \ | ||
795 | perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ | 729 | perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ |
796 | __count, irq_flags, __regs); \ | 730 | __count, &__regs, head); \ |
797 | } | 731 | } |
798 | 732 | ||
733 | /* | ||
734 | * This part is compiled out, it is only here as a build time check | ||
735 | * to make sure that if the tracepoint handling changes, the | ||
736 | * perf probe will fail to compile unless it too is updated. | ||
737 | */ | ||
799 | #undef DEFINE_EVENT | 738 | #undef DEFINE_EVENT |
800 | #define DEFINE_EVENT(template, call, proto, args) \ | 739 | #define DEFINE_EVENT(template, call, proto, args) \ |
801 | static notrace void perf_trace_##call(proto) \ | 740 | static inline void perf_test_probe_##call(void) \ |
802 | { \ | 741 | { \ |
803 | struct ftrace_event_call *event_call = &event_##call; \ | 742 | check_trace_callback_type_##call(perf_trace_##template); \ |
804 | struct pt_regs *__regs = &get_cpu_var(perf_trace_regs); \ | ||
805 | \ | ||
806 | perf_fetch_caller_regs(__regs, 1); \ | ||
807 | \ | ||
808 | perf_trace_templ_##template(event_call, __regs, args); \ | ||
809 | \ | ||
810 | put_cpu_var(perf_trace_regs); \ | ||
811 | } | 743 | } |
812 | 744 | ||
745 | |||
813 | #undef DEFINE_EVENT_PRINT | 746 | #undef DEFINE_EVENT_PRINT |
814 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | 747 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ |
815 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | 748 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) |
diff --git a/include/trace/syscall.h b/include/trace/syscall.h index e5e5f48dbfb3..257e08960d7b 100644 --- a/include/trace/syscall.h +++ b/include/trace/syscall.h | |||
@@ -25,6 +25,8 @@ struct syscall_metadata { | |||
25 | int nb_args; | 25 | int nb_args; |
26 | const char **types; | 26 | const char **types; |
27 | const char **args; | 27 | const char **args; |
28 | struct list_head enter_fields; | ||
29 | struct list_head exit_fields; | ||
28 | 30 | ||
29 | struct ftrace_event_call *enter_event; | 31 | struct ftrace_event_call *enter_event; |
30 | struct ftrace_event_call *exit_event; | 32 | struct ftrace_event_call *exit_event; |
@@ -34,16 +36,16 @@ struct syscall_metadata { | |||
34 | extern unsigned long arch_syscall_addr(int nr); | 36 | extern unsigned long arch_syscall_addr(int nr); |
35 | extern int init_syscall_trace(struct ftrace_event_call *call); | 37 | extern int init_syscall_trace(struct ftrace_event_call *call); |
36 | 38 | ||
37 | extern int syscall_enter_define_fields(struct ftrace_event_call *call); | ||
38 | extern int syscall_exit_define_fields(struct ftrace_event_call *call); | ||
39 | extern int reg_event_syscall_enter(struct ftrace_event_call *call); | 39 | extern int reg_event_syscall_enter(struct ftrace_event_call *call); |
40 | extern void unreg_event_syscall_enter(struct ftrace_event_call *call); | 40 | extern void unreg_event_syscall_enter(struct ftrace_event_call *call); |
41 | extern int reg_event_syscall_exit(struct ftrace_event_call *call); | 41 | extern int reg_event_syscall_exit(struct ftrace_event_call *call); |
42 | extern void unreg_event_syscall_exit(struct ftrace_event_call *call); | 42 | extern void unreg_event_syscall_exit(struct ftrace_event_call *call); |
43 | extern int | 43 | extern int |
44 | ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s); | 44 | ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s); |
45 | enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags); | 45 | enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags, |
46 | enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags); | 46 | struct trace_event *event); |
47 | enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags, | ||
48 | struct trace_event *event); | ||
47 | #endif | 49 | #endif |
48 | 50 | ||
49 | #ifdef CONFIG_PERF_EVENTS | 51 | #ifdef CONFIG_PERF_EVENTS |