linux/arch/powerpc/kernel
Paul Mackerras dcd945e0d8 perf_counter: powerpc: Fix race causing "oops trying to read PMC0" errors
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: Paul 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: Ingo Molnar <mingo@elte.hu>
2009-06-03 11:49:53 +02:00
..
vdso32 powerpc/mm: Introduce MMU features 2008-12-21 14:21:16 +11:00
vdso64 powerpc/mm: Introduce MMU features 2008-12-21 14:21:16 +11:00
.gitignore powerpc: Ignore generated vmlinux.lds in git 2008-10-07 14:26:18 +11:00
align.c powerpc: Fix load/store float double alignment handler 2009-02-26 14:02:53 +11:00
asm-offsets.c Merge branch 'linus' into perfcounters/core-v2 2009-04-06 09:02:57 +02:00
audit.c
btext.c powerpc: Use the common ascii hex helpers 2008-08-20 16:34:57 +10:00
cacheinfo.c powerpc/cacheinfo: Rename cache_dir per-cpu variable 2009-01-13 14:48:02 +11:00
cacheinfo.h powerpc: Rewrite sysfs processor cache info code 2009-01-08 16:25:10 +11:00
clock.c
compat_audit.c
cpu_setup_6xx.S powerpc/mm: e300c2/c3/c4 TLB errata workaround 2009-03-24 13:47:32 +11:00
cpu_setup_44x.S AMCC PPC 460SX redwood SoC platform initial framework 2009-02-14 14:41:29 -05:00
cpu_setup_fsl_booke.S powerpc/fsl-booke: Cleanup init/exception setup to be runtime 2009-01-28 18:16:50 -06:00
cpu_setup_pa6t.S
cpu_setup_ppc970.S powerpc: Use LOAD_REG_IMMEDIATE only for constants on 64-bit 2008-09-15 11:08:35 -07:00
cputable.c powerpc/pseries: Really fix the oprofile CPU type on pseries 2009-05-15 16:43:42 +10:00
crash_dump.c powerpc: Unify opcode definitions and support 2009-02-23 10:48:56 +11:00
crash.c powerpc: Increase CRASH_HANDLER_MAX 2008-06-30 22:31:00 +10:00
dbell.c powerpc: Add support for using doorbells for SMP IPI 2009-02-23 15:53:03 +11:00
dma-iommu.c powerpc: Change u64/s64 to a long long integer type 2009-01-13 14:47:59 +11:00
dma.c powerpc: Fix up dma_alloc_coherent() on platforms without cache coherency. 2009-05-27 16:33:59 +10:00
entry_32.S powerpc: Unify opcode definitions and support 2009-02-23 10:48:56 +11:00
entry_64.S Merge branch 'linus' into perfcounters/core-v2 2009-04-06 09:02:57 +02:00
firmware.c
fpu.S powerpc: Disable VSX or current process in giveup_fpu/altivec 2009-04-07 15:18:59 +10:00
ftrace.c powerpc/ftrace: Fix constraint to be early clobber 2009-05-18 15:19:05 +10:00
head_8xx.S powerpc: convert to use __HEAD and HEAD_TEXT macros. 2009-04-26 09:20:38 -07:00
head_32.S powerpc: convert to use __HEAD and HEAD_TEXT macros. 2009-04-26 09:20:38 -07:00
head_40x.S powerpc: convert to use __HEAD and HEAD_TEXT macros. 2009-04-26 09:20:38 -07:00
head_44x.S powerpc: convert to use __HEAD and HEAD_TEXT macros. 2009-04-26 09:20:38 -07:00
head_64.S powerpc/kconfig: Kill PPC_MULTIPLATFORM 2009-03-11 17:11:35 +11:00
head_booke.h Merge commit 'jwb/next' into next 2009-03-03 13:30:03 +11:00
head_fsl_booke.S powerpc: convert to use __HEAD and HEAD_TEXT macros. 2009-04-26 09:20:38 -07:00
ibmebus.c powerpc: struct device - replace bus_id with dev_name(), dev_set_name() 2008-12-16 15:53:38 +11:00
idle_6xx.S powerpc: Fix for getting CPU number in power_save_ppc32_restore() 2008-09-03 20:53:47 +10:00
idle_e500.S powerpc: Fix for getting CPU number in power_save_ppc32_restore() 2008-09-03 20:53:47 +10:00
idle_power4.S
idle.c powerpc: ftrace, do not latency trace idle 2008-11-20 10:51:15 -08:00
init_task.c take init_fs to saner place 2008-12-31 18:07:42 -05:00
io.c
iomap.c
iommu.c powerpc: Change u64/s64 to a long long integer type 2009-01-13 14:47:59 +11:00
irq.c Merge commit 'v2.6.30-rc1' into perfcounters/core 2009-04-08 10:35:30 +02:00
isa-bridge.c
kgdb.c kgdb, x86, arm, mips, powerpc: ignore user space single stepping 2008-09-26 10:36:41 -05:00
kprobes.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2009-01-07 11:31:52 -08:00
l2cr_6xx.S
legacy_serial.c powerpc/powermac: Fixup default serial port device for pmac_zilog 2008-07-28 16:30:53 +10:00
lparcfg.c powerpc/pseries: Add dispatch dispersion statistics 2009-04-07 15:18:59 +10:00
machine_kexec_32.c kexec jump: rename KEXEC_CONTROL_CODE_SIZE to KEXEC_CONTROL_PAGE_SIZE 2008-08-15 08:35:42 -07:00
machine_kexec_64.c powerpc/32: Setup OF properties for kdump 2008-12-23 15:13:29 +11:00
machine_kexec.c powerpc: Allow mem=x cmdline to work with 4G+ 2009-05-15 16:43:41 +10:00
Makefile Merge branch 'linus' into perfcounters/core-v2 2009-04-06 09:02:57 +02:00
misc_32.S powerpc/44x: Support 16K/64K base page sizes on 44x 2008-12-29 09:53:25 +11:00
misc_64.S powerpc: Disable VSX or current process in giveup_fpu/altivec 2009-04-07 15:18:59 +10:00
misc.S powerpc: Use LOAD_REG_IMMEDIATE only for constants on 64-bit 2008-09-15 11:08:35 -07:00
module_32.c powerpc/ppc32: ftrace, dynamic ftrace to handle modules 2008-11-20 10:52:53 -08:00
module_64.c powerpc: Unify opcode definitions and support 2009-02-23 10:48:56 +11:00
module.c powerpc/mm: Introduce MMU features 2008-12-21 14:21:16 +11:00
msi.c powerpc/PCI: include pci.h in powerpc MSI implementation 2009-03-25 08:54:29 -07:00
nvram_64.c
of_device.c powerpc: struct device - replace bus_id with dev_name(), dev_set_name() 2008-12-16 15:53:38 +11:00
of_platform.c dma-mapping: replace all DMA_32BIT_MASK macro with DMA_BIT_MASK(32) 2009-04-07 08:31:11 -07:00
paca.c powerpc: Update page-in counter for CMM 2008-11-05 22:08:28 +11:00
pci_32.c powerpc/pci: Fix PCI<->OF matching of old style multifunc devices 2009-02-23 10:48:57 +11:00
pci_64.c powerpc: Fix PCI ROM access 2009-05-15 16:43:42 +10:00
pci_dn.c
pci-common.c powerpc: Fix PCI ROM access 2009-05-15 16:43:42 +10:00
perf_counter.c perf_counter: powerpc: Fix race causing "oops trying to read PMC0" errors 2009-06-03 11:49:53 +02:00
pmc.c
power4-pmu.c perf_counter: powerpc: use u64 for event codes internally 2009-05-15 16:38:55 +02:00
power5-pmu.c perf_counter: powerpc: Fix event alternative code generation on POWER5/5+ 2009-06-03 11:49:52 +02:00
power5+-pmu.c perf_counter: powerpc: Fix event alternative code generation on POWER5/5+ 2009-06-03 11:49:52 +02:00
power6-pmu.c perf_counter: powerpc: supply more precise information on counter overflow events 2009-05-15 16:38:57 +02:00
ppc32.h powerpc: Add VSX context save/restore, ptrace and signal support 2008-07-01 11:28:50 +10:00
ppc970-pmu.c perf_counter: powerpc: use u64 for event codes internally 2009-05-15 16:38:55 +02:00
ppc_ksyms.c powerpc: Export cacheable_memzero as its now used in a driver 2009-01-08 16:25:17 +11:00
ppc_save_regs.S powerpc: Prepare xmon_save_regs for use with kdump 2008-12-23 15:13:28 +11:00
proc_ppc64.c
process.c Simplify copy_thread() 2009-04-02 19:04:51 -07:00
prom_init_check.sh powerpc: Print linux_banner in prom_init 2009-03-11 17:11:33 +11:00
prom_init.c powerpc/pseries: Fix ibm,client-architecture comment 2009-04-07 15:18:59 +10:00
prom_parse.c powerpc: Fix of_node_put() exit path in of_irq_map_one() 2009-04-20 12:18:43 -06:00
prom.c powerpc: Allow mem=x cmdline to work with 4G+ 2009-05-15 16:43:41 +10:00
ptrace32.c powerpc: Fix ptrace compat wrapper for FPU register access 2009-04-07 15:19:00 +10:00
ptrace.c powerpc: Don't use the wrong thread_struct for ptrace get/set VSX regs 2008-07-30 15:26:54 +10:00
reloc_64.S powerpc: Make the 64-bit kernel as a position-independent executable 2008-09-15 11:08:38 -07:00
rtas_flash.c proc 2/2: remove struct proc_dir_entry::owner 2009-03-31 01:14:44 +04:00
rtas_pci.c powerpc/pci: Fix various pseries PCI hotplug issues 2008-11-06 09:31:52 +11:00
rtas-proc.c
rtas-rtc.c
rtas.c powerpc/pseries: Fix partition migration hang under load 2009-02-23 15:53:04 +11:00
setup_32.c powerpc/32: Wire up the trampoline code for kdump 2008-12-23 15:13:29 +11:00
setup_64.c powerpc/mm: Introduce early_init_mmu() on 64-bit 2009-03-24 13:47:34 +11:00
setup-common.c powerpc: Remove duplicated #include's 2009-04-07 15:18:58 +10:00
setup.h
signal_32.c powerpc: Sanitize stack pointer in signal handling code 2009-03-27 16:58:24 +11:00
signal_64.c powerpc: Sanitize stack pointer in signal handling code 2009-03-27 16:58:24 +11:00
signal.c powerpc: Sanitize stack pointer in signal handling code 2009-03-27 16:58:24 +11:00
signal.h powerpc: Sanitize stack pointer in signal handling code 2009-03-27 16:58:24 +11:00
smp-tbsync.c powerpc: Silence software timebase sync 2008-11-05 22:08:28 +11:00
smp.c Merge branch 'cpus4096-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-02 11:44:09 -08:00
softemu8xx.c Remove asm/a.out.h files for all architectures without a.out support. 2008-09-06 19:30:24 +01:00
stacktrace.c powerpc: Removed duplicated include in stacktrace.c 2008-07-28 16:30:47 +10:00
suspend.c PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures 2008-07-24 10:47:21 -07:00
swsusp_32.S powerpc/mm: Introduce MMU features 2008-12-21 14:21:16 +11:00
swsusp_64.c
swsusp_asm64.S powerpc: Fix 64-bit hibernation with 64k pages 2008-10-07 14:26:20 +11:00
swsusp.c powerpc/mm: Split mmu_context handling 2008-12-21 14:21:15 +11:00
sys_ppc32.c compat: generic compat get/settimeofday 2008-10-16 11:21:33 -07:00
syscalls.c powerpc/mm: Add Strong Access Ordering support 2008-07-09 16:30:45 +10:00
sysfs.c powerpc: Fix bugs introduced by sysfs changes 2009-03-27 16:58:24 +11:00
systbl_chk.c
systbl_chk.sh
systbl.S
tau_6xx.c
time.c clocksource: pass clocksource to read() callback 2009-04-21 13:41:47 -07:00
traps.c powerpc: Add support for using doorbells for SMP IPI 2009-02-23 15:53:03 +11:00
udbg_16550.c powerpc/udbg: Fix lost byte during console handover; change LFCR to CRLF 2009-03-11 17:11:34 +11:00
udbg.c powerpc/udbg: Fix lost byte during console handover; change LFCR to CRLF 2009-03-11 17:11:34 +11:00
vdso.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-12-28 16:54:33 -08:00
vecemu.c
vector.S
vio.c workqueue: add to_delayed_work() helper function 2009-04-02 19:04:50 -07:00
vmlinux.lds.S powerpc: Explicit alignment for .data.cacheline_aligned 2009-05-18 15:19:05 +10:00