From: Anton Blanchard <anton@samba.org>
To: eranian@google.com, paulus@samba.org, peterz@infradead.org,
mingo@elte.hu, gleb@redhat.com, wcohen@redhat.com,
vince@deater.net, asharma@fb.com, andi@firstfloor.org,
emunson@mgebm.net, imunsie@au1.ibm.com, benh@kernel.crashing.org,
sukadev@linux.vnet.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: [PATCH] powerpc: perf: power_pmu_start restores incorrect values, breaking frequency events
Date: Thu, 16 Feb 2012 15:48:22 +1100 [thread overview]
Message-ID: <20120216154822.5bfad11d@kryten> (raw)
perf on POWER stopped working after commit e050e3f0a71b (perf: Fix
broken interrupt rate throttling). That patch exposed a bug in
the POWER perf_events code.
Since the PMCs count upwards and take an exception when the top bit
is set, we want to write 0x80000000 - left in power_pmu_start. We were
instead programming in left which effectively disables the counter
until we eventually hit 0x80000000. This could take seconds or longer.
With the patch applied I get the expected number of samples:
# taskset -c 0 yes > /dev/null &
# perf record -C 0 -a sleep 10
# perf report -D | grep SAMPLE | tail -1
SAMPLE events: 9948
Signed-off-by: Anton Blanchard <anton@samba.org>
---
Cc: <stable@kernel.org>
Index: linux-build/arch/powerpc/kernel/perf_event.c
===================================================================
--- linux-build.orig/arch/powerpc/kernel/perf_event.c 2012-02-16 15:07:57.465384699 +1100
+++ linux-build/arch/powerpc/kernel/perf_event.c 2012-02-16 15:11:48.449579581 +1100
@@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_
{
unsigned long flags;
s64 left;
+ unsigned long val;
if (!event->hw.idx || !event->hw.sample_period)
return;
@@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_
event->hw.state = 0;
left = local64_read(&event->hw.period_left);
- write_pmc(event->hw.idx, left);
+
+ val = 0;
+ if (left < 0x80000000L)
+ val = 0x80000000L - left;
+
+ write_pmc(event->hw.idx, val);
perf_event_update_userpage(event);
perf_pmu_enable(event->pmu);
WARNING: multiple messages have this Message-ID (diff)
From: Anton Blanchard <anton@samba.org>
To: eranian@google.com, paulus@samba.org, peterz@infradead.org,
mingo@elte.hu, gleb@redhat.com, wcohen@redhat.com,
vince@deater.net, asharma@fb.com, andi@firstfloor.org,
emunson@mgebm.net, imunsie@au1.ibm.com, benh@kernel.crashing.org,
sukadev@linux.vnet.ibm.com
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org
Subject: [PATCH] powerpc: perf: power_pmu_start restores incorrect values, breaking frequency events
Date: Thu, 16 Feb 2012 15:48:22 +1100 [thread overview]
Message-ID: <20120216154822.5bfad11d@kryten> (raw)
perf on POWER stopped working after commit e050e3f0a71b (perf: Fix
broken interrupt rate throttling). That patch exposed a bug in
the POWER perf_events code.
Since the PMCs count upwards and take an exception when the top bit
is set, we want to write 0x80000000 - left in power_pmu_start. We were
instead programming in left which effectively disables the counter
until we eventually hit 0x80000000. This could take seconds or longer.
With the patch applied I get the expected number of samples:
# taskset -c 0 yes > /dev/null &
# perf record -C 0 -a sleep 10
# perf report -D | grep SAMPLE | tail -1
SAMPLE events: 9948
Signed-off-by: Anton Blanchard <anton@samba.org>
---
Cc: <stable@kernel.org>
Index: linux-build/arch/powerpc/kernel/perf_event.c
===================================================================
--- linux-build.orig/arch/powerpc/kernel/perf_event.c 2012-02-16 15:07:57.465384699 +1100
+++ linux-build/arch/powerpc/kernel/perf_event.c 2012-02-16 15:11:48.449579581 +1100
@@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_
{
unsigned long flags;
s64 left;
+ unsigned long val;
if (!event->hw.idx || !event->hw.sample_period)
return;
@@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_
event->hw.state = 0;
left = local64_read(&event->hw.period_left);
- write_pmc(event->hw.idx, left);
+
+ val = 0;
+ if (left < 0x80000000L)
+ val = 0x80000000L - left;
+
+ write_pmc(event->hw.idx, val);
perf_event_update_userpage(event);
perf_pmu_enable(event->pmu);
next reply other threads:[~2012-02-16 4:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-16 4:48 Anton Blanchard [this message]
2012-02-16 4:48 ` [PATCH] powerpc: perf: power_pmu_start restores incorrect values, breaking frequency events Anton Blanchard
2012-02-16 4:57 ` Paul Mackerras
2012-02-16 4:57 ` Paul Mackerras
2012-02-19 11:13 ` Stephane Eranian
2012-02-19 11:13 ` Stephane Eranian
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120216154822.5bfad11d@kryten \
--to=anton@samba.org \
--cc=andi@firstfloor.org \
--cc=asharma@fb.com \
--cc=benh@kernel.crashing.org \
--cc=emunson@mgebm.net \
--cc=eranian@google.com \
--cc=gleb@redhat.com \
--cc=imunsie@au1.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mingo@elte.hu \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
--cc=sukadev@linux.vnet.ibm.com \
--cc=vince@deater.net \
--cc=wcohen@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.