summaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorYoung Xiao <92siuyang@gmail.com>2019-05-29 10:21:48 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-06-25 11:35:57 +0800
commit16cdab63987cb18fb6d025368faeda265c993606 (patch)
tree4fbf15f474155ad2eef18466cfde8909cf890c47 /arch/sparc
parent7b460a9bb13db3f442f153c2ab8a9ff8520c368c (diff)
downloadlinux-stable-16cdab63987cb18fb6d025368faeda265c993606.tar.gz
linux-stable-16cdab63987cb18fb6d025368faeda265c993606.tar.bz2
linux-stable-16cdab63987cb18fb6d025368faeda265c993606.zip
sparc: perf: fix updated event period in response to PERF_EVENT_IOC_PERIOD
[ Upstream commit 56cd0aefa475079e9613085b14a0f05037518fed ] 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. See commit 3581fe0ef37c ("ARM: 7556/1: perf: fix updated event period in response to PERF_EVENT_IOC_PERIOD") for details. Signed-off-by: Young Xiao <92siuyang@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/kernel/perf_event.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c
index 67b3e6b3ce5d..1ad5911f62b4 100644
--- a/arch/sparc/kernel/perf_event.c
+++ b/arch/sparc/kernel/perf_event.c
@@ -891,6 +891,10 @@ static int sparc_perf_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);