powerpc: perf: Handle events that raise an exception without overflowing
Subsystems (2)
PATCH 1/1 powerpc: perf: Handle events that raise an exception without overflowing
Events on POWER7 can roll back if a speculative event doesn't eventually complete. Unfortunately in some rare cases they will raise a performance monitor exception. We need to catch this to ensure we reset the PMC. In all cases the PMC will be 256 or less cycles from overflow.
---
I would prefer not to add the PVR check, but I think we want to limit this workaround to POWER7. Would a cpu feature be preferable?
arch/powerpc/kernel/perf_event.c +23 -1
@@ -1269,6 +1269,28 @@ unsigned long perf_instruction_pointer(sreturn ip; } +static bool pmc_overflow (unsigned long val) +{ +if ((int )val <0 ) +return true; + +/* +* Events on POWER7 can roll back if a speculative event doesn't +* eventually complete. Unfortunately in some rare cases they will +* raise a performance monitor exception. We need to catch this to +* ensure we reset the PMC. In all cases the PMC will be 256 or less +* cycles from overflow. +* +* We only do this if the first pass fails to find any overflowing +* PMCs because a user might set a period of less than 256 and we +* don't want to mistakenly reset them. +*/ +if (__is_processor (PV_POWER7 ) && ((0x80000000 - val) <=256 )) +return true; + +return false; +} +/* * Performance monitor interrupt stuff */
@@ -1316,7 +1338,7 @@ static void perf_event_interrupt(structif (is_limited_pmc (i +1 ))continue ; val =read_pmc (i +1 ); -if ((int )val <0 ) +if (pmc_overflow (val))write_pmc (i +1 ,0 ); } }
arch/powerpc/include/asm/reg.h +1 -0
@@ -880,6 +880,7 @@#define PV_970 0x0039#define PV_POWER5 0x003A#define PV_POWER5p 0x003B +#define PV_POWER7 0x003F#define PV_970FX 0x003C#define PV_630 0x0040#define PV_630p 0x0041
Quoted 7 lines · Anton Blanchard
Events on POWER7 can roll back if a speculative event doesn't eventually complete. Unfortunately in some rare cases they will raise a performance monitor exception. We need to catch this to ensure we reset the PMC. In all cases the PMC will be 256 or less cycles from overflow.
Quoted 6 lines
Signed-off-by Anton Blanchard <[email protected]>---
I would prefer not to add the PVR check, but I think we want to limit this workaround to POWER7. Would a cpu feature be preferable?
There was no objection from the PowerPC folks so i'll send this fix Linuswards, ok?
Thanks,
Ingo
Quoted 9 lines · Ingo Molnar
Quoted 7 lines · Anton Blanchard
Events on POWER7 can roll back if a speculative event doesn't eventually complete. Unfortunately in some rare cases they will raise a performance monitor exception. We need to catch this to ensure we reset the PMC. In all cases the PMC will be 256 or less cycles from overflow.
Quoted 8 lines
Quoted 6 lines
Signed-off-by Anton Blanchard <[email protected]>---
I would prefer not to add the PVR check, but I think we want to limit this workaround to POWER7. Would a cpu feature be preferable?
There was no objection from the PowerPC folks so i'll send this fix Linuswards, ok?
Ah yes.
Ack.
Cheers,
Ben.
[tip:perf/urgent] perf, powerpc: Handle events that raise an exception without overflowing
In reply to Anton BlanchardCommit-ID: 0837e3242c73566fc1c0196b4ec61779c25ffc93 Gitweb: http://git.kernel.org/tip/0837e3242c73566fc1c0196b4ec61779c25ffc93 Author: Anton Blanchard <[email protected]> AuthorDate: Wed, 9 Mar 2011 14:38:42 +1100 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 16 Mar 2011 14:04:13 +0100
perf, powerpc: Handle events that raise an exception without overflowing
Events on POWER7 can roll back if a speculative event doesn't eventually complete. Unfortunately in some rare cases they will raise a performance monitor exception. We need to catch this to ensure we reset the PMC. In all cases the PMC will be 256 or less cycles from overflow.
LKML-Reference: <20110309143842.6c22845e@kryten>
--- arch/powerpc/include/asm/reg.h | 1 + arch/powerpc/kernel/perf_event.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletions(-)
arch/powerpc/include/asm/reg.h +1 -0
@@ -880,6 +880,7 @@#define PV_970 0x0039#define PV_POWER5 0x003A#define PV_POWER5p 0x003B +#define PV_POWER7 0x003F#define PV_970FX 0x003C#define PV_630 0x0040#define PV_630p 0x0041
arch/powerpc/kernel/perf_event.c +23 -1
@@ -1269,6 +1269,28 @@ unsigned long perf_instruction_pointer(struct pt_regs *regs)return ip; } +static bool pmc_overflow (unsigned long val) +{ +if ((int )val <0 ) +return true; + +/* +* Events on POWER7 can roll back if a speculative event doesn't +* eventually complete. Unfortunately in some rare cases they will +* raise a performance monitor exception. We need to catch this to +* ensure we reset the PMC. In all cases the PMC will be 256 or less +* cycles from overflow. +* +* We only do this if the first pass fails to find any overflowing +* PMCs because a user might set a period of less than 256 and we +* don't want to mistakenly reset them. +*/ +if (__is_processor (PV_POWER7 ) && ((0x80000000 - val) <=256 )) +return true; + +return false; +} +/* * Performance monitor interrupt stuff */
@@ -1316,7 +1338,7 @@ static void perf_event_interrupt(struct pt_regs *regs)if (is_limited_pmc (i +1 ))continue ; val =read_pmc (i +1 ); -if ((int )val <0 ) +if (pmc_overflow (val))write_pmc (i +1 ,0 ); } }