• Paul Mackerras's avatar
    perf_counter: powerpc: Fix race causing "oops trying to read PMC0" errors · dcd945e0
    Paul Mackerras authored
    When using interrupting counters and limited (non-interrupting)
    counters at the same time, it's possible that we get an
    interrupt in write_mmcr0() after writing MMCR0 but before we
    have set up the counters using limited PMCs.  What happens then
    is that we get into perf_counter_interrupt() with
    counter->hw.idx = 0 for the limited counters, leading to the
    "oops trying to read PMC0" error message being printed.
    
    This fixes the problem by making perf_counter_interrupt()
    robust against counter->hw.idx being zero (the counter is just
    ignored in that case) and also by changing write_mmcr0() to
    write MMCR0 initially with the counter overflow interrupt
    enable bits masked (set to 0).  If the MMCR0 value requested by
    the caller has either of those bits set, we write MMCR0 again
    with the requested value of those bits after setting up the
    limited counters properly.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
    Cc: Marcelo Tosatti <mtosatti@redhat.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: John Kacur <jkacur@redhat.com>
    Cc: Stephane Eranian <eranian@googlemail.com>
    LKML-Reference: <18982.17684.138182.954599@cargo.ozlabs.ibm.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    dcd945e0
perf_counter.c 29.9 KB