Skip to content
  1. Jul 17, 2016
    • Ingo Molnar's avatar
      Merge tag 'perf-core-for-mingo-20160715' of... · 09211e25
      Ingo Molnar authored
      
      Merge tag 'perf-core-for-mingo-20160715' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
      
      Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
      
      User visible changes:
      
       - Allow reading from a backward ring buffer (one setup via sys_perf_event_open()
         with perf_event_attr.write_backward = 1) (Wang Nan)
      
      Infrastructure changes:
      
       - Fix the build on Android NDK r12b (initially just for ARM), that is now port
         of my perf-build container collection and will get tested prior to sending
         patches upstream (Arnaldo Carvalho de Melo)
      
       - Add correct header for IPv6 definitions
      
       - Fix bitsperlong.h fallout (Arnaldo Carvalho de Melo, Peter Zijlstra)
      
       - Use base 0 (auto) in filename__read_ull(), so that we can handle hex values too (Jiri Olsa)
      
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      09211e25
  2. Jul 16, 2016
    • Arnaldo Carvalho de Melo's avatar
      objtool: Initialize variable to silence old compiler · b49364f3
      Arnaldo Carvalho de Melo authored
      
      
      gcc version 4.1.2 20080704 (Red Hat 4.1.2-55) barfs with:
      
          CC       /tmp/build/objtool/builtin-check.o
        cc1: warnings being treated as errors
        builtin-check.c: In function 'cmd_check':
        builtin-check.c:667: warning: 'prev_rela' may be used uninitialized in this function
        mv: cannot stat `/tmp/build/objtool/.builtin-check.o.tmp': No such file or directory
        make[1]: *** [/tmp/build/objtool/builtin-check.o] Error 1
      
      Init it to NULL to silence it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-qolo31rl2ojlwj1lj9dhemyz@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b49364f3
    • Arnaldo Carvalho de Melo's avatar
      objtool: Add -I$(srctree)/tools/arch/$(ARCH)/include/uapi · 4a0982f9
      Arnaldo Carvalho de Melo authored
      
      
      So that it can find asm/bitsperlong.h to get the __BITS_PER_LONG
      definition.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-pr3pvskh65pey4po7t122z4j@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4a0982f9
    • Wang Nan's avatar
      perf record: Add --tail-synthesize option · 4ea648ae
      Wang Nan authored
      
      
      When working with overwritable ring buffer there's a inconvenience
      problem: if perf dumps data after a long period after it starts,
      non-sample events may lost, which makes following 'perf report' unable
      to identify proc name and mmap layout. For example:
      
       # perf record -m 4 -e raw_syscalls:* -g --overwrite --switch-output \
              dd if=/dev/zero of=/dev/null
      
      send SIGUSR2 after dd runs long enough. The resuling perf.data lost
      correct comm and mmap events:
      
       # perf script -i perf.data.2016061522374354
       perf 24478 [004] 2581325.601789:  raw_syscalls:sys_exit: NR 0 = 512
       ^^^^
       Should be 'dd'
                         27b2e8 syscall_slow_exit_work+0xfe2000e3 (/lib/modules/4.6.0-rc3+/build/vmlinux)
                         203cc7 do_syscall_64+0xfe200117 (/lib/modules/4.6.0-rc3+/build/vmlinux)
                         b18d83 return_from_SYSCALL_64+0xfe200000 (/lib/modules/4.6.0-rc3+/build/vmlinux)
                   7f47c417edf0 [unknown] ([unknown])
                   ^^^^^^^^^^^^
                   Fail to unwind
      
      This patch provides a '--tail-synthesize' option, allows perf to collect
      system status when finalizing output file. In resuling output file, the
      non-sample events reflect system status when dumping data.
      
      After this patch:
       # perf record -m 4 -e raw_syscalls:* -g --overwrite --switch-output --tail-synthesize \
              dd if=/dev/zero of=/dev/null
      
       # perf script -i perf.data.2016061600544998
       dd 27364 [004] 2583244.994464: raw_syscalls:sys_enter: NR 1 (1, ...
       ^^
       Correct comm
                         203a18 syscall_trace_enter_phase2+0xfe2001a8 ([kernel.kallsyms])
                         203aa5 syscall_trace_enter+0xfe200055 ([kernel.kallsyms])
                         203caa do_syscall_64+0xfe2000fa ([kernel.kallsyms])
                         b18d83 return_from_SYSCALL_64+0xfe200000 ([kernel.kallsyms])
                          d8e50 __GI___libc_write+0xffff01d9639f4010 (/tmp/oxygen_root-w00229757/lib64/libc-2.18.so)
                          ^^^^^
                          Correct unwind
      
      This option doesn't aim to solve this problem completely. If a process
      terminates before SIGUSR2, we still lost its COMM and MMAP events. For
      example, we can't unwind correctly from the final perf.data we get from
      the previous example, because when perf collects the final output file
      (when we press C-c), 'dd' has been terminated so its '/proc/<pid>/mmap'
      becomes empty.
      
      However, this is a cheaper choice. To completely solve this problem we
      need to continously output non-sample events. To satisify the
      requirement of daemonization, we need to merge them periodically. It is
      possible but requires much more code and cycles.
      
      Automatically select --tail-synthesize when --overwrite is provided.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-16-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4ea648ae
    • Wang Nan's avatar
      perf session: Don't warn about out of order event if write_backward is used · f06149c0
      Wang Nan authored
      
      
      If write_backward attribute is set, records are written into kernel
      ring buffer from end to beginning, but read from beginning to end.
      To avoid 'XX out of order events recorded' warning message (timestamps
      of records is in reverse order when using write_backward), suppress the
      warning message if write_backward is selected by at lease one event.
      
      Result:
      
      Before this patch:
        # perf record -m 1 -e raw_syscalls:sys_exit/overwrite/ \
                           -e raw_syscalls:sys_enter \
                           dd if=/dev/zero of=/dev/null count=300
        300+0 records in
        300+0 records out
        153600 bytes (154 kB) copied, 0.000601617 s, 255 MB/s
        [ perf record: Woken up 5 times to write data ]
        Warning:
        40 out of order events recorded.
        [ perf record: Captured and wrote 0.096 MB perf.data (696 samples) ]
      
      After this patch:
        # perf record -m 1 -e raw_syscalls:sys_exit/overwrite/ \
                           -e raw_syscalls:sys_enter \
                           dd if=/dev/zero of=/dev/null count=300
        300+0 records in
        300+0 records out
        153600 bytes (154 kB) copied, 0.000644873 s, 238 MB/s
        [ perf record: Woken up 5 times to write data ]
        [ perf record: Captured and wrote 0.096 MB perf.data (696 samples) ]
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-15-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarHe Kuang <hekuang@huawei.com>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f06149c0
    • Wang Nan's avatar
      perf tools: Enable overwrite settings · 626a6b78
      Wang Nan authored
      
      
      This patch allows following config terms and option:
      
      Globally setting events to overwrite;
      
        # perf record --overwrite ...
      
      Set specific events to be overwrite or no-overwrite.
      
        # perf record --event cycles/overwrite/ ...
        # perf record --event cycles/no-overwrite/ ...
      
      Add missing config terms and update the config term array size because
      the longest string length has changed.
      
      For overwritable events, it automatically selects attr.write_backward
      since perf requires it to be backward for reading.
      
      Test result:
      
        # perf record --overwrite -e syscalls:*enter_nanosleep* usleep 1
        [ perf record: Woken up 2 times to write data ]
        [ perf record: Captured and wrote 0.011 MB perf.data (1 samples) ]
        # perf evlist -v
        syscalls:sys_enter_nanosleep: type: 2, size: 112, config: 0x134, { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CPU|PERIOD|RAW, disabled: 1, inherit: 1, mmap: 1, comm: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, write_backward: 1
        # Tip: use 'perf evlist --trace-fields' to show fields for tracepoint events
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-14-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarHe Kuang <hekuang@huawei.com>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      626a6b78
    • Wang Nan's avatar
      perf evlist: Make {pause,resume} internal helpers · f6cdff83
      Wang Nan authored
      
      
      There's no user of these two function outside evlist.c. Remove them from
      public namespace.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-13-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f6cdff83
    • Wang Nan's avatar
      perf record: Read from overwritable ring buffer · 05737464
      Wang Nan authored
      
      
      Drive the evlist->bkw_mmap_state state machine during draining and when
      SIGUSR2 is received. Read the backward ring buffer in record__mmap_read_all.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-12-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarHe Kuang <hekuang@huawei.com>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      05737464
    • Wang Nan's avatar
      perf evlist: Setup backward mmap state machine · 54cc54de
      Wang Nan authored
      
      
      Introduce a bkw_mmap_state state machine to evlist:
      
                           .________________(forbid)_____________.
                           |                                     V
       NOTREADY --(0)--> RUNNING --(1)--> DATA_PENDING --(2)--> EMPTY
                           ^  ^              |   ^               |
                           |  |__(forbid)____/   |___(forbid)___/|
                           |                                     |
                            \_________________(3)_______________/
      
       NOTREADY     : Backward ring buffers are not ready
       RUNNING      : Backward ring buffers are recording
       DATA_PENDING : We are required to collect data from backward ring buffers
       EMPTY        : We have collected data from backward ring buffers.
      
       (0): Setup backward ring buffer
       (1): Pause ring buffers for reading
       (2): Read from ring buffers
       (3): Resume ring buffers for recording
      
      We can't avoid this complexity. Since we deliberately drop records from
      overwritable ring buffer, there's no way for us to check remaining from
      ring buffer itself (by checking head and old pointers). Therefore, we
      need DATA_PENDING and EMPTY state to help us recording what we have done
      to the ring buffer.
      
      In record__mmap_read_evlist(), drive this state machine from DATA_PENDING
      to EMPTY.
      
      In perf_evlist__mmap_per_evsel(), drive this state machine from NOTREADY
      to RUNNING when creating backward mmap.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-11-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      54cc54de
    • Wang Nan's avatar
      perf evlist: Drop evlist->backward · a0c6f451
      Wang Nan authored
      
      
      Now there's no real user of evlist->backward. Drop it. We are going to
      use evlist->backward_mmap as a container for backward ring buffer.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-10-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a0c6f451
    • Wang Nan's avatar
      perf evlist: Map backward events to backward_mmap · 078c3386
      Wang Nan authored
      
      
      In perf_evlist__mmap_per_evsel(), select backward_mmap for backward
      events.  Utilize new perf_mmap APIs. Dynamically alloc backward_mmap.
      
      Remove useless functions.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-9-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      078c3386
    • Wang Nan's avatar
      perf evlist: Introduce backward_mmap array for evlist · b2cb615d
      Wang Nan authored
      
      
      Add backward_mmap to evlist, free it together with normal mmap.
      
      Improve perf_evlist__pick_pc(), search backward_mmap if evlist->mmap is
      not available.
      
      This patch doesn't alloc this array. It will be allocated conditionally
      in the following commits.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-8-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b2cb615d
    • Wang Nan's avatar
      perf evlist: Extract common code in mmap failure processing · a1f72618
      Wang Nan authored
      
      
      In perf_evlist__mmap_per_cpu() and perf_evlist__mmap_per_thread(), in
      case of mmap failure, successfully created maps should be cleared.
      
      Current code uses two loops calling __perf_evlist__munmap() for each
      function.
      
      This patch extracts common code to perf_evlist__munmap_nofree() and use
      previous introduced decoupled API perf_mmap__munmap(). Now
      __perf_evlist__munmap() can be removed because of no user.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-7-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a1f72618
    • Wang Nan's avatar
      perf evlist: Record mmap cookie into fdarray private field · 4876075b
      Wang Nan authored
      
      
      Insetad of saving a index into fdarray entries private field, save the
      corresponding 'struct perf_mmap' pointer, and release them directly
      using perf_mmap__put().
      
      Following commits introduce multiple mmap arrays to evlist. Without this
      patch, perf_evlist__munmap_filtered() is unable to retrive correct
      'struct perf_mmap' pointer.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-6-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4876075b
    • Wang Nan's avatar
      perf record: Decouple record__mmap_read() and evlist. · a4ea0ec4
      Wang Nan authored
      
      
      Perf evlist will have multiple mmap arrays. Update record__mmap_read():
      it should read from 'struct perf_mmap' directly.
      
      Also, make record__mmap_read() ready to read from backward ring buffer.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-5-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a4ea0ec4
    • Wang Nan's avatar
      perf evlist: Update mmap related APIs and helpers · 8db6d6b1
      Wang Nan authored
      
      
      Currently, the evlist mmap related helpers and APIs accept evlist and
      idx, and dereference 'struct perf_mmap' by evlist->mmap[idx]. This is
      unnecessary, and force each evlist contains only one mmap array.
      
      Following commits are going to introduce multiple mmap arrays to a
      evlist.  This patch refators these APIs and helpers, introduces
      functions accept perf_mmap pointer directly. New helpers and APIs are
      decoupled with perf_evlist, and become perf_mmap functions (so they have
      perf_mmap prefix).
      
      Old functions are reimplemented with new functions. Some of them will be
      removed in following commits.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-4-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      8db6d6b1
    • Wang Nan's avatar
      tools lib fd array: Allow associating a pointer cookie with each entry · 2b438347
      Wang Nan authored
      
      
      Add a 'ptr' field to fdarray->priv array.
      
      This feature will be used by following commits, which introduce
      muiltiple 'struct perf_mmap' arrays for different types of mapping.
      
      Because of this, during fdarray__filter(), a simple 'idx' is not enough.
      
      Add a pointer cookie that allows to directly associate a 'struct
      perf_mmap' pointer to an fdarray entry.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-3-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2b438347
    • Peter Zijlstra's avatar
      tools: Simplify BITS_PER_LONG define · e81fcd43
      Peter Zijlstra authored
      
      
      Do it using (__CHAR_BIT__ * __SIZEOF_LONG__), simpler, works everywhere,
      reduces the complexity by ditching CONFIG_64BIT, that was being
      synthesized from yet another set of defines, which proved fragile,
      breaking the build on linux-next for no obvious reasons.
      
      Committer Note:
      
      Except on:
      
      gcc version 4.1.2 20080704 (Red Hat 4.1.2-55)
      
      Fallback to __WORDSIZE in that case...
      
      Reported-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
      Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Link: http://lkml.kernel.org/r/20160715072243.GP30154@twins.programming.kicks-ass.net
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e81fcd43
    • Arnaldo Carvalho de Melo's avatar
      perf evlist: Drop redundant evsel->overwrite indicator · 32a951b4
      Arnaldo Carvalho de Melo authored
      
      
      evsel->overwrite indicator means an event should be put into
      overwritable ring buffer. In current implementation, it equals to
      evsel->attr.write_backward. To reduce compliexity, remove
      evsel->overwrite, use evsel->attr.write_backward instead.
      
      In addition, in __perf_evsel__open(), if kernel doesn't support
      write_backward and user explicitly set it in evsel, don't fallback
      like other missing feature, since it is meaningless to fall back to
      a forward ring buffer in this case: we are unable to stably read
      from an forward overwritable ring buffer.
      
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nilay Vaish <nilayvaish@gmail.com>
      Cc: Wang Nan <wangnan0@huawei.com>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468485287-33422-2-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      32a951b4
    • Jiri Olsa's avatar
      tools lib api fs: Use base 0 in filename__read_ull · db49120a
      Jiri Olsa authored
      
      
      By using 0 for base, the strtoull() detects the base automatically (see
      'man strtoull').
      
      ATM we have just one user of this function, the cpu__get_max_freq
      function reading the "cpuinfo_max_freq" sysfs file. It should not get
      affected by this change.
      
      Committer note:
      
      This change seems motivated by this discussion:
      
      "[PATCH] [RFC V1]s390/perf: fix 'start' address of module's map"
      http://lkml.kernel.org/r/20160711120155.GA29929@krava
      
      I.e. this patches paves the way for filename__read_ull() to be used in a
      S/390 related fix.
      
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Songshan Gong <gongss@linux.vnet.ibm.com>
      Link: http://lkml.kernel.org/r/1468567797-27564-4-git-send-email-jolsa@kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      db49120a
  3. Jul 15, 2016
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Bail out at "--sort dcacheline" and cacheline_size not known · 0d203166
      Arnaldo Carvalho de Melo authored
      
      
      There are cases where further work would be needed to overcome the fact
      that neither sysconf(_SC_LEVEL1_DCACHE_LINESIZE) nor
      /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size are
      available in some systems (Android, for instance), so bail out when such
      a situation takes place.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-ho8d8g8mh0o2dri7ckcccafi@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0d203166
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Just pr_debug() about not being able to read cacheline_size · 8811e8ea
      Arnaldo Carvalho de Melo authored
      
      
      So far the cacheline_size is only useful for the "dcacheline" --sort
      order, i.e. if that is not used, which is the norm, then the user
      shouldn't care that he is running this, say, on an Android system where
      sysconf(_SC_LEVEL1_DCACHE_LINESIZE) and the
      /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size sysfs file
      isn't available.
      
      An upcoming patch will emit an warning only for "--sort ...,dcacheline,...".
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Chris Phlipot <cphlipot0@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-580cnkvftunyvt9n7unsholi@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      8811e8ea
  4. Jul 14, 2016
    • Arnaldo Carvalho de Melo's avatar
      tools: Make "__always_inline" just "inline" on Android · 8c98abff
      Arnaldo Carvalho de Melo authored
      
      
      As the gcc there is producing tons of:
      
        "warning: always_inline function might not be inlinable"
      
      At least on android-ndk-r12/platforms/android-24/arch-arm, so, for the
      time being, use this big hammer.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Chris Phlipot <cphlipot0@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-97l3eg3fnk5shmo4rsyyvj2t@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      8c98abff
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Do not provide dup sched_getcpu() prototype on Android · 09dd39d2
      Arnaldo Carvalho de Melo authored
      
      
      The Bionic libc has this definition, so don't duplicate it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Chris Phlipot <cphlipot0@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-rmd19832zkt07e4crdzyen9z@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      09dd39d2
    • Arnaldo Carvalho de Melo's avatar
      tools lib traceevent: Add correct header for ipv6 definitions · ca575ad2
      Arnaldo Carvalho de Melo authored
      
      
      We need to include netinet/in.h to get the in6_addr struct definition, needed to
      build it on the Android NDK:
      
        In file included from event-parse.c:36:0:
        /home/acme/android/android-ndk-r12/platforms/android-24/arch-arm/usr/include/netinet/ip6.h:82:18: error: field 'ip6_src' has incomplete type
          struct in6_addr ip6_src; /* source address */
      
      And it is the canonical way of getting IPv6 definitions, as described,
      for instance, in Linux's 'man ipv6'
      
      Doing that uncovers another problem: this source file uses PRIu64 but
      doesn't include it, depending on it being included by chance via the now
      replaced header (netinet/ip6.h), fix it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Chris Phlipot <cphlipot0@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-tilr31n3yaba1whsd47qlwa3@git.kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ca575ad2
    • Ingo Molnar's avatar
      Merge tag 'perf-core-for-mingo-20160713' of... · b29c6574
      Ingo Molnar authored
      
      Merge tag 'perf-core-for-mingo-20160713' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
      
      Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
      
      User visible changes:
      
      - Finish merging initial SDT (Statically Defined Traces) support, see
        cset comments for details about how it all works (Masami Hiramatsu)
      
      - Support attaching eBPF programs to tracepoints (Wang Nan)
      
      Infrastructure changes:
      
      - Fix up BITS_PER_LONG setting (Arnaldo Carvalho de Melo)
      
      - Add fallback from ELF_C_READ_MMAP to ELF_C_READ in objtool, fixing
        the build in libelf implementations lacking that elf_begin() cmd,
        such as Alpine Linux's (Arnaldo Carvalho de Melo)
      
      - Avoid checking code drift on busybox's diff in objtool (Arnaldo Carvalho de Melo)
      
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      b29c6574
    • Masami Hiramatsu's avatar
      perf test: Add a test case for SDT event · 8e5dc848
      Masami Hiramatsu authored
      
      
      Add a basic test case for SDT event support.  This test scans an SDT
      event in perftools and check whether the SDT event is correctly stored
      into the buildid cache.
      
      Here is an example:
      
        ----
        $ perf test sdt -v
        47: Test SDT event probing                                   :
        --- start ---
        test child forked, pid 20732
        Found 72 SDTs in /home/mhiramat/ksrc/linux/tools/perf/perf
        Writing cache: %sdt_perf:test_target=test_target
        Cache committed: 0
        symbol:test_target file:(null) line:0 offset:0 return:0 lazy:(null)
        test child finished with 0
        ---- end ----
        Test SDT event probing: Ok
        ----
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831796546.17065.1502584370844087537.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      8e5dc848
    • Masami Hiramatsu's avatar
      perf build: Add sdt feature detection · e26e63be
      Masami Hiramatsu authored
      
      
      This checks whether sys/sdt.h is available or not, which is required for
      DTRACE_PROBE().
      
      We can disable this feature by passing NO_SDT=1 when building.
      
      This flag will be used for SDT test case and further SDT events in
      perftools.
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831795615.17065.17513820540591053933.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e26e63be
    • Masami Hiramatsu's avatar
      perf probe: Support a special SDT probe format · 7e9fca51
      Masami Hiramatsu authored
      
      
      Support a special SDT probe format which can omit the '%' prefix only if
      the SDT group name starts with "sdt_". So, for example both of
      "%sdt_libc:setjump" and "sdt_libc:setjump" are acceptable for perf probe
      --add.
      
      E.g. without this:
      
        # perf probe -a sdt_libc:setjmp
        Semantic error :There is non-digit char in line number.
        ...
      
      With this:
      
        # perf probe -a sdt_libc:setjmp
        Added new event:
          sdt_libc:setjmp      (on %setjmp in /usr/lib64/libc-2.20.so)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e sdt_libc:setjmp -aR sleep 1
      
      Suggested-by: default avatarBrendan Gregg <brendan.d.gregg@gmail.com>
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831794674.17065.13359473252168740430.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7e9fca51
    • Masami Hiramatsu's avatar
      perf probe: Support @BUILDID or @FILE suffix for SDT events · a598180a
      Masami Hiramatsu authored
      
      
      Support @BUILDID or @FILE suffix for SDT events. This allows perf to add
      probes on SDTs/pre-cached events on given FILE or the file which has
      given BUILDID (also, this complements BUILDID.)
      
      For example, both gcc and libstdc++ has same SDTs as below.  If you
      would like to add a probe on sdt_libstdcxx:catch on gcc, you can do as
      below.
      
        ----
        # perf list sdt | tail -n 6
          sdt_libstdcxx:catch@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:rethrow@/usr/bin/gcc(0cc207fc4b27)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:throw@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
        # perf probe -a %sdt_libstdcxx:catch@0cc
        Added new event:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e sdt_libstdcxx:catch -aR sleep 1
        ----
      
      Committer note:
      
      Doing the full sequence of steps to get the results above:
      
      With a clean build-id cache:
      
        [root@jouet ~]# rm -rf ~/.debug/
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
        [root@jouet ~]#
      
      No events whatsoever, then, we can add all events in gcc to the build-id
      cache, doing a --add + --dry-run:
      
        [root@jouet ~]# perf probe --dry-run --cache -x /usr/bin/gcc --add %sdt_libstdcxx:\*
        Added new events:
          sdt_libstdcxx:throw  (on %* in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on %* in /usr/bin/gcc)
          sdt_libstdcxx:catch  (on %* in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]#
      
      It really didn't add any events, it just cached them:
      
        [root@jouet ~]# perf probe -l
        [root@jouet ~]#
      
      We can see that it was cached as:
      
        [root@jouet ~]# ls -la ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/
        total 976
        drwxr-xr-x. 2 root root   4096 Jul 13 21:47 .
        drwxr-xr-x. 3 root root   4096 Jul 13 21:47 ..
        -rwxr-xr-x. 4 root root 985912 Jun 22 18:52 elf
        -rw-r--r--. 1 root root    303 Jul 13 21:47 probes
        [root@jouet ~]# file ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/elf
        /root/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2, stripped
        [root@jouet ~]# cat ~/.debug/usr/bin/gcc/9a0730e2bcc6d2a2003d21ac46807e8ee6bcb7c2/probes
        %sdt_libstdcxx:throw=throw
        p:sdt_libstdcxx/throw /usr/bin/gcc:0x71ffd
        %sdt_libstdcxx:rethrow=rethrow
        p:sdt_libstdcxx/rethrow /usr/bin/gcc:0x720b8
        %sdt_libstdcxx:catch=catch
        p:sdt_libstdcxx/catch /usr/bin/gcc:0x7307f
        %sdt_libgcc:unwind=unwind
        p:sdt_libgcc/unwind /usr/bin/gcc:0x7eec0
        #sdt_libstdcxx:*=%*
        [root@jouet ~]#
      
      Ok, now we can use 'perf probe' to refer to those cached entries as:
      
        Humm, nope, doing as above we end up with:
      
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch
        Semantic error :* is bad for event name -it must follow C symbol-naming rule.
          Error: Failed to add events.
        [root@jouet ~]#
      
      But it worked at some point, lets try not using --dry-run:
      
      Resetting everything:
      
        # rm -rf ~/.debug/
        # perf probe -d *:*
        # perf probe -l
        # perf list sdt
      
          List of pre-defined events (to be used in -e):
      
        #
      
      Ok, now it cached everything, even things we haven't asked it to
      (sdt_libgcc:unwind):
      
        [root@jouet ~]# perf probe -x /usr/bin/gcc --add %sdt_libstdcxx:\*
        Added new events:
          sdt_libstdcxx:throw  (on %* in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on %* in /usr/bin/gcc)
          sdt_libstdcxx:catch  (on %* in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libgcc:unwind                                  [SDT event]
          sdt_libstdcxx:catch                                [SDT event]
          sdt_libstdcxx:rethrow                              [SDT event]
          sdt_libstdcxx:throw                                [SDT event]
        [root@jouet ~]#
      
      And we have the events in place:
      
        [root@jouet ~]# perf probe -l
          sdt_libstdcxx:catch  (on execute_cfa_program+1551@../../../libgcc/unwind-dw2.c in /usr/bin/gcc)
          sdt_libstdcxx:rethrow (on d_print_subexpr+280@libsupc++/cp-demangle.c in /usr/bin/gcc)
          sdt_libstdcxx:throw  (on d_print_subexpr+93@libsupc++/cp-demangle.c in /usr/bin/gcc)
        [root@jouet ~]#
      
      And trying to use them at least has 'perf trace --event sdt*:*' working.
      
      Then, if we try to add the ones in libstdc++:
      
        [root@jouet ~]# perf probe -x /usr/lib64/libstdc++.so.6 -a %sdt_libstdcxx:\*
        Error: event "catch" already exists.
         Hint: Remove existing event by 'perf probe -d'
               or force duplicates by 'perf probe -f'
               or set 'force=yes' in BPF source.
          Error: Failed to add events.
        [root@jouet ~]#
      
      Doesn't work, dups, but at least this served to, unbeknownst to the user, add
      the SDT probes in /usr/lib64/libstdc++.so.6!
      
        [root@jouet ~]# perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libgcc:unwind                                  [SDT event]
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
          sdt_libstdcxx:rethrow@/usr/bin/gcc(9a0730e2bcc6)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
          sdt_libstdcxx:throw@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
      
      Now we should be able to get to the original cset comment, if we remove all
      SDTs events in place, not from the cache, from the kernel, where it was set up as:
      
        [root@jouet ~]# ls -la /sys/kernel/debug/tracing/events/sdt_libstdcxx/
        total 0
        drwxr-xr-x.  5 root root 0 Jul 13 22:00 .
        drwxr-xr-x. 80 root root 0 Jul 13 21:56 ..
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 catch
        -rw-r--r--.  1 root root 0 Jul 13 22:00 enable
        -rw-r--r--.  1 root root 0 Jul 13 22:00 filter
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 rethrow
        drwxr-xr-x.  2 root root 0 Jul 13 22:00 throw
        [root@jouet ~]#
      
        [root@jouet ~]# head -2 /sys/kernel/debug/tracing/events/sdt_libstdcxx/throw/format
        name: throw
        ID: 2059
        [root@jouet ~]#
      
      Now to remove it:
      
        [root@jouet ~]# perf probe -d sdt_libstdc*:*
        Removed event: sdt_libstdcxx:catch
        Removed event: sdt_libstdcxx:rethrow
        Removed event: sdt_libstdcxx:throw
        [root@jouet ~]#
      
      Which caused:
      
        [root@jouet ~]# ls -la /sys/kernel/debug/tracing/events/sdt_libstdcxx/
        ls: cannot access '/sys/kernel/debug/tracing/events/sdt_libstdcxx/': No such file or directory
        [root@jouet ~]#
      
      Ok, now we can do:
      
        [root@jouet ~]# perf list sdt_libstdcxx:catch
      
        List of pre-defined events (to be used in -e):
      
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
      
      So, these are not really 'pre-defined events', i.e. we can't use them with
      'perf record --event':
      
        [root@jouet ~]# perf record --event sdt_libstdcxx:catch*
        event syntax error: 'sdt_libstdcxx:catch*'
                             \___ unknown tracepoint
      
        Error:	File /sys/kernel/debug/tracing/events/sdt_libstdcxx/catch* not found.
        Hint:	Perhaps this kernel misses some CONFIG_ setting to enable this feature?.
      <SNIP>
        [root@jouet ~]#
      
      To have it really pre-defined we must use perf probe to get its definition from
      the cache and set it up in the kernel, creating the tracepoint to _then_ use it
      with 'perf record --event':
      
        [root@jouet ~]# perf probe -a sdt_libstdcxx:catch
        Semantic error :There is non-digit char in line number.
        <SNIP>
      
      Oops, there is another gotcha here, we need that pesky '%' character:
      
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch
        Added new events:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
          sdt_libstdcxx:catch_1 (on %catch in /usr/lib64/libstdc++.so.6.0.22)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch_1 -aR sleep 1
      
        [root@jouet ~]#
      
      But then we added _two_ events, one with the name we expected, the other one
      with a _ added, when doing the analysis we need to pay attention to who maps to
      who.
      
      And here is where we get to the point of this patch, which is to be able to
      disambiguate those definitions for 'catch' in the build-id cache, but first we need
      remove those events we just added:
      
      [root@jouet ~]# perf probe -d %sdt_libstdcxx:catch
      
      Oops, that didn't remove anything, we need to _remove_ that % char in this case:
      
        [root@jouet ~]# perf probe -d sdt_libstdcxx:catch
        Removed event: sdt_libstdcxx:catch
      
      And we need to remove the other event added, i.e. I forgot to add a * at the end:
      
        [root@jouet ~]# perf probe -d sdt_libstdcxx:catch*
        Removed event: sdt_libstdcxx:catch_1
        [root@jouet ~]#
      
      Ok, disambiguating it using what is in this patch:
      
        [root@jouet ~]# perf list sdt_libstdcxx:catch
      
        List of pre-defined events (to be used in -e):
      
          sdt_libstdcxx:catch@/usr/bin/gcc(9a0730e2bcc6)     [SDT event]
          sdt_libstdcxx:catch@/usr/lib64/libstdc++.so.6.0.22(ef2b7066559a) [SDT event]
        [root@jouet ~]#
        [root@jouet ~]# perf probe -a %sdt_libstdcxx:catch@9a07
        Added new event:
          sdt_libstdcxx:catch  (on %catch in /usr/bin/gcc)
      
        You can now use it in all perf tools, such as:
      
      	perf record -e sdt_libstdcxx:catch -aR sleep 1
      
        [root@jouet ~]# perf probe -l
          sdt_libstdcxx:catch  (on execute_cfa_program+1551@../../../libgcc/unwind-dw2.c in /usr/bin/gcc)
        [root@jouet ~]#
      
      Yeah, it works! But we need to try and simplify this :-)
      
      Update: Some aspects of this simplification take place in the following
              patches.
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831793746.17065.13065062753978236612.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a598180a
    • Masami Hiramatsu's avatar
      perf list: Show SDT and pre-cached events · 40218dae
      Masami Hiramatsu authored
      
      
      Show SDT and pre-cached events by perf-list with "sdt". This also shows
      the binary and build-id where the events are placed only when there are
      same name events on different binaries.
      
      e.g.:
      
        # perf list sdt
      
        List of pre-defined events (to be used in -e):
      
          sdt_libc:lll_futex_wake                            [SDT event]
          sdt_libc:lll_lock_wait_private                     [SDT event]
          sdt_libc:longjmp                                   [SDT event]
          sdt_libc:longjmp_target                            [SDT event]
        ...
          sdt_libstdcxx:rethrow@/usr/bin/gcc(0cc207fc4b27)   [SDT event]
          sdt_libstdcxx:rethrow@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
          sdt_libstdcxx:throw@/usr/bin/gcc(0cc207fc4b27)     [SDT event]
          sdt_libstdcxx:throw@/usr/lib64/libstdc++.so.6.0.20(91c7a88fdf49)
      
      The binary path and build-id are shown in below format;
      
        <GROUP>:<EVENT>@<PATH>(<BUILD-ID>)
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/20160624090646.25421.44225.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      40218dae
    • Masami Hiramatsu's avatar
      perf probe: Search SDT/cached event from all probe caches · 1de7b8bf
      Masami Hiramatsu authored
      
      
      Search SDT/cached event from all probe caches if user doesn't pass any
      binary. With this, we don't have to specify target binary for SDT and
      named cached events (which start with %).
      
      E.g. without this, a target binary must be passed with -x.
      
        # perf probe -x /usr/lib64/libc-2.20.so -a %sdt_libc:\*
      
      With this change, we don't need it anymore.
      
        # perf probe -a %sdt_libc:\*
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831792812.17065.2353705982669445313.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1de7b8bf
    • Masami Hiramatsu's avatar
      perf probe: Allow wildcard for cached events · 42bba263
      Masami Hiramatsu authored
      
      
      Allo glob wildcard for reusing cached/SDT events. E.g.
      
        # perf probe -x /usr/lib64/libc-2.20.so -a %sdt_libc:\*
      
      This example adds probes for all SDT in libc.
      Note that the SDTs must have been scanned by perf buildid-cache.
      
      Committer note:
      
      Using it to check what of those SDT probes would take place when doing
      a cargo run (rust):
      
        # trace --no-sys --event sdt_libc:* cargo run
           0.000 sdt_libc:setjmp:(7f326b69c4d1))
          28.423 sdt_libc:setjmp:(7f4b0a5364d1))
          29.000 sdt_libc:setjmp:(7f4b0a5364d1))
          88.597 sdt_libc:setjmp:(7fc01fd414d1))
          89.220 sdt_libc:setjmp:(7fc01fd414d1))
          95.501 sdt_libc:setjmp:(7f326b69c4d1))
           Running `target/debug/hello_world`
          97.110 sdt_libc:setjmp:(7f95e09234d1))
        Hello, world!
        #
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831791813.17065.17846564230840594888.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      42bba263
    • Masami Hiramatsu's avatar
      perf probe-cache: Add for_each_probe_cache_entry() wrapper · 05bf2c8a
      Masami Hiramatsu authored
      
      
      Add for_each_probe_cache_entry() wrapper macro for hiding list in
      probe_cache.
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831790386.17065.15082256697569419710.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      05bf2c8a
    • Masami Hiramatsu's avatar
      perf probe: Make --list show only available cached events · c3492a3a
      Masami Hiramatsu authored
      
      
      Make "perf probe --cache --list" show only available cached events by
      checking build-id validity.
      
      E.g. without this patch:
        ----
        $ ./perf probe --cache --add oldevent=cmd_probe
        $ make #(to update ./perf)
        $ ./perf probe --cache --add newevent=cmd_probe
        $ ./perf probe --cache --list
        /home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
        probe_perf:newevent=cmd_probe
        /home/mhiramat/ksrc/linux/tools/perf/perf (c2e44d614e33e1
        probe_perf:oldevent=cmd_probe
        ----
      It shows both of old and new events but user can not use old one.
      With this;
        ----
        $ ./perf probe --cache -l
        /home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
        probe_perf:newevent=cmd_probe
        ----
      
      This shows only new events which are on the existing binary.
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831789417.17065.17896487479879669610.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c3492a3a
    • Masami Hiramatsu's avatar
      perf probe: Accept %sdt and %cached event name · 36a009fe
      Masami Hiramatsu authored
      
      
      To improve usability, support %[PROVIDER:]SDTEVENT format to add new
      probes on SDT and cached events.
      
      e.g.
        ----
        # perf probe -x /lib/libc-2.17.so  %lll_lock_wait_private
        Added new event:
          sdt_libc:lll_lock_wait_private (on %lll_lock_wait_private in /usr/lib/libc-2.17.so)
      
        You can now use it in all perf tools, such as:
      
                perf record -e sdt_libc:lll_lock_wait_private -aR sleep 1
      
        # perf probe -l | more
          sdt_libc:lll_lock_wait_private (on __lll_lock_wait_private+21 in /usr/lib/libc-2.17.so)
        ----
      
      Note that this is not only for SDT events, but also normal
      events with event-name.
      
      e.g. define "myevent" on cache (-n doesn't add the real probe)
        ----
        # perf probe -x ./perf --cache -n --add 'myevent=dso__load $params'
        ----
        Reuse the "myevent" from cache as below.
        ----
        # perf probe -x ./perf %myevent
        ----
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831788372.17065.3645054540325909346.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      36a009fe
    • Masami Hiramatsu's avatar
      perf probe: Fix to show correct error message for $vars and $params · f6eb0518
      Masami Hiramatsu authored
      
      
      Fix to show correct error messages for $vars and $params because
      those special variables requires debug information to find the
      real variables or function parameters.
      
      E.g. without this fix;
        ----
        # perf probe -x /lib64/libc-2.23.so getaddrinfo \$params
        Failed to write event: Invalid argument
        Please upgrade your kernel to at least 3.14 to have access to feature $params
          Error: Failed to add events.
        ----
      
      Perf ends up with an error, but the message is not correct.  With this
      fix, perf shows correct error message as below.
      
        ----
        # perf probe -x /lib64/libc-2.23.so getaddrinfo \$params
        The /usr/lib64/libc-2.23.so file has no debug information.
        Rebuild with -g, or install an appropriate debuginfo package.
          Error: Failed to add events.
        ----
      
      Reported-and-Tested-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/146831787438.17065.6152436996780110699.stgit@devbox
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f6eb0518
    • Wang Nan's avatar
      perf bpf: Support BPF program attach to tracepoints · b4ee6d41
      Wang Nan authored
      To support 98b5c2c6
      
       ("perf, bpf: allow bpf programs attach to
      tracepoints"), this patch allows BPF scripts to select tracepoints in
      their section name.
      
      Example:
      
        # cat test_tracepoint.c
        /*********************************************/
        #include <uapi/linux/bpf.h>
        #define SEC(NAME) __attribute__((section(NAME), used))
        SEC("raw_syscalls:sys_enter")
        int func(void *ctx)
        {
       	/*
       	 * /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format:
       	 * ...
       	 * field:long id;	offset:8;	size:8;	signed:1;
       	 * ...
       	 * ctx + 8 select 'id'
       	 */
       	u64 id = *((u64 *)(ctx + 8));
       	if (id == 1)
       		return 1;
       	return 0;
        }
        SEC("_write=sys_write")
        int _write(void *ctx)
        {
       	return 1;
        }
        char _license[] SEC("license") = "GPL";
        int _version SEC("version") = LINUX_VERSION_CODE;
        /*********************************************/
        # perf record -e ./test_tracepoint.c  dd if=/dev/zero of=/dev/null count=5
        5+0 records in
        5+0 records out
        2560 bytes (2.6 kB) copied, 6.2281e-05 s, 41.1 MB/s
        [ perf record: Woken up 1 times to write data ]
        # perf script
               dd 13436 [005] 1596.490869: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, 7ffe82470d60, ffffffffffffe020, fffff
               dd 13436 [005] 1596.490871:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490874:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490876:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490879:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
               dd 13436 [005] 1596.490882:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490900: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1f, 40acb8, 7f44bac74700, 7f44baa4fba
               dd 13436 [005] 1596.490901:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffffa, 7f44bac74700, 7f44baa4f
               dd 13436 [005] 1596.490918:  perf_bpf_probe:_write: (ffffffff812351e0)
               dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffff9, 7f44bac74700, 7f44baa4f
               dd 13436 [005] 1596.490933:  perf_bpf_probe:_write: (ffffffff812351e0)
      
      Committer note:
      
      Further testing:
      
        # trace --no-sys --event /home/acme/bpf/tracepoint.c cat /etc/passwd > /dev/null
           0.000 raw_syscalls:sys_enter:NR 1 (1, 7f0490504000, c48, 7f0490503010, ffffffffffffffff, 0))
           0.006 perf_bpf_probe:_write:(ffffffff81241bc0))
        #
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b4ee6d41
    • Wang Nan's avatar
      perf bpf: Rename bpf__foreach_tev() to bpf__foreach_event() · cd102d70
      Wang Nan authored
      
      
      Following commit will allow BPF script attach to tracepoints.
      bpf__foreach_tev() will iterate over all events, not only kprobes.
      Rename it to bpf__foreach_event().
      
      Since only group and event are used by caller, there's no need to pass
      full 'struct probe_trace_event' to bpf_prog_iter_callback_t. Pass only
      these two strings. After this patch bpf_prog_iter_callback_t natually
      support tracepoints.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-5-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cd102d70
    • Wang Nan's avatar
      perf event parser: Add const qualifier to evt_name and sys_name · 8c619d6a
      Wang Nan authored
      
      
      Add missing 'const' qualifiers so following commits are able to create
      tracepoints using const strings.
      
      Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1468406646-21642-4-git-send-email-wangnan0@huawei.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      8c619d6a