Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorIngo Molnar <mingo@kernel.org>
Mon, 23 Nov 2015 08:13:48 +0000 (09:13 +0100)
committerIngo Molnar <mingo@kernel.org>
Mon, 23 Nov 2015 08:45:53 +0000 (09:45 +0100)
commit8c2accc8ca0be9cd8119ca439038243dfc8fcd0d
treeec57994aef7e5c4a63d7f36f798c3e8a2139066c
parent90eec103b96e30401c0b846045bf8a1c7159b6da
parent2c6caff2b26fde8f3f87183f8c97f2cebfdbcb98
Merge tag 'perf-core-for-mingo' of git://git./linux/kernel/git/acme/linux into perf/core

Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

User visible changes:

  - Allows BPF scriptlets specify arguments to be fetched using
    DWARF info, using a prologue generated at compile/build time (He Kuang, Wang Nan)

  - Allow attaching BPF scriptlets to module symbols (Wang Nan)

  - Allow attaching BPF scriptlets to userspace code using uprobe (Wang Nan)

  - BPF programs now can specify 'perf probe' tunables via its section name,
    separating key=val values using semicolons (Wang Nan)

Testing some of these new BPF features:

  Use case: get callchains when receiving SSL packets, filter then in the
            kernel, at arbitrary place.

  # cat ssl.bpf.c
  #define SEC(NAME) __attribute__((section(NAME), used))

  struct pt_regs;

  SEC("func=__inet_lookup_established hnum")
  int func(struct pt_regs *ctx, int err, unsigned short port)
  {
          return err == 0 && port == 443;
  }

  char _license[] SEC("license") = "GPL";
  int  _version   SEC("version") = LINUX_VERSION_CODE;
  #
  # perf record -a -g -e ssl.bpf.c
  ^C[ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.787 MB perf.data (3 samples) ]
  # perf script | head -30
  swapper     0 [000] 58783.268118: perf_bpf_probe:func: (ffffffff816a0f60) hnum=0x1bb
 8a0f61 __inet_lookup_established (/lib/modules/4.3.0+/build/vmlinux)
 896def ip_rcv_finish (/lib/modules/4.3.0+/build/vmlinux)
 8976c2 ip_rcv (/lib/modules/4.3.0+/build/vmlinux)
 855eba __netif_receive_skb_core (/lib/modules/4.3.0+/build/vmlinux)
 8565d8 __netif_receive_skb (/lib/modules/4.3.0+/build/vmlinux)
 8572a8 process_backlog (/lib/modules/4.3.0+/build/vmlinux)
 856b11 net_rx_action (/lib/modules/4.3.0+/build/vmlinux)
 2a284b __do_softirq (/lib/modules/4.3.0+/build/vmlinux)
 2a2ba3 irq_exit (/lib/modules/4.3.0+/build/vmlinux)
 96b7a4 do_IRQ (/lib/modules/4.3.0+/build/vmlinux)
 969807 ret_from_intr (/lib/modules/4.3.0+/build/vmlinux)
 2dede5 cpu_startup_entry (/lib/modules/4.3.0+/build/vmlinux)
 95d5bc rest_init (/lib/modules/4.3.0+/build/vmlinux)
1163ffa start_kernel ([kernel.vmlinux].init.text)
11634d7 x86_64_start_reservations ([kernel.vmlinux].init.text)
1163623 x86_64_start_kernel ([kernel.vmlinux].init.text)

  qemu-system-x86  9178 [003] 58785.792417: perf_bpf_probe:func: (ffffffff816a0f60) hnum=0x1bb
 8a0f61 __inet_lookup_established (/lib/modules/4.3.0+/build/vmlinux)
 896def ip_rcv_finish (/lib/modules/4.3.0+/build/vmlinux)
 8976c2 ip_rcv (/lib/modules/4.3.0+/build/vmlinux)
 855eba __netif_receive_skb_core (/lib/modules/4.3.0+/build/vmlinux)
 8565d8 __netif_receive_skb (/lib/modules/4.3.0+/build/vmlinux)
 856660 netif_receive_skb_internal (/lib/modules/4.3.0+/build/vmlinux)
 8566ec netif_receive_skb_sk (/lib/modules/4.3.0+/build/vmlinux)
   430a br_handle_frame_finish ([bridge])
   48bc br_handle_frame ([bridge])
 855f44 __netif_receive_skb_core (/lib/modules/4.3.0+/build/vmlinux)
 8565d8 __netif_receive_skb (/lib/modules/4.3.0+/build/vmlinux)
  #

    Use 'perf probe' various options to list functions, see what variables can
    be collected at any given point, experiment first collecting without a filter,
    then filter, use it together with 'perf trace', 'perf top', with or without
    callchains, if it explodes, please tell us!

  - Introduce a new callchain mode: "folded", that will list per line
    representations of all callchains for a give histogram entry, facilitating
    'perf report' output processing by other tools, such as Brendan Gregg's
    flamegraph tools (Namhyung Kim)

  E.g:

 # perf report | grep -v ^# | head
    18.37%     0.00%  swapper  [kernel.kallsyms]   [k] cpu_startup_entry
                    |
                    ---cpu_startup_entry
                       |
                       |--12.07%--start_secondary
                       |
                        --6.30%--rest_init
                                  start_kernel
                                  x86_64_start_reservations
                                  x86_64_start_kernel
  #

 Becomes, in "folded" mode:

 # perf report -g folded | grep -v ^# | head -5
     18.37%     0.00%  swapper [kernel.kallsyms]   [k] cpu_startup_entry
   12.07% cpu_startup_entry;start_secondary
    6.30% cpu_startup_entry;rest_init;start_kernel;x86_64_start_reservations;x86_64_start_kernel
     16.90%     0.00%  swapper [kernel.kallsyms]   [k] call_cpuidle
   11.23% call_cpuidle;cpu_startup_entry;start_secondary
    5.67% call_cpuidle;cpu_startup_entry;rest_init;start_kernel;x86_64_start_reservations;x86_64_start_kernel
     16.90%     0.00%  swapper [kernel.kallsyms]   [k] cpuidle_enter
   11.23% cpuidle_enter;call_cpuidle;cpu_startup_entry;start_secondary
    5.67% cpuidle_enter;call_cpuidle;cpu_startup_entry;rest_init;start_kernel;x86_64_start_reservations;x86_64_start_kernel
     15.12%     0.00%  swapper [kernel.kallsyms]   [k] cpuidle_enter_state
  #

   The user can also select one of "count", "period" or "percent" as the first column.

Infrastructure changes:

  - Fix multiple leaks found with Valgrind and a refcount
    debugger (Masami Hiramatsu)

  - Add further 'perf test' entries for BPF and LLVM (Wang Nan)

  - Improve 'perf test' to suport subtests, so that the series of tests
    performed in the LLVM and BPF main tests appear in the default 'perf test'
    output (Wang Nan)

  - Move memdup() from tools/perf to tools/lib/string.c (Arnaldo Carvalho de Melo)

  - Adopt strtobool() from the kernel into tools/lib/ (Wang Nan)

  - Fix selftests_install tools/ Makefile rule (Kevin Hilman)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>