[PATCH 2/2] powerpc/perf: Fix for PMCs not making progress

Michael Neuling mikey at neuling.org
Tue Nov 6 12:08:38 EST 2012

On POWER7 when we have really small counts left before overflow, we can take a
PMU IRQ, but the PMC gets wound back to just before the overflow.

If the kernel is setting the PMC to a value just before the overflow, we can
get interrupted again without the PMC making any progress (ie another buggy
overflow).  In this case, we can end up making no forward progress, with the
PMC interrupt returning us to the same count over and over.

The below detects when we are making no forward progress (ie. delta = 0) and
then increases the amount left before the overflow.  This stops us from locking

Signed-off-by: Michael Neuling <mikey at neuling.org>
Reviewed-by: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
cc: Paul Mackerras <paulus at samba.org>
cc: Anton Blanchard <anton at samba.org>
cc: Linux PPC dev <linuxppc-dev at ozlabs.org>
 arch/powerpc/perf/core-book3s.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index 3575def..f1018c8 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -1349,6 +1349,8 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
 	val = 0;
 	left = local64_read(&event->hw.period_left) - delta;
+	if (delta == 0)
+		left++;
 	if (period) {
 		if (left <= 0) {
 			left += period;

More information about the Linuxppc-dev mailing list