aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/perf_event.h2
-rw-r--r--kernel/events/core.c2
-rw-r--r--kernel/events/hw_breakpoint.c5
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);
744extern int perf_swevent_get_recursion_context(void); 744extern int perf_swevent_get_recursion_context(void);
745extern void perf_swevent_put_recursion_context(int rctx); 745extern void perf_swevent_put_recursion_context(int rctx);
746extern u64 perf_swevent_set_period(struct perf_event *event);
746extern void perf_event_enable(struct perf_event *event); 747extern void perf_event_enable(struct perf_event *event);
747extern void perf_event_disable(struct perf_event *event); 748extern void perf_event_disable(struct perf_event *event);
748extern int __perf_event_disable(void *info); 749extern int __perf_event_disable(void *info);
@@ -782,6 +783,7 @@ static inline void perf_event_fork(struct task_struct *tsk) { }
782static inline void perf_event_init(void) { } 783static inline void perf_event_init(void) { }
783static inline int perf_swevent_get_recursion_context(void) { return -1; } 784static inline int perf_swevent_get_recursion_context(void) { return -1; }
784static inline void perf_swevent_put_recursion_context(int rctx) { } 785static inline void perf_swevent_put_recursion_context(int rctx) { }
786static inline u64 perf_swevent_set_period(struct perf_event *event) { return 0; }
785static inline void perf_event_enable(struct perf_event *event) { } 787static inline void perf_event_enable(struct perf_event *event) { }
786static inline void perf_event_disable(struct perf_event *event) { } 788static inline void perf_event_disable(struct perf_event *event) { }
787static inline int __perf_event_disable(void *info) { return -1; } 789static 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
4964static u64 perf_swevent_set_period(struct perf_event *event) 4964u64 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