Kan Liang
40999312c7
perf/core: Try parent PMU first when initializing a child event
...
perf has additional overhead when monitoring the task which
frequently generates child tasks.
perf_init_event() is one of the hotspots for the additional overhead:
Currently, to get the PMU, it tries to search the type in pmu_idr at
first. But it is not always successful, especially for the widely used
PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE events. So it has to go to the
slow path which go through the whole PMUs list.
It will be a big performance issue, if the PMUs list is long (e.g. server
with many uncore boxes) and the task frequently generates child tasks.
The child event inherits its parent event. So the child event should
try its parent PMU first.
Here is some data from the overhead test on Broadwell server:
perf record -e $TEST_EVENTS -- ./loop.sh 50000
loop.sh
start=$(date +%s%N)
i=0
while [ "$i" -le "$1" ]
do
date > /dev/null
i=`expr $i + 1`
done
end=$(date +%s%N)
elapsed=`expr $end - $start`
Event# Original elapsed time Elapsed time with patch delta
1 196,573,192,397 189,162,029,998 -3.77%
2 257,567,753,013 241,620,788,683 -6.19%
4 398,730,726,971 370,518,938,714 -7.08%
8 824,983,761,120 740,702,489,329 -10.22%
16 1,883,411,923,498 1,672,027,508,355 -11.22%
... which shows a nice performance improvement.
Signed-off-by: Kan Liang <kan.liang@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Link: http://lkml.kernel.org/r/1484745662-15928-2-git-send-email-kan.liang@intel.com
[ Tidied up the changelog and the code comment. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2017-01-30 12:01:16 +01:00
..
bpf
bpf: don't trigger OOM killer under pressure with map alloc
2017-01-18 17:12:26 -05:00
configs
config: android: enable CONFIG_SECCOMP
2016-10-11 15:06:32 -07:00
debug
kdb: call vkdb_printf() from vprintk_default() only when wanted
2016-12-14 16:04:08 -08:00
events
perf/core: Try parent PMU first when initializing a child event
2017-01-30 12:01:16 +01:00
gcov
irq
genirq/affinity: Fix node generation from cpumask
2016-12-15 12:32:35 +01:00
livepatch
locking
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
power
Merge branches 'pm-sleep' and 'pm-cpufreq'
2017-01-27 00:08:59 +01:00
printk
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
rcu
rcu: Narrow early boot window of illegal synchronous grace periods
2017-01-14 21:23:48 -08:00
sched
ktime: Cleanup ktime_set() usage
2016-12-25 17:21:22 +01:00
time
nohz: Fix collision between tick and other hrtimers
2017-01-11 10:41:33 +01:00
trace
clocksource: Use a plain u64 instead of cycle_t
2016-12-25 11:04:12 +01:00
.gitignore
acct.c
async.c
audit.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2016-12-17 18:44:00 -08:00
audit.h
audit_log_{name,link_denied}: constify struct path
2016-12-05 19:00:38 -05:00
audit_fsnotify.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2016-12-17 18:44:00 -08:00
audit_tree.c
Merge branch 'stable-4.10' of git://git.infradead.org/users/pcmoore/audit
2017-01-05 23:06:06 -08:00
audit_watch.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2016-12-17 18:44:00 -08:00
auditfilter.c
audit: add support for session ID user filter
2016-11-29 15:10:12 -05:00
auditsc.c
Merge branch 'stable-4.10' of git://git.infradead.org/users/pcmoore/audit
2016-12-14 14:06:40 -08:00
backtracetest.c
bounds.c
capability.c
capability: export has_capability
2017-01-12 07:01:56 -07:00
cgroup.c
cgroup: add support for eBPF programs
2016-11-25 16:25:52 -05:00
cgroup_freezer.c
cgroup_pids.c
compat.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
configs.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
context_tracking.c
cpu.c
cpu/hotplug: Remove unused but set variable in _cpu_down()
2017-01-18 11:55:09 +01:00
cpu_pm.c
cpuset.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
crash_dump.c
cred.c
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
extable.c
kprobes, extable: Identify kprobes trampolines as kernel text area
2017-01-14 08:38:05 +01:00
fork.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
freezer.c
futex.c
ktime: Get rid of the union
2016-12-25 17:21:22 +01:00
futex_compat.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
groups.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
hung_task.c
hung_task: decrement sysctl_hung_task_warnings only if it is positive
2016-12-12 18:55:09 -08:00
irq_work.c
jump_label.c
jump_labels: API for flushing deferred jump label updates
2017-01-12 14:33:16 +01:00
kallsyms.c
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
locking/mutex: Allow MUTEX_SPIN_ON_OWNER when DEBUG_MUTEXES
2016-10-25 11:31:51 +02:00
Kconfig.preempt
kcov.c
kcov: make kcov work properly with KASLR enabled
2016-12-20 09:48:47 -08:00
kexec.c
kexec_core.c
kexec: add cond_resched into kimage_alloc_crash_control_pages
2016-12-14 16:04:07 -08:00
kexec_file.c
ima: on soft reboot, save the measurement list
2016-12-20 09:48:44 -08:00
kexec_internal.h
kexec_file: Allow arch-specific memory walking for kexec_add_buffer
2016-11-30 23:14:57 +11:00
kmod.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
kprobes.c
kprobes, extable: Identify kprobes trampolines as kernel text area
2017-01-14 08:38:05 +01:00
ksysfs.c
kthread.c
kthread: add __printf attributes
2016-12-12 18:55:06 -08:00
latencytop.c
Makefile
Merge branch 'akpm' (patches from Andrew)
2016-12-14 17:25:18 -08:00
membarrier.c
memremap.c
mm: fix devm_memremap_pages crash, use mem_hotplug_{begin, done}
2017-01-10 18:31:54 -08:00
module-internal.h
module.c
taint/module: Fix problems when out-of-kernel driver defines true or false
2017-01-17 10:56:45 -08:00
module_signing.c
notifier.c
nsproxy.c
padata.c
padata: Remove unused but set variables
2016-10-25 11:08:10 +08:00
panic.c
kernel/panic.c: add missing \n
2017-01-24 16:26:14 -08:00
params.c
pid.c
pid_namespace.c
pid: fix lockdep deadlock warning due to ucount_lock
2017-01-10 13:34:56 +13:00
profile.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
ptrace.c
ptrace: Don't allow accessing an undumpable mm
2016-11-22 12:57:38 -06:00
range.c
reboot.c
relay.c
relay: check array offset before using it
2016-12-14 16:04:08 -08:00
resource.c
seccomp.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
2016-12-14 13:57:44 -08:00
signal.c
signal: protect SIGNAL_UNKILLABLE from unintentional clearing.
2017-01-10 18:31:55 -08:00
smp.c
kernel/smp: Tell the user we're bringing up secondary CPUs
2016-10-26 12:02:35 +02:00
smpboot.c
kthread/smpboot: do not park in kthread_create_on_cpu()
2016-10-11 15:06:33 -07:00
smpboot.h
softirq.c
softirq: Display IRQ_POLL for irq-poll statistics
2016-10-21 15:45:47 -06:00
stacktrace.c
stop_machine.c
locking/core, stop_machine: Yield the CPU during stop machine()
2016-11-16 10:15:09 +01:00
sys.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
sys_ni.c
move aio compat to fs/aio.c
2016-12-22 22:58:37 -05:00
sysctl.c
sysctl: fix proc_doulongvec_ms_jiffies_minmax()
2017-01-26 09:21:24 -08:00
sysctl_binary.c
sysctl: add KERN_CONT to deprecated_sysctl_warning()
2016-12-14 16:04:07 -08:00
task_work.c
taskstats.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2016-11-15 10:54:36 -05:00
test_kprobes.c
torture.c
tracepoint.c
tracing: Have the reg function allow to fail
2016-12-09 09:13:30 -05:00
tsacct.c
ucount.c
userns: Make ucounts lock irq-safe
2017-01-24 06:23:51 +13:00
uid16.c
Replace <asm/uaccess.h> with <linux/uaccess.h> globally
2016-12-24 11:46:01 -08:00
up.c
smp: Add function to execute a function synchronously on a CPU
2016-09-05 13:52:39 +02:00
user-return-notifier.c
user.c
user_namespace.c
Merge branch 'nsfs-ioctls' into HEAD
2016-09-22 20:00:36 -05:00
utsname.c
Merge branch 'nsfs-ioctls' into HEAD
2016-09-22 20:00:36 -05:00
utsname_sysctl.c
watchdog.c
kernel/watchdog: prevent false hardlockup on overloaded system
2017-01-24 16:26:14 -08:00
watchdog_hld.c
kernel/watchdog: prevent false hardlockup on overloaded system
2017-01-24 16:26:14 -08:00
workqueue.c
Merge branch 'for-4.9' into for-4.10
2016-10-19 12:12:40 -04:00
workqueue_internal.h