diff options
Diffstat (limited to 'include/linux/perf_event.h')
-rw-r--r-- | include/linux/perf_event.h | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 7f87563c8485..43adbd7f0010 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -18,6 +18,10 @@ | |||
18 | #include <linux/ioctl.h> | 18 | #include <linux/ioctl.h> |
19 | #include <asm/byteorder.h> | 19 | #include <asm/byteorder.h> |
20 | 20 | ||
21 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | ||
22 | #include <asm/hw_breakpoint.h> | ||
23 | #endif | ||
24 | |||
21 | /* | 25 | /* |
22 | * User-space ABI bits: | 26 | * User-space ABI bits: |
23 | */ | 27 | */ |
@@ -31,6 +35,7 @@ enum perf_type_id { | |||
31 | PERF_TYPE_TRACEPOINT = 2, | 35 | PERF_TYPE_TRACEPOINT = 2, |
32 | PERF_TYPE_HW_CACHE = 3, | 36 | PERF_TYPE_HW_CACHE = 3, |
33 | PERF_TYPE_RAW = 4, | 37 | PERF_TYPE_RAW = 4, |
38 | PERF_TYPE_BREAKPOINT = 5, | ||
34 | 39 | ||
35 | PERF_TYPE_MAX, /* non-ABI */ | 40 | PERF_TYPE_MAX, /* non-ABI */ |
36 | }; | 41 | }; |
@@ -209,6 +214,15 @@ struct perf_event_attr { | |||
209 | __u32 wakeup_events; /* wakeup every n events */ | 214 | __u32 wakeup_events; /* wakeup every n events */ |
210 | __u32 wakeup_watermark; /* bytes before wakeup */ | 215 | __u32 wakeup_watermark; /* bytes before wakeup */ |
211 | }; | 216 | }; |
217 | |||
218 | union { | ||
219 | struct { /* Hardware breakpoint info */ | ||
220 | __u64 bp_addr; | ||
221 | __u32 bp_type; | ||
222 | __u32 bp_len; | ||
223 | }; | ||
224 | }; | ||
225 | |||
212 | __u32 __reserved_2; | 226 | __u32 __reserved_2; |
213 | 227 | ||
214 | __u64 __reserved_3; | 228 | __u64 __reserved_3; |
@@ -478,6 +492,11 @@ struct hw_perf_event { | |||
478 | s64 remaining; | 492 | s64 remaining; |
479 | struct hrtimer hrtimer; | 493 | struct hrtimer hrtimer; |
480 | }; | 494 | }; |
495 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | ||
496 | union { /* breakpoint */ | ||
497 | struct arch_hw_breakpoint info; | ||
498 | }; | ||
499 | #endif | ||
481 | }; | 500 | }; |
482 | atomic64_t prev_count; | 501 | atomic64_t prev_count; |
483 | u64 sample_period; | 502 | u64 sample_period; |
@@ -546,6 +565,10 @@ struct perf_pending_entry { | |||
546 | void (*func)(struct perf_pending_entry *); | 565 | void (*func)(struct perf_pending_entry *); |
547 | }; | 566 | }; |
548 | 567 | ||
568 | typedef void (*perf_callback_t)(struct perf_event *, void *); | ||
569 | |||
570 | struct perf_sample_data; | ||
571 | |||
549 | /** | 572 | /** |
550 | * struct perf_event - performance event kernel representation: | 573 | * struct perf_event - performance event kernel representation: |
551 | */ | 574 | */ |
@@ -588,7 +611,7 @@ struct perf_event { | |||
588 | u64 tstamp_running; | 611 | u64 tstamp_running; |
589 | u64 tstamp_stopped; | 612 | u64 tstamp_stopped; |
590 | 613 | ||
591 | struct perf_event_attr attr; | 614 | struct perf_event_attr attr; |
592 | struct hw_perf_event hw; | 615 | struct hw_perf_event hw; |
593 | 616 | ||
594 | struct perf_event_context *ctx; | 617 | struct perf_event_context *ctx; |
@@ -637,10 +660,18 @@ struct perf_event { | |||
637 | struct pid_namespace *ns; | 660 | struct pid_namespace *ns; |
638 | u64 id; | 661 | u64 id; |
639 | 662 | ||
663 | void (*overflow_handler)(struct perf_event *event, | ||
664 | int nmi, struct perf_sample_data *data, | ||
665 | struct pt_regs *regs); | ||
666 | |||
640 | #ifdef CONFIG_EVENT_PROFILE | 667 | #ifdef CONFIG_EVENT_PROFILE |
641 | struct event_filter *filter; | 668 | struct event_filter *filter; |
642 | #endif | 669 | #endif |
643 | 670 | ||
671 | perf_callback_t callback; | ||
672 | |||
673 | perf_callback_t event_callback; | ||
674 | |||
644 | #endif /* CONFIG_PERF_EVENTS */ | 675 | #endif /* CONFIG_PERF_EVENTS */ |
645 | }; | 676 | }; |
646 | 677 | ||
@@ -745,6 +776,14 @@ extern int hw_perf_group_sched_in(struct perf_event *group_leader, | |||
745 | struct perf_cpu_context *cpuctx, | 776 | struct perf_cpu_context *cpuctx, |
746 | struct perf_event_context *ctx, int cpu); | 777 | struct perf_event_context *ctx, int cpu); |
747 | extern void perf_event_update_userpage(struct perf_event *event); | 778 | extern void perf_event_update_userpage(struct perf_event *event); |
779 | extern int perf_event_release_kernel(struct perf_event *event); | ||
780 | extern struct perf_event * | ||
781 | perf_event_create_kernel_counter(struct perf_event_attr *attr, | ||
782 | int cpu, | ||
783 | pid_t pid, | ||
784 | perf_callback_t callback); | ||
785 | extern u64 perf_event_read_value(struct perf_event *event, | ||
786 | u64 *enabled, u64 *running); | ||
748 | 787 | ||
749 | struct perf_sample_data { | 788 | struct perf_sample_data { |
750 | u64 type; | 789 | u64 type; |
@@ -821,6 +860,7 @@ extern int sysctl_perf_event_sample_rate; | |||
821 | extern void perf_event_init(void); | 860 | extern void perf_event_init(void); |
822 | extern void perf_tp_event(int event_id, u64 addr, u64 count, | 861 | extern void perf_tp_event(int event_id, u64 addr, u64 count, |
823 | void *record, int entry_size); | 862 | void *record, int entry_size); |
863 | extern void perf_bp_event(struct perf_event *event, void *data); | ||
824 | 864 | ||
825 | #ifndef perf_misc_flags | 865 | #ifndef perf_misc_flags |
826 | #define perf_misc_flags(regs) (user_mode(regs) ? PERF_RECORD_MISC_USER : \ | 866 | #define perf_misc_flags(regs) (user_mode(regs) ? PERF_RECORD_MISC_USER : \ |
@@ -834,6 +874,8 @@ extern int perf_output_begin(struct perf_output_handle *handle, | |||
834 | extern void perf_output_end(struct perf_output_handle *handle); | 874 | extern void perf_output_end(struct perf_output_handle *handle); |
835 | extern void perf_output_copy(struct perf_output_handle *handle, | 875 | extern void perf_output_copy(struct perf_output_handle *handle, |
836 | const void *buf, unsigned int len); | 876 | const void *buf, unsigned int len); |
877 | extern int perf_swevent_get_recursion_context(void); | ||
878 | extern void perf_swevent_put_recursion_context(int rctx); | ||
837 | #else | 879 | #else |
838 | static inline void | 880 | static inline void |
839 | perf_event_task_sched_in(struct task_struct *task, int cpu) { } | 881 | perf_event_task_sched_in(struct task_struct *task, int cpu) { } |
@@ -855,11 +897,15 @@ static inline int perf_event_task_enable(void) { return -EINVAL; } | |||
855 | static inline void | 897 | static inline void |
856 | perf_sw_event(u32 event_id, u64 nr, int nmi, | 898 | perf_sw_event(u32 event_id, u64 nr, int nmi, |
857 | struct pt_regs *regs, u64 addr) { } | 899 | struct pt_regs *regs, u64 addr) { } |
900 | static inline void | ||
901 | perf_bp_event(struct perf_event *event, void *data) { } | ||
858 | 902 | ||
859 | static inline void perf_event_mmap(struct vm_area_struct *vma) { } | 903 | static inline void perf_event_mmap(struct vm_area_struct *vma) { } |
860 | static inline void perf_event_comm(struct task_struct *tsk) { } | 904 | static inline void perf_event_comm(struct task_struct *tsk) { } |
861 | static inline void perf_event_fork(struct task_struct *tsk) { } | 905 | static inline void perf_event_fork(struct task_struct *tsk) { } |
862 | static inline void perf_event_init(void) { } | 906 | static inline void perf_event_init(void) { } |
907 | static inline int perf_swevent_get_recursion_context(void) { return -1; } | ||
908 | static inline void perf_swevent_put_recursion_context(int rctx) { } | ||
863 | 909 | ||
864 | #endif | 910 | #endif |
865 | 911 | ||