Skip to content
  • Peter Zijlstra's avatar
    perf/core: Optimize perf_pmu_sched_task() · e48c1788
    Peter Zijlstra authored and Ingo Molnar's avatar Ingo Molnar committed
    
    
    For perf record -b, which requires the pmu::sched_task callback the
    current code is rather expensive:
    
         7.68%  sched-pipe  [kernel.vmlinux]    [k] perf_pmu_sched_task
         5.95%  sched-pipe  [kernel.vmlinux]    [k] __switch_to
         5.20%  sched-pipe  [kernel.vmlinux]    [k] __intel_pmu_disable_all
         3.95%  sched-pipe  perf                [.] worker_thread
    
    The problem is that it will iterate all registered PMUs, most of which
    will not have anything to do. Avoid this by keeping an explicit list
    of PMUs that have requested the callback.
    
    The perf_sched_cb_{inc,dec}() functions already takes the required pmu
    argument, and now that these functions are no longer called from NMI
    context we can use them to manage a list.
    
    With this patch applied the function doesn't show up in the top 4
    anymore (it dropped to 18th place).
    
         6.67%  sched-pipe  [kernel.vmlinux]    [k] __switch_to
         6.18%  sched-pipe  [kernel.vmlinux]    [k] __intel_pmu_disable_all
         3.92%  sched-pipe  [kernel.vmlinux]    [k] switch_mm_irqs_off
         3.71%  sched-pipe  perf                [.] worker_thread
    
    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>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    e48c1788