summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Deacon2012-10-17 13:01:34 +0200
committerRussell King2012-10-18 12:05:20 +0200
commit3581fe0ef37ce12ac7a4f74831168352ae848edc (patch)
tree50c5dc84d1d60879c6843ab7c49c165da8f5bffa
parentARM: 7555/1: kexec: fix segment memory addresses check (diff)
downloadkernel-qcow2-linux-3581fe0ef37ce12ac7a4f74831168352ae848edc.tar.gz
kernel-qcow2-linux-3581fe0ef37ce12ac7a4f74831168352ae848edc.tar.xz
kernel-qcow2-linux-3581fe0ef37ce12ac7a4f74831168352ae848edc.zip
ARM: 7556/1: perf: fix updated event period in response to PERF_EVENT_IOC_PERIOD
The PERF_EVENT_IOC_PERIOD ioctl command can be used to change the sample period of a running perf_event. Consequently, when calculating the next event period, the new period will only be considered after the previous one has overflowed. This patch changes the calculation of the remaining event ticks so that they are offset if the period has changed. Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Reported-by: Andreas Sandberg <andreas.sandberg@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/kernel/perf_event.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 93971b1a4f0b..53c0304b734a 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -96,6 +96,10 @@ armpmu_event_set_period(struct perf_event *event,
s64 period = hwc->sample_period;
int ret = 0;
+ /* The period may have been changed by PERF_EVENT_IOC_PERIOD */
+ if (unlikely(period != hwc->last_period))
+ left = period - (hwc->last_period - left);
+
if (unlikely(left <= -period)) {
left = period;
local64_set(&hwc->period_left, left);