aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <mpe@ellerman.id.au>2014-03-14 01:00:32 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2014-03-23 18:48:26 -0400
commit7cbba630288112e231558d055123cfc3e19feeb6 (patch)
tree09231ed4d362924f211649c806889b571ffd3383
parentfb568d763f95d356087b447398382b76592ff915 (diff)
powerpc/perf: Avoid mutating event in power8_get_constraint()
We only need to mask the EBB bit out of the event for the check of the special PMC 5 & 6 events. So use a local to do it just for that code, rather than changing the event value for the life of the function. While we're there move the set of mask and value after all the checks. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/perf/power8-pmu.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c
index 1d7c4428a55e..67aab104b9fe 100644
--- a/arch/powerpc/perf/power8-pmu.c
+++ b/arch/powerpc/perf/power8-pmu.c
@@ -270,18 +270,20 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long
270 cache = (event >> EVENT_CACHE_SEL_SHIFT) & EVENT_CACHE_SEL_MASK; 270 cache = (event >> EVENT_CACHE_SEL_SHIFT) & EVENT_CACHE_SEL_MASK;
271 ebb = (event >> EVENT_EBB_SHIFT) & EVENT_EBB_MASK; 271 ebb = (event >> EVENT_EBB_SHIFT) & EVENT_EBB_MASK;
272 272
273 /* Clear the EBB bit in the event, so event checks work below */
274 event &= ~(EVENT_EBB_MASK << EVENT_EBB_SHIFT);
275
276 if (pmc) { 273 if (pmc) {
274 u64 base_event;
275
277 if (pmc > 6) 276 if (pmc > 6)
278 return -1; 277 return -1;
279 278
280 mask |= CNST_PMC_MASK(pmc); 279 /* Ignore Linux defined bits when checking event below */
281 value |= CNST_PMC_VAL(pmc); 280 base_event = event & ~(EVENT_EBB_MASK << EVENT_EBB_SHIFT);
282 281
283 if (pmc >= 5 && event != 0x500fa && event != 0x600f4) 282 if (pmc >= 5 && base_event != 0x500fa && base_event != 0x600f4)
284 return -1; 283 return -1;
284
285 mask |= CNST_PMC_MASK(pmc);
286 value |= CNST_PMC_VAL(pmc);
285 } 287 }
286 288
287 if (pmc <= 4) { 289 if (pmc <= 4) {