1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef _LINUX_PERF_EVENT_H
15#define _LINUX_PERF_EVENT_H
16
17#include <linux/types.h>
18#include <linux/ioctl.h>
19#include <asm/byteorder.h>
20
21
22
23
24
25
26
27
28enum perf_type_id {
29 PERF_TYPE_HARDWARE = 0,
30 PERF_TYPE_SOFTWARE = 1,
31 PERF_TYPE_TRACEPOINT = 2,
32 PERF_TYPE_HW_CACHE = 3,
33 PERF_TYPE_RAW = 4,
34 PERF_TYPE_BREAKPOINT = 5,
35
36 PERF_TYPE_MAX,
37};
38
39
40
41
42
43
44enum perf_hw_id {
45
46
47
48 PERF_COUNT_HW_CPU_CYCLES = 0,
49 PERF_COUNT_HW_INSTRUCTIONS = 1,
50 PERF_COUNT_HW_CACHE_REFERENCES = 2,
51 PERF_COUNT_HW_CACHE_MISSES = 3,
52 PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4,
53 PERF_COUNT_HW_BRANCH_MISSES = 5,
54 PERF_COUNT_HW_BUS_CYCLES = 6,
55
56 PERF_COUNT_HW_MAX,
57};
58
59
60
61
62
63
64
65
66enum perf_hw_cache_id {
67 PERF_COUNT_HW_CACHE_L1D = 0,
68 PERF_COUNT_HW_CACHE_L1I = 1,
69 PERF_COUNT_HW_CACHE_LL = 2,
70 PERF_COUNT_HW_CACHE_DTLB = 3,
71 PERF_COUNT_HW_CACHE_ITLB = 4,
72 PERF_COUNT_HW_CACHE_BPU = 5,
73
74 PERF_COUNT_HW_CACHE_MAX,
75};
76
77enum perf_hw_cache_op_id {
78 PERF_COUNT_HW_CACHE_OP_READ = 0,
79 PERF_COUNT_HW_CACHE_OP_WRITE = 1,
80 PERF_COUNT_HW_CACHE_OP_PREFETCH = 2,
81
82 PERF_COUNT_HW_CACHE_OP_MAX,
83};
84
85enum perf_hw_cache_op_result_id {
86 PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0,
87 PERF_COUNT_HW_CACHE_RESULT_MISS = 1,
88
89 PERF_COUNT_HW_CACHE_RESULT_MAX,
90};
91
92
93
94
95
96
97
98enum perf_sw_ids {
99 PERF_COUNT_SW_CPU_CLOCK = 0,
100 PERF_COUNT_SW_TASK_CLOCK = 1,
101 PERF_COUNT_SW_PAGE_FAULTS = 2,
102 PERF_COUNT_SW_CONTEXT_SWITCHES = 3,
103 PERF_COUNT_SW_CPU_MIGRATIONS = 4,
104 PERF_COUNT_SW_PAGE_FAULTS_MIN = 5,
105 PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6,
106 PERF_COUNT_SW_ALIGNMENT_FAULTS = 7,
107 PERF_COUNT_SW_EMULATION_FAULTS = 8,
108
109 PERF_COUNT_SW_MAX,
110};
111
112
113
114
115
116enum perf_event_sample_format {
117 PERF_SAMPLE_IP = 1U << 0,
118 PERF_SAMPLE_TID = 1U << 1,
119 PERF_SAMPLE_TIME = 1U << 2,
120 PERF_SAMPLE_ADDR = 1U << 3,
121 PERF_SAMPLE_READ = 1U << 4,
122 PERF_SAMPLE_CALLCHAIN = 1U << 5,
123 PERF_SAMPLE_ID = 1U << 6,
124 PERF_SAMPLE_CPU = 1U << 7,
125 PERF_SAMPLE_PERIOD = 1U << 8,
126 PERF_SAMPLE_STREAM_ID = 1U << 9,
127 PERF_SAMPLE_RAW = 1U << 10,
128
129 PERF_SAMPLE_MAX = 1U << 11,
130};
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152enum perf_event_read_format {
153 PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0,
154 PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1,
155 PERF_FORMAT_ID = 1U << 2,
156 PERF_FORMAT_GROUP = 1U << 3,
157
158 PERF_FORMAT_MAX = 1U << 4,
159};
160
161#define PERF_ATTR_SIZE_VER0 64
162
163
164
165
166struct perf_event_attr {
167
168
169
170
171 __u32 type;
172
173
174
175
176 __u32 size;
177
178
179
180
181 __u64 config;
182
183 union {
184 __u64 sample_period;
185 __u64 sample_freq;
186 };
187
188 __u64 sample_type;
189 __u64 read_format;
190
191 __u64 disabled : 1,
192 inherit : 1,
193 pinned : 1,
194 exclusive : 1,
195 exclude_user : 1,
196 exclude_kernel : 1,
197 exclude_hv : 1,
198 exclude_idle : 1,
199 mmap : 1,
200 comm : 1,
201 freq : 1,
202 inherit_stat : 1,
203 enable_on_exec : 1,
204 task : 1,
205 watermark : 1,
206
207 __reserved_1 : 49;
208
209 union {
210 __u32 wakeup_events;
211 __u32 wakeup_watermark;
212 };
213
214 __u32 bp_type;
215 __u64 bp_addr;
216 __u64 bp_len;
217};
218
219
220
221
222#define PERF_EVENT_IOC_ENABLE _IO ('$', 0)
223#define PERF_EVENT_IOC_DISABLE _IO ('$', 1)
224#define PERF_EVENT_IOC_REFRESH _IO ('$', 2)
225#define PERF_EVENT_IOC_RESET _IO ('$', 3)
226#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64)
227#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5)
228#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *)
229
230enum perf_event_ioc_flags {
231 PERF_IOC_FLAG_GROUP = 1U << 0,
232};
233
234
235
236
237struct perf_event_mmap_page {
238 __u32 version;
239 __u32 compat_version;
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 __u32 lock;
264 __u32 index;
265 __s64 offset;
266 __u64 time_enabled;
267 __u64 time_running;
268
269
270
271
272
273 __u64 __reserved[123];
274
275
276
277
278
279
280
281
282
283
284
285
286 __u64 data_head;
287 __u64 data_tail;
288};
289
290#define PERF_RECORD_MISC_CPUMODE_MASK (3 << 0)
291#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0)
292#define PERF_RECORD_MISC_KERNEL (1 << 0)
293#define PERF_RECORD_MISC_USER (2 << 0)
294#define PERF_RECORD_MISC_HYPERVISOR (3 << 0)
295
296struct perf_event_header {
297 __u32 type;
298 __u16 misc;
299 __u16 size;
300};
301
302enum perf_event_type {
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318 PERF_RECORD_MMAP = 1,
319
320
321
322
323
324
325
326
327 PERF_RECORD_LOST = 2,
328
329
330
331
332
333
334
335
336
337 PERF_RECORD_COMM = 3,
338
339
340
341
342
343
344
345
346
347 PERF_RECORD_EXIT = 4,
348
349
350
351
352
353
354
355
356
357 PERF_RECORD_THROTTLE = 5,
358 PERF_RECORD_UNTHROTTLE = 6,
359
360
361
362
363
364
365
366
367
368 PERF_RECORD_FORK = 7,
369
370
371
372
373
374
375
376
377
378 PERF_RECORD_READ = 8,
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413 PERF_RECORD_SAMPLE = 9,
414
415 PERF_RECORD_MAX,
416};
417
418enum perf_callchain_context {
419 PERF_CONTEXT_HV = (__u64)-32,
420 PERF_CONTEXT_KERNEL = (__u64)-128,
421 PERF_CONTEXT_USER = (__u64)-512,
422
423 PERF_CONTEXT_GUEST = (__u64)-2048,
424 PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176,
425 PERF_CONTEXT_GUEST_USER = (__u64)-2560,
426
427 PERF_CONTEXT_MAX = (__u64)-4095,
428};
429
430#define PERF_FLAG_FD_NO_GROUP (1U << 0)
431#define PERF_FLAG_FD_OUTPUT (1U << 1)
432
433#ifdef __KERNEL__
434
435
436
437
438#ifdef CONFIG_PERF_EVENTS
439# include <asm/perf_event.h>
440#endif
441
442#ifdef CONFIG_HAVE_HW_BREAKPOINT
443#include <asm/hw_breakpoint.h>
444#endif
445
446#include <linux/list.h>
447#include <linux/mutex.h>
448#include <linux/rculist.h>
449#include <linux/rcupdate.h>
450#include <linux/spinlock.h>
451#include <linux/hrtimer.h>
452#include <linux/fs.h>
453#include <linux/pid_namespace.h>
454#include <linux/workqueue.h>
455#include <linux/ftrace.h>
456#include <linux/cpu.h>
457#include <asm/atomic.h>
458
459#define PERF_MAX_STACK_DEPTH 255
460
461struct perf_callchain_entry {
462 __u64 nr;
463 __u64 ip[PERF_MAX_STACK_DEPTH];
464};
465
466struct perf_raw_record {
467 u32 size;
468 void *data;
469};
470
471struct task_struct;
472
473
474
475
476struct hw_perf_event {
477#ifdef CONFIG_PERF_EVENTS
478 union {
479 struct {
480 u64 config;
481 u64 last_tag;
482 unsigned long config_base;
483 unsigned long event_base;
484 int idx;
485 int last_cpu;
486 };
487 struct {
488 s64 remaining;
489 struct hrtimer hrtimer;
490 };
491#ifdef CONFIG_HAVE_HW_BREAKPOINT
492
493 struct arch_hw_breakpoint info;
494#endif
495 };
496 atomic64_t prev_count;
497 u64 sample_period;
498 u64 last_period;
499 atomic64_t period_left;
500 u64 interrupts;
501
502 u64 freq_time_stamp;
503 u64 freq_count_stamp;
504#endif
505};
506
507struct perf_event;
508
509
510
511
512struct pmu {
513 int (*enable) (struct perf_event *event);
514 void (*disable) (struct perf_event *event);
515 int (*start) (struct perf_event *event);
516 void (*stop) (struct perf_event *event);
517 void (*read) (struct perf_event *event);
518 void (*unthrottle) (struct perf_event *event);
519};
520
521
522
523
524enum perf_event_active_state {
525 PERF_EVENT_STATE_ERROR = -2,
526 PERF_EVENT_STATE_OFF = -1,
527 PERF_EVENT_STATE_INACTIVE = 0,
528 PERF_EVENT_STATE_ACTIVE = 1,
529};
530
531struct file;
532
533struct perf_mmap_data {
534 atomic_t refcount;
535 struct rcu_head rcu_head;
536#ifdef CONFIG_PERF_USE_VMALLOC
537 struct work_struct work;
538#endif
539 int data_order;
540 int nr_pages;
541 int writable;
542
543 atomic_t poll;
544 atomic_t events;
545
546 atomic_long_t head;
547 atomic_long_t done_head;
548
549 atomic_t lock;
550 atomic_t wakeup;
551 atomic_t lost;
552
553 long watermark;
554
555 struct perf_event_mmap_page *user_page;
556 void *data_pages[0];
557};
558
559struct perf_pending_entry {
560 struct perf_pending_entry *next;
561 void (*func)(struct perf_pending_entry *);
562};
563
564struct perf_sample_data;
565
566typedef void (*perf_overflow_handler_t)(struct perf_event *, int,
567 struct perf_sample_data *,
568 struct pt_regs *regs);
569
570enum perf_group_flag {
571 PERF_GROUP_SOFTWARE = 0x1,
572};
573
574
575
576
577struct perf_event {
578#ifdef CONFIG_PERF_EVENTS
579 struct list_head group_entry;
580 struct list_head event_entry;
581 struct list_head sibling_list;
582 int nr_siblings;
583 int group_flags;
584 struct perf_event *group_leader;
585 const struct pmu *pmu;
586
587 enum perf_event_active_state state;
588 atomic64_t count;
589
590
591
592
593
594
595
596
597
598
599 u64 total_time_enabled;
600 u64 total_time_running;
601
602
603
604
605
606
607
608
609
610
611
612 u64 tstamp_enabled;
613 u64 tstamp_running;
614 u64 tstamp_stopped;
615
616 struct perf_event_attr attr;
617 struct hw_perf_event hw;
618
619 struct perf_event_context *ctx;
620 struct file *filp;
621
622
623
624
625
626 atomic64_t child_total_time_enabled;
627 atomic64_t child_total_time_running;
628
629
630
631
632 struct mutex child_mutex;
633 struct list_head child_list;
634 struct perf_event *parent;
635
636 int oncpu;
637 int cpu;
638
639 struct list_head owner_entry;
640 struct task_struct *owner;
641
642
643 struct mutex mmap_mutex;
644 atomic_t mmap_count;
645 int mmap_locked;
646 struct user_struct *mmap_user;
647 struct perf_mmap_data *data;
648
649
650 wait_queue_head_t waitq;
651 struct fasync_struct *fasync;
652
653
654 int pending_wakeup;
655 int pending_kill;
656 int pending_disable;
657 struct perf_pending_entry pending;
658
659 atomic_t event_limit;
660
661 void (*destroy)(struct perf_event *);
662 struct rcu_head rcu_head;
663
664 struct pid_namespace *ns;
665 u64 id;
666
667 perf_overflow_handler_t overflow_handler;
668
669#ifdef CONFIG_EVENT_TRACING
670 struct event_filter *filter;
671#endif
672
673#endif
674};
675
676
677
678
679
680
681struct perf_event_context {
682
683
684
685
686 raw_spinlock_t lock;
687
688
689
690
691
692 struct mutex mutex;
693
694 struct list_head pinned_groups;
695 struct list_head flexible_groups;
696 struct list_head event_list;
697 int nr_events;
698 int nr_active;
699 int is_active;
700 int nr_stat;
701 atomic_t refcount;
702 struct task_struct *task;
703
704
705
706
707 u64 time;
708 u64 timestamp;
709
710
711
712
713
714 struct perf_event_context *parent_ctx;
715 u64 parent_gen;
716 u64 generation;
717 int pin_count;
718 struct rcu_head rcu_head;
719};
720
721
722
723
724struct perf_cpu_context {
725 struct perf_event_context ctx;
726 struct perf_event_context *task_ctx;
727 int active_oncpu;
728 int max_pertask;
729 int exclusive;
730
731
732
733
734
735
736 int recursion[4];
737};
738
739struct perf_output_handle {
740 struct perf_event *event;
741 struct perf_mmap_data *data;
742 unsigned long head;
743 unsigned long offset;
744 int nmi;
745 int sample;
746 int locked;
747};
748
749#ifdef CONFIG_PERF_EVENTS
750
751
752
753
754extern int perf_max_events;
755
756extern const struct pmu *hw_perf_event_init(struct perf_event *event);
757
758extern void perf_event_task_sched_in(struct task_struct *task);
759extern void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next);
760extern void perf_event_task_tick(struct task_struct *task);
761extern int perf_event_init_task(struct task_struct *child);
762extern void perf_event_exit_task(struct task_struct *child);
763extern void perf_event_free_task(struct task_struct *task);
764extern void set_perf_event_pending(void);
765extern void perf_event_do_pending(void);
766extern void perf_event_print_debug(void);
767extern void __perf_disable(void);
768extern bool __perf_enable(void);
769extern void perf_disable(void);
770extern void perf_enable(void);
771extern int perf_event_task_disable(void);
772extern int perf_event_task_enable(void);
773extern int hw_perf_group_sched_in(struct perf_event *group_leader,
774 struct perf_cpu_context *cpuctx,
775 struct perf_event_context *ctx);
776extern void perf_event_update_userpage(struct perf_event *event);
777extern int perf_event_release_kernel(struct perf_event *event);
778extern struct perf_event *
779perf_event_create_kernel_counter(struct perf_event_attr *attr,
780 int cpu,
781 pid_t pid,
782 perf_overflow_handler_t callback);
783extern u64 perf_event_read_value(struct perf_event *event,
784 u64 *enabled, u64 *running);
785
786struct perf_sample_data {
787 u64 type;
788
789 u64 ip;
790 struct {
791 u32 pid;
792 u32 tid;
793 } tid_entry;
794 u64 time;
795 u64 addr;
796 u64 id;
797 u64 stream_id;
798 struct {
799 u32 cpu;
800 u32 reserved;
801 } cpu_entry;
802 u64 period;
803 struct perf_callchain_entry *callchain;
804 struct perf_raw_record *raw;
805};
806
807static inline
808void perf_sample_data_init(struct perf_sample_data *data, u64 addr)
809{
810 data->addr = addr;
811 data->raw = NULL;
812}
813
814extern void perf_output_sample(struct perf_output_handle *handle,
815 struct perf_event_header *header,
816 struct perf_sample_data *data,
817 struct perf_event *event);
818extern void perf_prepare_sample(struct perf_event_header *header,
819 struct perf_sample_data *data,
820 struct perf_event *event,
821 struct pt_regs *regs);
822
823extern int perf_event_overflow(struct perf_event *event, int nmi,
824 struct perf_sample_data *data,
825 struct pt_regs *regs);
826
827
828
829
830static inline int is_software_event(struct perf_event *event)
831{
832 switch (event->attr.type) {
833 case PERF_TYPE_SOFTWARE:
834 case PERF_TYPE_TRACEPOINT:
835
836 case PERF_TYPE_BREAKPOINT:
837 return 1;
838 }
839 return 0;
840}
841
842extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX];
843
844extern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64);
845
846extern void
847perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip);
848
849
850
851
852
853
854
855
856
857static inline void perf_fetch_caller_regs(struct pt_regs *regs, int skip)
858{
859 unsigned long ip;
860
861 memset(regs, 0, sizeof(*regs));
862
863 switch (skip) {
864 case 1 :
865 ip = CALLER_ADDR0;
866 break;
867 case 2 :
868 ip = CALLER_ADDR1;
869 break;
870 case 3 :
871 ip = CALLER_ADDR2;
872 break;
873 case 4:
874 ip = CALLER_ADDR3;
875 break;
876
877 default:
878 ip = 0;
879 }
880
881 return perf_arch_fetch_caller_regs(regs, ip, skip);
882}
883
884static inline void
885perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)
886{
887 if (atomic_read(&perf_swevent_enabled[event_id])) {
888 struct pt_regs hot_regs;
889
890 if (!regs) {
891 perf_fetch_caller_regs(&hot_regs, 1);
892 regs = &hot_regs;
893 }
894 __perf_sw_event(event_id, nr, nmi, regs, addr);
895 }
896}
897
898extern void __perf_event_mmap(struct vm_area_struct *vma);
899
900static inline void perf_event_mmap(struct vm_area_struct *vma)
901{
902 if (vma->vm_flags & VM_EXEC)
903 __perf_event_mmap(vma);
904}
905
906extern void perf_event_comm(struct task_struct *tsk);
907extern void perf_event_fork(struct task_struct *tsk);
908
909extern struct perf_callchain_entry *perf_callchain(struct pt_regs *regs);
910
911extern int sysctl_perf_event_paranoid;
912extern int sysctl_perf_event_mlock;
913extern int sysctl_perf_event_sample_rate;
914
915static inline bool perf_paranoid_tracepoint_raw(void)
916{
917 return sysctl_perf_event_paranoid > -1;
918}
919
920static inline bool perf_paranoid_cpu(void)
921{
922 return sysctl_perf_event_paranoid > 0;
923}
924
925static inline bool perf_paranoid_kernel(void)
926{
927 return sysctl_perf_event_paranoid > 1;
928}
929
930extern void perf_event_init(void);
931extern void perf_tp_event(int event_id, u64 addr, u64 count, void *record,
932 int entry_size, struct pt_regs *regs);
933extern void perf_bp_event(struct perf_event *event, void *data);
934
935#ifndef perf_misc_flags
936#define perf_misc_flags(regs) (user_mode(regs) ? PERF_RECORD_MISC_USER : \
937 PERF_RECORD_MISC_KERNEL)
938#define perf_instruction_pointer(regs) instruction_pointer(regs)
939#endif
940
941extern int perf_output_begin(struct perf_output_handle *handle,
942 struct perf_event *event, unsigned int size,
943 int nmi, int sample);
944extern void perf_output_end(struct perf_output_handle *handle);
945extern void perf_output_copy(struct perf_output_handle *handle,
946 const void *buf, unsigned int len);
947extern int perf_swevent_get_recursion_context(void);
948extern void perf_swevent_put_recursion_context(int rctx);
949extern void perf_event_enable(struct perf_event *event);
950extern void perf_event_disable(struct perf_event *event);
951#else
952static inline void
953perf_event_task_sched_in(struct task_struct *task) { }
954static inline void
955perf_event_task_sched_out(struct task_struct *task,
956 struct task_struct *next) { }
957static inline void
958perf_event_task_tick(struct task_struct *task) { }
959static inline int perf_event_init_task(struct task_struct *child) { return 0; }
960static inline void perf_event_exit_task(struct task_struct *child) { }
961static inline void perf_event_free_task(struct task_struct *task) { }
962static inline void perf_event_do_pending(void) { }
963static inline void perf_event_print_debug(void) { }
964static inline void perf_disable(void) { }
965static inline void perf_enable(void) { }
966static inline int perf_event_task_disable(void) { return -EINVAL; }
967static inline int perf_event_task_enable(void) { return -EINVAL; }
968
969static inline void
970perf_sw_event(u32 event_id, u64 nr, int nmi,
971 struct pt_regs *regs, u64 addr) { }
972static inline void
973perf_bp_event(struct perf_event *event, void *data) { }
974
975static inline void perf_event_mmap(struct vm_area_struct *vma) { }
976static inline void perf_event_comm(struct task_struct *tsk) { }
977static inline void perf_event_fork(struct task_struct *tsk) { }
978static inline void perf_event_init(void) { }
979static inline int perf_swevent_get_recursion_context(void) { return -1; }
980static inline void perf_swevent_put_recursion_context(int rctx) { }
981static inline void perf_event_enable(struct perf_event *event) { }
982static inline void perf_event_disable(struct perf_event *event) { }
983#endif
984
985#define perf_output_put(handle, x) \
986 perf_output_copy((handle), &(x), sizeof(x))
987
988
989
990
991#define perf_cpu_notifier(fn) \
992do { \
993 static struct notifier_block fn##_nb __cpuinitdata = \
994 { .notifier_call = fn, .priority = 20 }; \
995 fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \
996 (void *)(unsigned long)smp_processor_id()); \
997 fn(&fn##_nb, (unsigned long)CPU_STARTING, \
998 (void *)(unsigned long)smp_processor_id()); \
999 fn(&fn##_nb, (unsigned long)CPU_ONLINE, \
1000 (void *)(unsigned long)smp_processor_id()); \
1001 register_cpu_notifier(&fn##_nb); \
1002} while (0)
1003
1004#endif
1005#endif
1006