• Kan Liang's avatar
    perf/core: Try parent PMU first when initializing a child event · 40999312
    Kan Liang authored
    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: default avatarKan Liang <kan.liang@intel.com>
    Signed-off-by: default avatarPeter 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: default avatarIngo Molnar <mingo@kernel.org>
    40999312
core.c 258 KB