Peter Zijlstra
10c6db110d
perf: Fix loss of notification with multi-event
...
When you do:
$ perf record -e cycles,cycles,cycles noploop 10
You expect about 10,000 samples for each event, i.e., 10s at
1000samples/sec. However, this is not what's happening. You
get much fewer samples, maybe 3700 samples/event:
$ perf report -D | tail -15
Aggregated stats:
TOTAL events: 10998
MMAP events: 66
COMM events: 2
SAMPLE events: 10930
cycles stats:
TOTAL events: 3644
SAMPLE events: 3644
cycles stats:
TOTAL events: 3642
SAMPLE events: 3642
cycles stats:
TOTAL events: 3644
SAMPLE events: 3644
On a Intel Nehalem or even AMD64, there are 4 counters capable
of measuring cycles, so there is plenty of space to measure those
events without multiplexing (even with the NMI watchdog active).
And even with multiplexing, we'd expect roughly the same number
of samples per event.
The root of the problem was that when the event that caused the buffer
to become full was not the first event passed on the cmdline, the user
notification would get lost. The notification was sent to the file
descriptor of the overflowed event but the perf tool was not polling
on it. The perf tool aggregates all samples into a single buffer,
i.e., the buffer of the first event. Consequently, it assumes
notifications for any event will come via that descriptor.
The seemingly straight forward solution of moving the waitq into the
ringbuffer object doesn't work because of life-time issues. One could
perf_event_set_output() on a fd that you're also blocking on and cause
the old rb object to be freed while its waitq would still be
referenced by the blocked thread -> FAIL.
Therefore link all events to the ringbuffer and broadcast the wakeup
from the ringbuffer object to all possible events that could be waited
upon. This is rather ugly, and we're open to better solutions but it
works for now.
Reported-by: Stephane Eranian <eranian@google.com>
Finished-by: Stephane Eranian <eranian@google.com>
Reviewed-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20111126014731.GA7030@quad
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2011-12-05 09:33:03 +01:00
..
debug
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
events
perf: Fix loss of notification with multi-event
2011-12-05 09:33:03 +01:00
gcov
gcov: disable CONSTRUCTORS for UML
2011-07-26 16:49:45 -07:00
irq
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
power
PM / QoS: Set cpu_dma_pm_qos->name
2011-11-07 23:02:24 +01:00
time
kernel: Fix files explicitly needing EXPORT_SYMBOL infrastructure
2011-10-31 19:30:05 -04:00
trace
kernel: Fix files explicitly needing EXPORT_SYMBOL infrastructure
2011-10-31 19:30:05 -04:00
.gitignore
acct.c
async.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
audit.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
audit.h
audit_tree.c
audit_tree,rcu: Convert call_rcu(__put_tree) to kfree_rcu()
2011-07-20 14:10:11 -07:00
audit_watch.c
auditfilter.c
auditsc.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
backtracetest.c
bounds.c
capability.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
cgroup.c
memcg: replace ss->id_lock with a rwlock
2011-11-02 16:07:03 -07:00
cgroup_freezer.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
compat.c
kernel: Fix files explicitly needing EXPORT_SYMBOL infrastructure
2011-10-31 19:30:05 -04:00
configs.c
kernel/configs.c: include MODULE_*() when CONFIG_IKCONFIG_PROC=n
2011-07-25 20:57:15 -07:00
cpu.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
cpu_pm.c
cpu_pm: call notifiers during suspend
2011-09-23 12:05:29 +05:30
cpuset.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
crash_dump.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
cred.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
delayacct.c
KVM: Steal time implementation
2011-07-14 12:59:14 +03:00
dma.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
elfcore.c
exec_domain.c
exit.c
oom: remove oom_disable_count
2011-10-31 17:30:45 -07:00
extable.c
extable, core_kernel_data(): Make sure all archs define _sdata
2011-05-20 08:56:56 +02:00
fork.c
Merge branch 'writeback-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/linux
2011-11-06 19:02:23 -08:00
freezer.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
futex.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
futex_compat.c
groups.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
hrtimer.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
hung_task.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
irq_work.c
kernel: fix two implicit header assumptions in irq_work.c
2011-10-31 09:20:12 -04:00
itimer.c
jump_label.c
jump-label: initialize jump-label subsystem much earlier
2011-10-25 11:55:15 -07:00
kallsyms.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
sched: Isolate preempt counting in its own config option
2011-06-10 15:15:40 +02:00
kexec.c
[S390] kdump: Add infrastructure for unmapping crashkernel memory
2011-10-30 15:16:42 +01:00
kfifo.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
kmod.c
kmod: prevent kmod_loop_msg overflow in __request_module()
2011-10-26 13:10:39 +10:30
kprobes.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
ksysfs.c
kernel: ksysfs.c is implicitly using stat.h
2011-10-31 09:20:13 -04:00
kthread.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
latencytop.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
lockdep.c
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2011-10-26 16:26:53 +02:00
lockdep_internals.h
lockdep_proc.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
lockdep_states.h
Makefile
Merge branch 'devel-stable' of http://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm
2011-10-28 12:02:27 -07:00
module.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
mutex-debug.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
mutex-debug.h
mutex.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
mutex.h
notifier.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
nsproxy.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
padata.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
panic.c
module,bug: Add TAINT_OOT_MODULE flag for modules not built in-tree
2011-11-07 07:54:42 +10:30
params.c
kernel: params.c needs module.h not moduleparam.h
2011-10-31 09:20:13 -04:00
pid.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
pid_namespace.c
posix-cpu-timers.c
Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2011-10-26 16:17:32 +02:00
posix-timers.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
printk.c
printk: remove bounds checking for log_prefix
2011-10-31 17:30:53 -07:00
profile.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
ptrace.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
range.c
range: fix bogus misuse of module.h to get printk()
2011-10-31 09:20:11 -04:00
rcu.h
rcu: Add grace-period, quiescent-state, and call_rcu trace events
2011-09-28 21:38:21 -07:00
rcupdate.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rcutiny.c
kernel: fix up module header handling in rcutiny files
2011-10-31 09:20:13 -04:00
rcutiny_plugin.h
kernel: fix up module header handling in rcutiny files
2011-10-31 09:20:13 -04:00
rcutorture.c
rcu: Make rcu_torture_boost() exit loops at end of test
2011-09-28 21:38:46 -07:00
rcutree.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rcutree.h
rcu: Remove rcu_needs_cpu_flush() to avoid false quiescent states
2011-09-28 21:38:48 -07:00
rcutree_plugin.h
rcu: Remove rcu_needs_cpu_flush() to avoid false quiescent states
2011-09-28 21:38:48 -07:00
rcutree_trace.c
rcu: Simplify quiescent-state accounting
2011-09-28 21:38:22 -07:00
relay.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
res_counter.c
resource.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rtmutex-debug.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rtmutex-debug.h
rtmutex-tester.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rtmutex.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
rtmutex.h
rtmutex_common.h
rwsem.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
sched.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
2011-11-06 17:12:03 -08:00
sched_autogroup.c
sched_autogroup.h
sched: Skip autogroup when looking for all rt sched groups
2011-07-01 10:39:08 +02:00
sched_clock.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
sched_cpupri.c
sched/cpupri: Remove cpupri->pri_active
2011-08-14 12:01:11 +02:00
sched_cpupri.h
sched/cpupri: Remove cpupri->pri_active
2011-08-14 12:01:11 +02:00
sched_debug.c
sched_fair.c
sched: Wrap scheduler p->cpus_allowed access
2011-10-06 12:46:56 +02:00
sched_features.h
sched: Kill WAKEUP_PREEMPT
2011-08-14 12:00:41 +02:00
sched_idletask.c
sched_rt.c
sched: Warn on rt throttling
2011-10-06 12:47:04 +02:00
sched_stats.h
locking, sched: Annotate thread_group_cputimer as raw
2011-09-13 11:11:55 +02:00
sched_stoptask.c
sched: Implement hierarchical task accounting for SCHED_OTHER
2011-08-14 12:01:13 +02:00
seccomp.c
semaphore.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
signal.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
smp.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
softirq.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
spinlock.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
srcu.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
stacktrace.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
stop_machine.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
sys.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
sys_ni.c
Cross Memory Attach
2011-10-31 17:30:44 -07:00
sysctl.c
Merge branch 'akpm' (Andrew's incoming)
2011-10-31 17:46:07 -07:00
sysctl_binary.c
ipv4: NET_IPV4_ROUTE_GC_INTERVAL removal
2011-10-03 14:13:01 -04:00
sysctl_check.c
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
taskstats.c
Make TASKSTATS require root access
2011-09-19 17:04:37 -07:00
test_kprobes.c
time.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
timeconst.pl
timer.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
tracepoint.c
Tracepoint: Dissociate from module mutex
2011-08-10 20:38:14 -04:00
tsacct.c
Make taskstats round statistics down to nearest 1k bytes/events
2011-09-19 17:10:57 -07:00
uid16.c
up.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
user-return-notifier.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
user.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
user_namespace.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
utsname.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
utsname_sysctl.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
2011-11-06 19:44:47 -08:00
wait.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
watchdog.c
watchdog: move watchdog_*_all_cpus under CONFIG_SYSCTL
2011-10-31 17:30:53 -07:00
workqueue.c
kernel: Map most files to use export.h instead of module.h
2011-10-31 09:20:12 -04:00
workqueue_sched.h