diff options
-rw-r--r-- | include/linux/perf_event.h | 2 | ||||
-rw-r--r-- | kernel/events/core.c | 2 | ||||
-rw-r--r-- | kernel/events/hw_breakpoint.c | 5 |
3 files changed, 8 insertions, 1 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index f463a46424e2..fa38612d70b6 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -743,6 +743,7 @@ extern unsigned int perf_output_skip(struct perf_output_handle *handle, | |||
743 | unsigned int len); | 743 | unsigned int len); |
744 | extern int perf_swevent_get_recursion_context(void); | 744 | extern int perf_swevent_get_recursion_context(void); |
745 | extern void perf_swevent_put_recursion_context(int rctx); | 745 | extern void perf_swevent_put_recursion_context(int rctx); |
746 | extern u64 perf_swevent_set_period(struct perf_event *event); | ||
746 | extern void perf_event_enable(struct perf_event *event); | 747 | extern void perf_event_enable(struct perf_event *event); |
747 | extern void perf_event_disable(struct perf_event *event); | 748 | extern void perf_event_disable(struct perf_event *event); |
748 | extern int __perf_event_disable(void *info); | 749 | extern int __perf_event_disable(void *info); |
@@ -782,6 +783,7 @@ static inline void perf_event_fork(struct task_struct *tsk) { } | |||
782 | static inline void perf_event_init(void) { } | 783 | static inline void perf_event_init(void) { } |
783 | static inline int perf_swevent_get_recursion_context(void) { return -1; } | 784 | static inline int perf_swevent_get_recursion_context(void) { return -1; } |
784 | static inline void perf_swevent_put_recursion_context(int rctx) { } | 785 | static inline void perf_swevent_put_recursion_context(int rctx) { } |
786 | static inline u64 perf_swevent_set_period(struct perf_event *event) { return 0; } | ||
785 | static inline void perf_event_enable(struct perf_event *event) { } | 787 | static inline void perf_event_enable(struct perf_event *event) { } |
786 | static inline void perf_event_disable(struct perf_event *event) { } | 788 | static inline void perf_event_disable(struct perf_event *event) { } |
787 | static inline int __perf_event_disable(void *info) { return -1; } | 789 | static inline int __perf_event_disable(void *info) { return -1; } |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 9dc297faf7c0..e0dcced282e4 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -4961,7 +4961,7 @@ static DEFINE_PER_CPU(struct swevent_htable, swevent_htable); | |||
4961 | * sign as trigger. | 4961 | * sign as trigger. |
4962 | */ | 4962 | */ |
4963 | 4963 | ||
4964 | static u64 perf_swevent_set_period(struct perf_event *event) | 4964 | u64 perf_swevent_set_period(struct perf_event *event) |
4965 | { | 4965 | { |
4966 | struct hw_perf_event *hwc = &event->hw; | 4966 | struct hw_perf_event *hwc = &event->hw; |
4967 | u64 period = hwc->last_period; | 4967 | u64 period = hwc->last_period; |
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index a64f8aeb5c1f..966a241e8616 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
@@ -612,6 +612,11 @@ static int hw_breakpoint_add(struct perf_event *bp, int flags) | |||
612 | if (!(flags & PERF_EF_START)) | 612 | if (!(flags & PERF_EF_START)) |
613 | bp->hw.state = PERF_HES_STOPPED; | 613 | bp->hw.state = PERF_HES_STOPPED; |
614 | 614 | ||
615 | if (is_sampling_event(bp)) { | ||
616 | bp->hw.last_period = bp->hw.sample_period; | ||
617 | perf_swevent_set_period(bp); | ||
618 | } | ||
619 | |||
615 | return arch_install_hw_breakpoint(bp); | 620 | return arch_install_hw_breakpoint(bp); |
616 | } | 621 | } |
617 | 622 | ||