Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Will Deacon and committed by
Russell King
3581fe0e 2456f44d

+4
+4
arch/arm/kernel/perf_event.c
··· 96 96 s64 period = hwc->sample_period; 97 97 int ret = 0; 98 98 99 + /* The period may have been changed by PERF_EVENT_IOC_PERIOD */ 100 + if (unlikely(period != hwc->last_period)) 101 + left = period - (hwc->last_period - left); 102 + 99 103 if (unlikely(left <= -period)) { 100 104 left = period; 101 105 local64_set(&hwc->period_left, left);