powerpc/perf: Never program book3s PMCs with values >= 0x80000000
PATCH 1/1 powerpc/perf: Never program book3s PMCs with values >= 0x80000000
We are seeing a lot of PMU warnings on POWER8:
Can't find PMC that caused IRQ
Looking closer, the active PMC is 0 at this point and we took a PMU exception on the transition from negative to 0. Some versions of POWER8 have an issue where they edge detect and not level detect PMC overflows.
A number of places program the PMC with (0x80000000 - period_left), where period_left can be negative. We can either fix all of these or just ensure that period_left is always >= 1.
This patch takes the second option.
---
Attached is a graph that shows how this bug also causes problems in the initial period calculation for samples. Once fixed we converge on the correct period very quickly.
arch/powerpc/perf/core-book3s.c +16 -1
@@ -996,7 +996,22 @@ static void power_pmu_read(struct perf_e }while (local64_cmpxchg (&event->hw.prev_count, prev, val) != prev);local64_add (delta, &event->count); -local64_sub (delta, &event->hw.period_left); + +/* +* A number of places program the PMC with (0x80000000 - period_left). +* We never want period_left to be less than 1 because we will program +* the PMC with a value >= 0x800000000 and an edge detected PMC will +* roll around to 0 before taking an exception. We have seen this +* on POWER8. +* +* To fix this, clamp the minimum value of period_left to 1. +*/ +do { + prev =local64_read (&event->hw.period_left); + val = prev - delta; +if (val <1 ) + val =1 ; + }while (local64_cmpxchg (&event->hw.period_left, prev, val) != prev); }/*