From: Eric B Munson <hidden> Date: 2011-03-25 13:28:23
It is possible on POWER7 for some perf events to have values decrease. This
causes a problem with the way the kernel counters are updated. Deltas are
computed and then stored in a 64 bit value while the registers are 32 bits
wide so if new value is smaller than previous value, the delta is a very
large positive value. As a work around this patch skips updating the kernel
counter in when the new value is smaller than the previous. This can lead to
a lack of precision in the coutner values, but from my testing the value is
typcially fewer than 10 samples at a time.
Signed-off-by: Eric B Munson <redacted>
---
arch/powerpc/kernel/perf_event.c | 26 +++++++++++++++++++++-----
1 files changed, 21 insertions(+), 5 deletions(-)
@@ -1197,7 +1210,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val,/* we don't have to worry about interrupts here */prev=local64_read(&event->hw.prev_count);-delta=(val-prev)&0xfffffffful;+if(val<prev)+delta=0;+else+delta=(val-prev)&0xfffffffful;local64_add(delta,&event->count);/*
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-03-29 06:04:32
On Fri, 2011-03-25 at 09:28 -0400, Eric B Munson wrote:
It is possible on POWER7 for some perf events to have values decrease. This
causes a problem with the way the kernel counters are updated. Deltas are
computed and then stored in a 64 bit value while the registers are 32 bits
wide so if new value is smaller than previous value, the delta is a very
large positive value. As a work around this patch skips updating the kernel
counter in when the new value is smaller than the previous. This can lead to
a lack of precision in the coutner values, but from my testing the value is
typcially fewer than 10 samples at a time.
Unfortunately the patch isn't 100% correct I believe:
I think you don't deal with the rollover of the counters. The new value
could be smaller than the previous one simply because the counter just
rolled over.
In cases like this:
I wonder if it isn't easier to just define delta to be a s32, get rid
of the mask and test if delta is positive, something like:
delta = val - prev;
if (delta > 0)
local64_add(delta, &event->count);
Wouldn't that be simpler ? Or do I miss a reason why it wouldn't work ?
Cheers,
Ben.
From: Eric B Munson <hidden> Date: 2011-03-29 14:25:24
On Tue, 29 Mar 2011, Benjamin Herrenschmidt wrote:
On Fri, 2011-03-25 at 09:28 -0400, Eric B Munson wrote:
quoted
It is possible on POWER7 for some perf events to have values decrease. This
causes a problem with the way the kernel counters are updated. Deltas are
computed and then stored in a 64 bit value while the registers are 32 bits
wide so if new value is smaller than previous value, the delta is a very
large positive value. As a work around this patch skips updating the kernel
counter in when the new value is smaller than the previous. This can lead to
a lack of precision in the coutner values, but from my testing the value is
typcially fewer than 10 samples at a time.
Unfortunately the patch isn't 100% correct I believe:
I think you don't deal with the rollover of the counters. The new value
could be smaller than the previous one simply because the counter just
rolled over.
In cases like this:
I wonder if it isn't easier to just define delta to be a s32, get rid
of the mask and test if delta is positive, something like:
delta = val - prev;
if (delta > 0)
local64_add(delta, &event->count);
Wouldn't that be simpler ? Or do I miss a reason why it wouldn't work ?
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
Eric
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-03-29 21:13:21
On Tue, 2011-03-29 at 10:25 -0400, Eric B Munson wrote:
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
I'm not thinking about underflow but rollover... or that isn't possible
with those counters ? IE. They don't wrap back to 0 after hitting
ffffffff ?
Cheers,
Ben.
From: Eric B Munson <hidden> Date: 2011-03-30 18:37:04
On Wed, 30 Mar 2011, Benjamin Herrenschmidt wrote:
On Tue, 2011-03-29 at 10:25 -0400, Eric B Munson wrote:
quoted
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
I'm not thinking about underflow but rollover... or that isn't possible
with those counters ? IE. They don't wrap back to 0 after hitting
ffffffff ?
They do roll over to 0 after ffffffff, but I thought that case was already
covered by the perf_event_interrupt. Are you concerned that we will reset a
counter and speculative roll back will underflow that counter?
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-03-31 06:05:14
On Wed, 2011-03-30 at 14:36 -0400, Eric B Munson wrote:
On Wed, 30 Mar 2011, Benjamin Herrenschmidt wrote:
quoted
On Tue, 2011-03-29 at 10:25 -0400, Eric B Munson wrote:
quoted
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
I'm not thinking about underflow but rollover... or that isn't possible
with those counters ? IE. They don't wrap back to 0 after hitting
ffffffff ?
They do roll over to 0 after ffffffff, but I thought that case was already
covered by the perf_event_interrupt. Are you concerned that we will reset a
counter and speculative roll back will underflow that counter?
Doesn't that mean that power_pmu_read() can only ever increase the value of
the perf_event and so will essentially -stop- once the counter rolls over ?
Similar comments every where you do this type of comparison.
Cheers,
Ben.
From: Eric B Munson <hidden> Date: 2011-03-31 16:15:06
On Thu, 31 Mar 2011, Benjamin Herrenschmidt wrote:
On Wed, 2011-03-30 at 14:36 -0400, Eric B Munson wrote:
quoted
On Wed, 30 Mar 2011, Benjamin Herrenschmidt wrote:
quoted
On Tue, 2011-03-29 at 10:25 -0400, Eric B Munson wrote:
quoted
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
I'm not thinking about underflow but rollover... or that isn't possible
with those counters ? IE. They don't wrap back to 0 after hitting
ffffffff ?
They do roll over to 0 after ffffffff, but I thought that case was already
covered by the perf_event_interrupt. Are you concerned that we will reset a
counter and speculative roll back will underflow that counter?
Doesn't that mean that power_pmu_read() can only ever increase the value of
the perf_event and so will essentially -stop- once the counter rolls over ?
Similar comments every where you do this type of comparison.
Sorry for being so dense on this, but I think that when a counter overflows
both the register value and the previous value are reset so we should continue
seeing new event counts after the overflow interrupt handler puts the counter
back into a sane state. What am I not seeing?
Eric
From: Eric B Munson <hidden> Date: 2011-04-06 21:27:38
On Thu, 31 Mar 2011, Benjamin Herrenschmidt wrote:
On Wed, 2011-03-30 at 14:36 -0400, Eric B Munson wrote:
quoted
On Wed, 30 Mar 2011, Benjamin Herrenschmidt wrote:
quoted
On Tue, 2011-03-29 at 10:25 -0400, Eric B Munson wrote:
quoted
Here I made the assumption that the hardware would never remove more events in
a speculative roll back than it had added. This is not a situation I
encoutered in my limited testing, so I didn't think underflow was possible. I
will send out a V2 using the signed 32 bit delta and remeber to CC stable
this time.
I'm not thinking about underflow but rollover... or that isn't possible
with those counters ? IE. They don't wrap back to 0 after hitting
ffffffff ?
They do roll over to 0 after ffffffff, but I thought that case was already
covered by the perf_event_interrupt. Are you concerned that we will reset a
counter and speculative roll back will underflow that counter?
Doesn't that mean that power_pmu_read() can only ever increase the value of
the perf_event and so will essentially -stop- once the counter rolls over ?
Similar comments every where you do this type of comparison.
Cheers,
Ben.
Sorry for the nag, but am I missing something about the way the register and
the previous values are reset in the overflow interrupt handler?
Thanks,
Eric
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2011-04-07 04:23:45
quoted
Doesn't that mean that power_pmu_read() can only ever increase the value of
the perf_event and so will essentially -stop- once the counter rolls over ?
Similar comments every where you do this type of comparison.
Cheers,
Ben.
Sorry for the nag, but am I missing something about the way the register and
the previous values are reset in the overflow interrupt handler?
Well, not all counters get interrupts right ? Some counters are just
free running... I'm not sure when that power_pmu_read() function is
actually used by the core, I'm not that familiar with perf, but I'd say
better safe than sorry. When comparing counter values, doing in a way
that is generally safe vs. wraparounds. Eventually do a helper for that.
Cheers,
Ben.
From: Eric B Munson <hidden> Date: 2011-04-07 16:16:15
On Thu, 07 Apr 2011, Benjamin Herrenschmidt wrote:
quoted
quoted
Doesn't that mean that power_pmu_read() can only ever increase the value of
the perf_event and so will essentially -stop- once the counter rolls over ?
Similar comments every where you do this type of comparison.
Cheers,
Ben.
Sorry for the nag, but am I missing something about the way the register and
the previous values are reset in the overflow interrupt handler?
Well, not all counters get interrupts right ? Some counters are just
free running... I'm not sure when that power_pmu_read() function is
actually used by the core, I'm not that familiar with perf, but I'd say
better safe than sorry. When comparing counter values, doing in a way
that is generally safe vs. wraparounds. Eventually do a helper for that.
Cheers,
Ben.
I am honestly not sure, I was under the assumption that all counters would
generate an interrupt if they overflowed. I do not have the hardware docs to
prove this, so I will have a V3 that (I think/hope) addresses your concerns out
momentarily.
Eric