[PATCH 3/3] alpha: Implement HW performance events on the EV67 and later CPUs.
From: Michael Cree <hidden>
Date: 2010-07-27 10:30:24
Also in:
lkml
On 04/05/10 19:40, Peter Zijlstra wrote:
On Sat, 2010-05-01 at 11:55 +1200, Michael Cree wrote:quoted
+/* I wonder what this is for ??? */ +void set_perf_event_pending(void) +{ +}If the PMU Interrupt comes in as an NMI we cannot take locks and such from its handler. So what we do is queue that work to be ran later. The kernel has a fallback to run this stuff from the timer hardirq, but if the PMI is IRQ context (like ARM) you can simply call perf_event_do_pending() at its tail. Alternatively you can self-IPI like x86 does and run perf_event_do_pending() from there.
OK, I couldn't see how to self-IPI on the Apha (there is no obvious way in the Alpha arch code, and the Alpha HW Ref. Man. only describes such a feature being supported by the PALcode for OpenVMS which we are obviously not running) and the PMI on Alpha is at such a high priority there is no chance that the lock can be freed while in the PMI handler, so I have put the call to perf_event_do_pending() in the timer interrupt, but unlike the PowerPC code I don't know any tricks to force the timer interrupt to happen early when there is pending work, so there is a potential maximum delay of 1ms from pending work being notified to calling perf_event_do_pending(). Is this delay acceptable? I also fix a nasty, but heretofore hidden, bug that could completely lock up a machine with continuous PMIs due to a throttled PMC being accidently re-enabled by the other PMC. It only showed up when I set the NMI flag true in the call to perf_event_overflow() and had two events counting simultaneously with a very short sample period. I also see the x86 and Sparc code in 2.6.35 have reimplemented the call to hw_perf_group_sched_in() in terms of new functions start_txn(), cancel_txn() and commit_txn(). Is this change necessary to get the Alpha code accepted for 2.6.36? If so it would be helpful if I could have a brief description of what each function does. The updated patch follows this message. Cheers Michael. Michael Cree (1): alpha: Implement HW performance events on the EV67 and later CPUs. arch/alpha/include/asm/perf_event.h | 8 +- arch/alpha/kernel/Makefile | 1 + arch/alpha/kernel/irq_alpha.c | 3 + arch/alpha/kernel/perf_event.c | 842 +++++++++++++++++++++++++++++++++++ arch/alpha/kernel/time.c | 26 ++ 5 files changed, 879 insertions(+), 1 deletions(-) create mode 100644 arch/alpha/kernel/perf_event.c