android_kernel_samsung_univ.../kernel
Mark Rutland 711a78a792 perf/core: Fix pmu::filter_match for SW-led groups
commit 2c81a6477081966fe80b8c6daa68459bca896774 upstream.

The following commit:

  66eb579e66 ("perf: allow for PMU-specific event filtering")

added the pmu::filter_match() callback. This was intended to
avoid HW constraints on events from resulting in extremely
pessimistic scheduling.

However, pmu::filter_match() is only called for the leader of each event
group. When the leader is a SW event, we do not filter the groups, and
may fail at pmu::add() time, and when this happens we'll give up on
scheduling any event groups later in the list until they are rotated
ahead of the failing group.

This can result in extremely sub-optimal event scheduling behaviour,
e.g. if running the following on a big.LITTLE platform:

$ taskset -c 0 ./perf stat \
 -e 'a57{context-switches,armv8_cortex_a57/config=0x11/}' \
 -e 'a53{context-switches,armv8_cortex_a53/config=0x11/}' \
 ls

     <not counted>      context-switches                                              (0.00%)
     <not counted>      armv8_cortex_a57/config=0x11/                                 (0.00%)
                24      context-switches                                              (37.36%)
          57589154      armv8_cortex_a53/config=0x11/                                 (37.36%)

Here the 'a53' event group was always eligible to be scheduled, but
the 'a57' group never eligible to be scheduled, as the task was always
affine to a Cortex-A53 CPU. The SW (group leader) event in the 'a57'
group was eligible, but the HW event failed at pmu::add() time,
resulting in ctx_flexible_sched_in giving up on scheduling further
groups with HW events.

One way of avoiding this is to check pmu::filter_match() on siblings
as well as the group leader. If any of these fail their
pmu::filter_match() call, we must skip the entire group before
attempting to add any events.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
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: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Fixes: 66eb579e66 ("perf: allow for PMU-specific event filtering")
Link: http://lkml.kernel.org/r/1465917041-15339-1-git-send-email-mark.rutland@arm.com
[ Small readability edits. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-10-07 15:23:41 +02:00
..
bpf bpf, inode: disallow userns mounts 2016-06-24 10:18:17 -07:00
configs kconfig: tinyconfig: provide whole choice blocks to avoid warnings 2016-09-24 10:07:42 +02:00
debug
events perf/core: Fix pmu::filter_match for SW-led groups 2016-10-07 15:23:41 +02:00
gcov
irq genirq/msi: Fix broken debug output 2016-09-24 10:07:46 +02:00
livepatch
locking locking/qspinlock: Fix spin_unlock_wait() some more 2016-07-27 09:47:29 -07:00
power PM / hibernate: Fix rtree_next_node() to avoid walking off list ends 2016-09-30 10:18:39 +02:00
printk
rcu
sched sched/core: Fix a race between try_to_wake_up() and a woken up task 2016-09-24 10:07:42 +02:00
time timekeeping: Avoid taking lock in NMI path with CONFIG_DEBUG_TIMEKEEPING 2016-09-15 08:27:52 +02:00
trace tracing: Move mutex to protect against resetting of seq data 2016-09-30 10:18:38 +02:00
.gitignore
acct.c
async.c
audit_fsnotify.c
audit_tree.c
audit_watch.c audit: fix exe_file access in audit_exe_compare 2016-09-24 10:07:36 +02:00
audit.c
audit.h
auditfilter.c
auditsc.c audit: fix a double fetch in audit_log_single_execve_arg() 2016-08-20 18:09:22 +02:00
backtracetest.c
bounds.c
capability.c kernel: Add noaudit variant of ns_capable() 2016-09-15 08:27:50 +02:00
cgroup_freezer.c
cgroup_pids.c
cgroup.c cgroup: set css->id to -1 during init 2016-08-10 11:49:27 +02:00
compat.c
configs.c
context_tracking.c
cpu_pm.c
cpu.c
cpuset.c cpuset: handle race between CPU hotplug and cpuset_hotplug_work 2016-10-07 15:23:40 +02:00
crash_dump.c
cred.c cred: Reject inodes with invalid ids in set_create_file_as() 2016-09-15 08:27:49 +02:00
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c wait/ptrace: assume __WALL if the child is traced 2016-06-07 18:14:35 -07:00
extable.c
fork.c mm: introduce get_task_exe_file 2016-09-24 10:07:36 +02:00
freezer.c
futex_compat.c
futex.c futex: Acknowledge a new waiter in counter before plist 2016-05-04 14:48:43 -07:00
groups.c
hung_task.c
irq_work.c
jump_label.c locking/static_key: Fix concurrent static_key_slow_inc() 2016-07-27 09:47:29 -07:00
kallsyms.c
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kexec_core.c
kexec_file.c kexec: fix double-free when failing to relocate the purgatory 2016-09-24 10:07:36 +02:00
kexec_internal.h
kexec.c
kmod.c
kprobes.c
ksysfs.c
kthread.c
latencytop.c
Makefile
membarrier.c
memremap.c
module_signing.c
module-internal.h
module.c module: Invalidate signatures on force-loaded modules 2016-08-20 18:09:27 +02:00
notifier.c
nsproxy.c
padata.c
panic.c
params.c
pid_namespace.c
pid.c
profile.c
ptrace.c
range.c
reboot.c
relay.c
resource.c
seccomp.c
signal.c
smp.c
smpboot.c
smpboot.h
softirq.c
stacktrace.c
stop_machine.c
sys_ni.c
sys.c
sysctl_binary.c fs/coredump: prevent fsuid=0 dumps into user-controlled directories 2016-04-12 09:08:58 -07:00
sysctl.c pipe: limit the per-user amount of pages allocated in pipes 2016-06-07 18:14:35 -07:00
task_work.c
taskstats.c
test_kprobes.c
torture.c
tracepoint.c
tsacct.c
uid16.c
up.c
user_namespace.c
user-return-notifier.c
user.c
utsname_sysctl.c
utsname.c
watchdog.c
workqueue_internal.h
workqueue.c workqueue: fix rebind bound workers warning 2016-05-18 17:06:50 -07:00