perf/core: Try parent PMU first when initializing a child event
authorKan Liang <kan.liang@intel.com>
Wed, 18 Jan 2017 13:21:01 +0000 (08:21 -0500)
committerIngo Molnar <mingo@kernel.org>
Mon, 30 Jan 2017 11:01:16 +0000 (12:01 +0100)
commit40999312c703f80e8d31bc77cf00e6e84d36e091
tree30a1c15c568b924a60b279b7dba49b8a49b8e2ad
parent487f05e18aa4efacee6357480f293a5afe6593b5
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>
kernel/events/core.c