1. 19 Oct, 2019 17 commits
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Make the mmap_flags strarray visible outside of its beautifier · f77526be
      Arnaldo Carvalho de Melo authored
      So that we can later use it with the strarray__strtoul_flags() routine
      that will be soon introduced.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-vldj3ch8su6i20to5eq31e8x@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f77526be
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Use strtoul for the fcntl 'cmd' argument · 82c38338
      Arnaldo Carvalho de Melo authored
      Since its values are in two ranges of values we ended up codifying it
      using a 'struct strarrays', so now hook it up with STUL_STRARRAYS so
      that we can do:
      
        # perf trace -e syscalls:*enter_fcntl --filter=cmd==SETLK||cmd==SETLKW
           0.000 sssd_kcm/19021 syscalls:sys_enter_fcntl(fd: 13</var/lib/sss/secrets/secrets.ldb>, cmd: SETLK, arg: 0x7ffcf0a4dee0)
           1.523 sssd_kcm/19021 syscalls:sys_enter_fcntl(fd: 13</var/lib/sss/secrets/secrets.ldb>, cmd: SETLK, arg: 0x7ffcf0a4de90)
           1.629 sssd_kcm/19021 syscalls:sys_enter_fcntl(fd: 13</var/lib/sss/secrets/secrets.ldb>, cmd: SETLK, arg: 0x7ffcf0a4de90)
           2.711 sssd_kcm/19021 syscalls:sys_enter_fcntl(fd: 13</var/lib/sss/secrets/secrets.ldb>, cmd: SETLK, arg: 0x7ffcf0a4de70)
        ^C#
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-mob96wyzri4r3rvyigqfjv0a@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      82c38338
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Introduce syscall_arg__strtoul_strarrays() · 1a8a90b8
      Arnaldo Carvalho de Melo authored
      To allow going from string to integer for 'struct strarrays'.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-b1ia3xzcy72hv0u4m168fcd0@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1a8a90b8
    • Jiri Olsa's avatar
      libperf: Add pr_err() macro · dcc68542
      Jiri Olsa authored
      And missing include for "perf/core.h" header, which provides LIBPERF_*
      debug levels and add missing pr_err() support.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-11-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      dcc68542
    • Jiri Olsa's avatar
      libperf: Do not export perf_evsel__init()/perf_evlist__init() · c27feefe
      Jiri Olsa authored
      There's no point in exporting perf_evsel__init()/perf_evlist__init(),
      it's called from perf_evsel__new()/perf_evlist__new() respectively.
      
      It's used only from perf where perf_evsel()/perf_evlist() is embedded
      perf's evsel/evlist.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-10-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c27feefe
    • Jiri Olsa's avatar
      libperf: Keep count of failed tests · 301a89f8
      Jiri Olsa authored
      Keep the count of failed tests, so we get better output with failures,
      like:
      
        # make tests
        ...
        running static:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...FAILED test-evlist.c:53 failed to create evsel2
        FAILED test-evlist.c:163 failed to create evsel2
        FAILED test-evlist.c:287 failed count
          FAILED (3)
        - running test-evsel.c...OK
        running dynamic:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...FAILED test-evlist.c:53 failed to create evsel2
        FAILED test-evlist.c:163 failed to create evsel2
        FAILED test-evlist.c:287 failed count
          FAILED (3)
        - running test-evsel.c...OK
       ...
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-9-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      301a89f8
    • Jiri Olsa's avatar
      libperf: Add tests_mmap_cpus test · 37ac1bbd
      Jiri Olsa authored
      Add mmaping tests that generates prctl call on every cpu validates it
      gets all the related events in ring buffer.
      
      Committer testing:
      
        # make -C tools/perf/lib tests
        make: Entering directory '/home/acme/git/perf/tools/perf/lib'
          LINK     test-cpumap-a
          LINK     test-threadmap-a
          LINK     test-evlist-a
          LINK     test-evsel-a
          LINK     test-cpumap-so
          LINK     test-threadmap-so
          LINK     test-evlist-so
          LINK     test-evsel-so
        running static:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...OK
        - running test-evsel.c...OK
        running dynamic:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...OK
        - running test-evsel.c...OK
        make: Leaving directory '/home/acme/git/perf/tools/perf/lib'
        #
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-8-jolsa@kernel.org
      [ Added _GNU_SOURCE define for sched.h to get sched_[gs]et_affinity
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      37ac1bbd
    • Jiri Olsa's avatar
      libperf: Add tests_mmap_thread test · bd6b7736
      Jiri Olsa authored
      Add mmaping tests that generates 100 prctl calls in monitored child
      process and validates it gets 100 events in ring buffer.
      
      Committer tests:
      
        # make -C tools/perf/lib tests
        make: Entering directory '/home/acme/git/perf/tools/perf/lib'
          LINK     test-cpumap-a
          LINK     test-threadmap-a
          LINK     test-evlist-a
          LINK     test-evsel-a
          LINK     test-cpumap-so
          LINK     test-threadmap-so
          LINK     test-evlist-so
          LINK     test-evsel-so
        running static:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...OK
        - running test-evsel.c...OK
        running dynamic:
        - running test-cpumap.c...OK
        - running test-threadmap.c...OK
        - running test-evlist.c...OK
        - running test-evsel.c...OK
        make: Leaving directory '/home/acme/git/perf/tools/perf/lib'
        #
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-7-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bd6b7736
    • Jiri Olsa's avatar
      libperf: Link static tests with libapi.a · 395e62cd
      Jiri Olsa authored
      Both static and dynamic tests needs to link with libapi.a, because it's
      using its functions. Also include path for libapi includes.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-5-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      395e62cd
    • Jiri Olsa's avatar
      libperf: Move mask setup to perf_evlist__mmap_ops() · b6cd35e4
      Jiri Olsa authored
      Move the mask setup to perf_evlist__mmap_ops(), because it's the same on
      both perf and libperf path.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-4-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b6cd35e4
    • Jiri Olsa's avatar
      libperf: Move mmap allocation to perf_evlist__mmap_ops::get · 3805e4f3
      Jiri Olsa authored
      Move allocation of the mmap array into perf_evlist__mmap_ops::get, to
      centralize the mmap allocation.
      
      Also move nr_mmap setup to perf_evlist__mmap_ops so it's centralized and
      shared by both perf and libperf mmap code.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-3-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3805e4f3
    • Jiri Olsa's avatar
      libperf: Introduce perf_evlist__for_each_mmap() · 6eb65f7a
      Jiri Olsa authored
      Add the perf_evlist__for_each_mmap() function and export it in the
      perf/evlist.h header, so that the user can iterate through 'struct
      perf_mmap' objects.
      
      Add a internal perf_mmap__link() function to do the actual linking.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191017105918.20873-2-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      6eb65f7a
    • Leo Yan's avatar
      perf tests: Disable bp_signal testing for arm64 · 6a5f3d94
      Leo Yan authored
      As there are several discussions for enabling perf breakpoint signal
      testing on arm64 platform: arm64 needs to rely on single-step to execute
      the breakpointed instruction and then reinstall the breakpoint exception
      handler.  But if we hook the breakpoint with a signal, the signal
      handler will do the stepping rather than the breakpointed instruction,
      this causes infinite loops as below:
      
               Kernel space              |            Userspace
        ---------------------------------|--------------------------------
                                         |  __test_function() -> hit
      				   |                       breakpoint
        breakpoint_handler()             |
          `-> user_enable_single_step()  |
        do_signal()                      |
                                         |  sig_handler() -> Step one
      				   |                instruction and
      				   |                trap to kernel
        single_step_handler()            |
          `-> reinstall_suspended_bps()  |
                                         |  __test_function() -> hit
      				   |     breakpoint again and
      				   |     repeat up flow infinitely
      
      As Will Deacon mentioned [1]: "that we require the overflow handler to
      do the stepping on arm/arm64, which is relied upon by GDB/ptrace. The
      hw_breakpoint code is a complete disaster so my preference would be to
      rip out the perf part and just implement something directly in ptrace,
      but it's a pretty horrible job".  Though Will commented this on arm
      architecture, but the comment also can apply on arm64 architecture.
      
      For complete information, I searched online and found a few years back,
      Wang Nan sent one patch 'arm64: Store breakpoint single step state into
      pstate' [2]; the patch tried to resolve this issue by avoiding single
      stepping in signal handler and defer to enable the signal stepping when
      return to __test_function().  The fixing was not merged due to the
      concern for missing to handle different usage cases.
      
      Based on the info, the most feasible way is to skip Perf breakpoint
      signal testing for arm64 and this could avoid the duplicate
      investigation efforts when people see the failure.  This patch skips
      this case on arm64 platform, which is same with arm architecture.
      
      [1] https://lkml.org/lkml/2018/11/15/205
      [2] https://lkml.org/lkml/2015/12/23/477Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Brajeswar Ghosh <brajeswar.linux@gmail.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <songliubraving@fb.com>
      Cc: Souptick Joarder <jrdr.linux@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Link: http://lore.kernel.org/lkml/20191018085531.6348-3-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      6a5f3d94
    • Leo Yan's avatar
      perf tests bp_account: Add dedicated checking helper is_supported() · e533eadf
      Leo Yan authored
      The arm architecture supports breakpoint accounting but it doesn't
      support breakpoint overflow signal handling.  The current code uses the
      same checking helper, thus it disables both testings (bp_account and
      bp_signal) for arm platform.
      
      For handling two testings separately, this patch adds a dedicated
      checking helper is_supported() for breakpoint accounting testing, thus
      it allows supporting breakpoint accounting testing on arm platform; the
      old helper test__bp_signal_is_supported() is only used to checking for
      breakpoint overflow signal testing.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Brajeswar Ghosh <brajeswar.linux@gmail.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <songliubraving@fb.com>
      Cc: Souptick Joarder <jrdr.linux@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Link: http://lore.kernel.org/lkml/20191018085531.6348-2-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e533eadf
    • Leo Yan's avatar
      perf tests: Remove needless headers for bp_account · 12d79563
      Leo Yan authored
      A few headers are not needed and were introduced by copying from other
      test file.  This patch removes the needless headers for the breakpoint
      accounting testing.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Brajeswar Ghosh <brajeswar.linux@gmail.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <songliubraving@fb.com>
      Cc: Souptick Joarder <jrdr.linux@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Link: http://lore.kernel.org/lkml/20191018085531.6348-1-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      12d79563
    • Jin Yao's avatar
      perf list: Hide deprecated events by default · a7f6c8c8
      Jin Yao authored
      There are some deprecated events listed by perf list. But we can't
      remove them from perf list with ease because some old scripts may use
      them.
      
      Deprecated events are old names of renamed events.  When an event gets
      renamed the old name is kept around for some time and marked with
      Deprecated. The newer Intel event lists in the tree already have these
      headers.
      
      So we need to keep them in the event list, but provide a new option to
      show them. The new option is "--deprecated".
      
      With this patch, the deprecated events are hidden by default but they
      can be displayed when option "--deprecated" is enabled.
      Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@intel.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191015025357.8708-1-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a7f6c8c8
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Pass a syscall_arg to syscall_arg_fmt->strtoul() · 9afec87e
      Arnaldo Carvalho de Melo authored
      With just what we need for the STUL_STRARRAY, i.e. the 'struct strarray'
      pointer to be used, just like with syscall_arg_fmt->scnprintf() for the
      other direction (number -> string).
      
      With this all the strarrays that are associated with syscalls can be
      used with '-e syscalls:sys_enter_SYSCALLNAME --filter', and soon will be
      possible as well to use with the strace-like shorter form, with just the
      syscall names, i.e. something like:
      
         -e lseek/whence==END/
      
      For now we have to use the longer form:
      
          # perf trace -e syscalls:sys_enter_lseek
             0.000 pool/2242 syscalls:sys_enter_lseek(fd: 14<anon_inode:[timerfd]>, offset: 0, whence: CUR)
             0.031 pool/2242 syscalls:sys_enter_lseek(fd: 15<anon_inode:[timerfd]>, offset: 0, whence: CUR)
             0.046 pool/2242 syscalls:sys_enter_lseek(fd: 16<anon_inode:[timerfd]>, offset: 0, whence: CUR)
          5003.528 pool/2242 syscalls:sys_enter_lseek(fd: 14<anon_inode:[timerfd]>, offset: 0, whence: CUR)
          5003.575 pool/2242 syscalls:sys_enter_lseek(fd: 15<anon_inode:[timerfd]>, offset: 0, whence: CUR)
          5003.593 pool/2242 syscalls:sys_enter_lseek(fd: 16<anon_inode:[timerfd]>, offset: 0, whence: CUR)
         10002.017 pool/2242 syscalls:sys_enter_lseek(fd: 14<anon_inode:[timerfd]>, offset: 0, whence: CUR)
         10002.051 pool/2242 syscalls:sys_enter_lseek(fd: 15<anon_inode:[timerfd]>, offset: 0, whence: CUR)
         10002.068 pool/2242 syscalls:sys_enter_lseek(fd: 16<anon_inode:[timerfd]>, offset: 0, whence: CUR)
        ^C# perf trace -e syscalls:sys_enter_lseek --filter="whence!=CUR"
             0.000 sshd/24476 syscalls:sys_enter_lseek(fd: 3, offset: 9032, whence: SET)
             0.060 sshd/24476 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libcrypt.so.2.0.0>, offset: 9032, whence: SET)
             0.187 sshd/24476 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libcrypt.so.2.0.0>, offset: 118632, whence: SET)
             0.203 sshd/24476 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libcrypt.so.2.0.0>, offset: 118632, whence: SET)
             0.349 sshd/24476 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libcrypt.so.2.0.0>, offset: 61936, whence: SET)
        ^C#
      
      And for those curious about what are those lseek(DSO, offset, SET), well, its the loader:
      
        # perf trace -e syscalls:sys_enter_lseek/max-stack=16/ --filter="whence!=CUR"
           0.000 sshd/24495 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libgcrypt.so.20.2.5>, offset: 9032, whence: SET)
                                             __libc_lseek64 (/usr/lib64/ld-2.29.so)
                                             _dl_map_object (/usr/lib64/ld-2.29.so)
           0.067 sshd/24495 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libgcrypt.so.20.2.5>, offset: 9032, whence: SET)
                                             __libc_lseek64 (/usr/lib64/ld-2.29.so)
                                             _dl_map_object_from_fd (/usr/lib64/ld-2.29.so)
                                             _dl_map_object (/usr/lib64/ld-2.29.so)
           0.198 sshd/24495 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libgcrypt.so.20.2.5>, offset: 118632, whence: SET)
                                             __libc_lseek64 (/usr/lib64/ld-2.29.so)
                                             _dl_map_object (/usr/lib64/ld-2.29.so)
           0.219 sshd/24495 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libgcrypt.so.20.2.5>, offset: 118632, whence: SET)
                                             __libc_lseek64 (/usr/lib64/ld-2.29.so)
                                             _dl_map_object_from_fd (/usr/lib64/ld-2.29.so)
                                             _dl_map_object (/usr/lib64/ld-2.29.so)
        ^C#
      
      :-)
      
      With this we can use strings in strarrays in filters, which allows us to
      reuse all these that are in place for syscalls:
      
        $ find tools/perf/trace/beauty/ -name "*.c" | xargs grep -w DEFINE_STRARRAY
        tools/perf/trace/beauty/fcntl.c:	static DEFINE_STRARRAY(fcntl_setlease, "F_");
        tools/perf/trace/beauty/mmap.c:       static DEFINE_STRARRAY(mmap_flags, "MAP_");
        tools/perf/trace/beauty/mmap.c:       static DEFINE_STRARRAY(madvise_advices, "MADV_");
        tools/perf/trace/beauty/sync_file_range.c:       static DEFINE_STRARRAY(sync_file_range_flags, "SYNC_FILE_RANGE_");
        tools/perf/trace/beauty/socket.c:	static DEFINE_STRARRAY(socket_ipproto, "IPPROTO_");
        tools/perf/trace/beauty/mount_flags.c:	static DEFINE_STRARRAY(mount_flags, "MS_");
        tools/perf/trace/beauty/pkey_alloc.c:	static DEFINE_STRARRAY(pkey_alloc_access_rights, "PKEY_");
        tools/perf/trace/beauty/sockaddr.c:DEFINE_STRARRAY(socket_families, "PF_");
        tools/perf/trace/beauty/tracepoints/x86_irq_vectors.c:static DEFINE_STRARRAY(x86_irq_vectors, "_VECTOR");
        tools/perf/trace/beauty/tracepoints/x86_msr.c:static DEFINE_STRARRAY(x86_MSRs, "MSR_");
        tools/perf/trace/beauty/prctl.c:	static DEFINE_STRARRAY(prctl_options, "PR_");
        tools/perf/trace/beauty/prctl.c:	static DEFINE_STRARRAY(prctl_set_mm_options, "PR_SET_MM_");
        tools/perf/trace/beauty/fspick.c:       static DEFINE_STRARRAY(fspick_flags, "FSPICK_");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(ioctl_tty_cmd, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(drm_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(sndrv_pcm_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(sndrv_ctl_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(kvm_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(vhost_virtio_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(vhost_virtio_ioctl_read_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(perf_ioctl_cmds, "");
        tools/perf/trace/beauty/ioctl.c:	static DEFINE_STRARRAY(usbdevfs_ioctl_cmds, "");
        tools/perf/trace/beauty/fsmount.c:       static DEFINE_STRARRAY(fsmount_attr_flags, "MOUNT_ATTR_");
        tools/perf/trace/beauty/renameat.c:       static DEFINE_STRARRAY(rename_flags, "RENAME_");
        tools/perf/trace/beauty/kcmp.c:	static DEFINE_STRARRAY(kcmp_types, "KCMP_");
        tools/perf/trace/beauty/move_mount.c:       static DEFINE_STRARRAY(move_mount_flags, "MOVE_MOUNT_");
        $
      
      Well, some, as the mmap flags are like:
      
        $ tools/perf/trace/beauty/mmap_flags.sh
        static const char *mmap_flags[] = {
        	[ilog2(0x40) + 1] = "32BIT",
        	[ilog2(0x01) + 1] = "SHARED",
        	[ilog2(0x02) + 1] = "PRIVATE",
        	[ilog2(0x10) + 1] = "FIXED",
        	[ilog2(0x20) + 1] = "ANONYMOUS",
        	[ilog2(0x008000) + 1] = "POPULATE",
        	[ilog2(0x010000) + 1] = "NONBLOCK",
        	[ilog2(0x020000) + 1] = "STACK",
        	[ilog2(0x040000) + 1] = "HUGETLB",
        	[ilog2(0x080000) + 1] = "SYNC",
        	[ilog2(0x100000) + 1] = "FIXED_NOREPLACE",
        	[ilog2(0x0100) + 1] = "GROWSDOWN",
        	[ilog2(0x0800) + 1] = "DENYWRITE",
        	[ilog2(0x1000) + 1] = "EXECUTABLE",
        	[ilog2(0x2000) + 1] = "LOCKED",
        	[ilog2(0x4000) + 1] = "NORESERVE",
        };
        $
      
      So we'll need a strarray__strtoul_flags() that will break donw the flags
      into tokens separated by '|' before doing the lookup and then go on
      reconstructing the value from, say:
      
            # perf trace -e syscalls:sys_enter_mmap --filter="flags==PRIVATE|FIXED|DENYWRITE"
      
      into:
      
            # perf trace -e syscalls:sys_enter_mmap --filter="flags==0x2|0x10|0x0800"
      
      and finally into:
      
            # perf trace -e syscalls:sys_enter_mmap --filter="flags==0x812"
      
      That is what we see if we don't use the augmented view obtained from:
      
        # perf trace -e mmap
        <SNIP>
        211792.885 procmail/15393 mmap(addr: 0x7fcd11645000, len: 8192, prot: READ, flags: PRIVATE|FIXED|DENYWRITE, fd: 8, off: 0xa000) = 0x7fcd11645000
        <SNIP>
      
      But plain use tracefs:
      
              procmail-15559 [000] .... 54557.178262: sys_mmap(addr: 7f5c9bf7a000, len: 9b000, prot: 1, flags: 812, fd: 3, off: a9000)
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-c6mgkjt8ujnc263eld5tb7q3@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9afec87e
  2. 18 Oct, 2019 5 commits
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Honour --max-events in processing syscalls:sys_enter_* · db25bf98
      Arnaldo Carvalho de Melo authored
      We were doing this only at the sys_exit syscall tracepoint, as for
      strace-like we count the pair of sys_enter and sys_exit as one event,
      but when asking specifically for a the syscalls:sys_enter_NAME
      tracepoint we need to count each of those as an event.
      
      I.e. things like:
      
        # perf trace --max-events=4 -e syscalls:sys_enter_lseek
           0.000 pool/2242 syscalls:sys_enter_lseek(fd: 14<anon_inode:[timerfd]>, offset: 0, whence: CUR)
           0.034 pool/2242 syscalls:sys_enter_lseek(fd: 15<anon_inode:[timerfd]>, offset: 0, whence: CUR)
           0.051 pool/2242 syscalls:sys_enter_lseek(fd: 16<anon_inode:[timerfd]>, offset: 0, whence: CUR)
        2307.900 sshd/30800 syscalls:sys_enter_lseek(fd: 3</usr/lib64/libsystemd.so.0.25.0>, offset: 9032, whence: SET)
        #
      
      Were going on forever, since we only had sys_enter events.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-0ob1dky1a9ijlfrfhxyl40wr@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      db25bf98
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Introduce syscall_arg__strtoul_strarray() · d066da97
      Arnaldo Carvalho de Melo authored
      To go from strarrays strings to its indexes.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-wta0qvo207z27huib2c4ijxq@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d066da97
    • Steven Rostedt (VMware)'s avatar
      perf tools: Remove unused trace_find_next_event() · 9bdff5b6
      Steven Rostedt (VMware) authored
      trace_find_next_event() was buggy and pretty much a useless helper. As
      there are no more users, just remove it.
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Tzvetomir Stoyanov <tstoyanov@vmware.com>
      Cc: linux-trace-devel@vger.kernel.org
      Link: http://lore.kernel.org/lkml/20191017210636.224045576@goodmis.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9bdff5b6
    • Steven Rostedt (VMware)'s avatar
      perf scripting engines: Iterate on tep event arrays directly · a5e05abc
      Steven Rostedt (VMware) authored
      Instead of calling a useless (and broken) helper function to get the
      next event of a tep event array, just get the array directly and iterate
      over it.
      
      Note, the broken part was from trace_find_next_event() which after this
      will no longer be used, and can be removed.
      
      Committer notes:
      
      This fixes a segfault when generating python scripts from perf.data
      files with multiple tracepoint events, i.e. the following use case is
      fixed by this patch:
      
        # perf record -e sched:* sleep 1
        [ perf record: Woken up 31 times to write data ]
        [ perf record: Captured and wrote 0.031 MB perf.data (9 samples) ]
        # perf script -g python
        Segmentation fault (core dumped)
        #
      Reported-by: default avatarDaniel Bristot de Oliveira <bristot@redhat.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Tzvetomir Stoyanov <tstoyanov@vmware.com>
      Cc: linux-trace-devel@vger.kernel.org
      Link: http://lkml.kernel.org/r/20191017153733.630cd5eb@gandalf.local.home
      Link: http://lore.kernel.org/lkml/20191017210636.061448713@goodmis.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a5e05abc
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Initialize evsel_trace->fmt for syscalls:sys_enter_* tracepoints · 362222f8
      Arnaldo Carvalho de Melo authored
      From the syscall_fmts->arg entries for formatting strace-like syscalls.
      
      This is when resolving the string "whence" on a filter expression for
      the syscalls:sys_enter_lseek:
      
        Breakpoint 3, perf_evsel__syscall_arg_fmt (evsel=0xc91ed0, arg=0x7fffffff7cd0 "whence") at builtin-trace.c:3626
        3626	{
        (gdb) n
        3628		struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
        (gdb) n
        3630		if (evsel->tp_format == NULL || fmt == NULL)
        (gdb) n
        3633		for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
        (gdb) n
        3634			if (strcmp(field->name, arg) == 0)
        (gdb) p field->name
        $3 = 0xc945e0 "__syscall_nr"
        (gdb) n
        3633		for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
        (gdb) p *fmt
        $4 = {scnprintf = 0x0, strtoul = 0x0, mask_val = 0x0, parm = 0x0, name = 0x0, nr_entries = 0, show_zero = false}
        (gdb) n
        3634			if (strcmp(field->name, arg) == 0)
        (gdb) p field->name
        $5 = 0xc94690 "fd"
        (gdb) n
        3633		for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
        (gdb) n
        3634			if (strcmp(field->name, arg) == 0)
        (gdb) n
        3633		for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
        (gdb) n
        3634			if (strcmp(field->name, arg) == 0)
        (gdb) p *fmt
        $9 = {scnprintf = 0x489be2 <syscall_arg__scnprintf_strarray>, strtoul = 0x0, mask_val = 0x0, parm = 0xa2da80 <strarray.whences>, name = 0x0,
          nr_entries = 0, show_zero = false}
        (gdb) p field->name
        $10 = 0xc947b0 "whence"
        (gdb) p fmt->parm
        $11 = (void *) 0xa2da80 <strarray.whences>
        (gdb) p *(struct strarray *)fmt->parm
        $12 = {offset = 0, nr_entries = 5, prefix = 0x724d37 "SEEK_", entries = 0xa2da40 <whences>}
        (gdb) p (struct strarray *)fmt->parm)->entries
        Junk after end of expression.
        (gdb) p ((struct strarray *)fmt->parm)->entries
        $13 = (const char **) 0xa2da40 <whences>
        (gdb) p ((struct strarray *)fmt->parm)->entries[0]
        $14 = 0x724d21 "SET"
        (gdb) p ((struct strarray *)fmt->parm)->entries[1]
        $15 = 0x724d25 "CUR"
        (gdb) p ((struct strarray *)fmt->parm)->entries[2]
        $16 = 0x724d29 "END"
        (gdb) p ((struct strarray *)fmt->parm)->entries[2]
        $17 = 0x724d29 "END"
        (gdb) p ((struct strarray *)fmt->parm)->entries[3]
        $18 = 0x724d2d "DATA"
        (gdb) p ((struct strarray *)fmt->parm)->entries[4]
        $19 = 0x724d32 "HOLE"
        (gdb)
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-lc8h9jgvbnboe0g7ic8tra1y@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      362222f8
  3. 17 Oct, 2019 4 commits
  4. 15 Oct, 2019 14 commits
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Hook the 'vec' tracepoint argument with the x86 IRQ vectors scnprintf/strtoul · df604bfd
      Arnaldo Carvalho de Melo authored
      Ended up only being useful when filtering multiple irq_vectors
      tracepoints, as we end up having a tracepoint for each of the entries,
      i.e.:
      
      This will always come with the "RESCHEDULE_VECTOR" in the 'vector' arg:
      
        # perf trace --max-events 8 -e irq_vectors:reschedule*
           0.000 cc1/29067 irq_vectors:reschedule_entry(vector: RESCHEDULE)
           0.004 cc1/29067 irq_vectors:reschedule_exit(vector: RESCHEDULE)
           0.553 cc1/29067 irq_vectors:reschedule_entry(vector: RESCHEDULE)
           0.556 cc1/29067 irq_vectors:reschedule_exit(vector: RESCHEDULE)
           1.182 cc1/29067 irq_vectors:reschedule_entry(vector: RESCHEDULE)
           1.185 cc1/29067 irq_vectors:reschedule_exit(vector: RESCHEDULE)
           1.203 :29052/29052 irq_vectors:reschedule_entry(vector: RESCHEDULE)
           1.206 :29052/29052 irq_vectors:reschedule_exit(vector: RESCHEDULE)
        #
      
      While filtering that value will produce nothing:
      
        # perf trace --max-events 8 -e irq_vectors:reschedule* --filter="vector != RESCHEDULE"
        ^C#
      
      Maybe it'll be useful for those other tracepoints:
      
        # perf list irq_vectors:vector_*
      
        List of pre-defined events (to be used in -e):
      
          irq_vectors:vector_activate                        [Tracepoint event]
          irq_vectors:vector_alloc                           [Tracepoint event]
          irq_vectors:vector_alloc_managed                   [Tracepoint event]
          irq_vectors:vector_clear                           [Tracepoint event]
          irq_vectors:vector_config                          [Tracepoint event]
          irq_vectors:vector_deactivate                      [Tracepoint event]
          irq_vectors:vector_free_moved                      [Tracepoint event]
          irq_vectors:vector_reserve                         [Tracepoint event]
          irq_vectors:vector_reserve_managed                 [Tracepoint event]
          irq_vectors:vector_setup                           [Tracepoint event]
          irq_vectors:vector_teardown                        [Tracepoint event]
          irq_vectors:vector_update                          [Tracepoint event]
        #
      
      But since we have it done, keep it.
      
      This at least served to teach me that all those irq vectors have a entry
      and an exit tracepoint that I can then use just like with
      raw_syscalls:sys_{enter,exit}, i.e. pair them, use just a
      trace__irq_vectors_entry() + trace__irq_vectors_exit() and use the
      'vector' arg as I use the 'syscall id' one for syscalls.
      
      Then the default for 'perf trace' will include irq_vectors in addition
      to syscalls.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-wer4cwbbqub3o7sa8h1j3uzb@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      df604bfd
    • Arnaldo Carvalho de Melo's avatar
      perf trace beauty: Add the glue for the autogenerated x86 IRQ vector array · 573ed898
      Arnaldo Carvalho de Melo authored
      We need to wrap this autogenerated string array with the
      strarray__scnprintf() formatter and the strarray__strotul() lookup
      method, do it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-bx2cjcyv6aerhyy3gvu3uwcy@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      573ed898
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Add a strarray__scnprintf_suffix() method · 97c2a780
      Arnaldo Carvalho de Melo authored
      In some cases, like with x86 IRQ vectors, the common part in names is at
      the end, so a suffix, add a scnprintf function for that.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-agxbj6es2ke3rehwt4gkdw23@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      97c2a780
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Hook up the x86 irq_vectors table generator · f19a85c6
      Arnaldo Carvalho de Melo authored
      I.e. after running:
      
        $ make -C tools/perf O=/tmp/build/perf
      
      We end up with:
      
        $ cat /tmp/build/perf/trace/beauty/generated/x86_arch_irq_vectors_array.c
        static const char *x86_irq_vectors[] = {
        	[0x02] = "NMI",
        	[0x12] = "MCE",
        	[0x20] = "IRQ_MOVE_CLEANUP",
        	[0x80] = "IA32_SYSCALL",
        	[0xec] = "LOCAL_TIMER",
        	[0xed] = "HYPERV_STIMER0",
        	[0xee] = "HYPERV_REENLIGHTENMENT",
        	[0xef] = "MANAGED_IRQ_SHUTDOWN",
        	[0xf0] = "POSTED_INTR_NESTED",
        	[0xf1] = "POSTED_INTR_WAKEUP",
        	[0xf2] = "POSTED_INTR",
        	[0xf3] = "HYPERVISOR_CALLBACK",
        	[0xf4] = "DEFERRED_ERROR",
        	[0xf6] = "IRQ_WORK",
        	[0xf7] = "X86_PLATFORM_IPI",
        	[0xf8] = "REBOOT",
        	[0xf9] = "THRESHOLD_APIC",
        	[0xfa] = "THERMAL_APIC",
        	[0xfb] = "CALL_FUNCTION_SINGLE",
        	[0xfc] = "CALL_FUNCTION",
        	[0xfd] = "RESCHEDULE",
        	[0xfe] = "ERROR_APIC",
        	[0xff] = "SPURIOUS_APIC",
        };
        $
      
      Now its just a matter of using it, associating it to tracepoint arguments named
      'vector', all of which can be correctly used with this table, for int args.
      
      At some point we should move tools/perf/trace/beauty to tools/beauty/,
      so that it can be used more generally and even made available externally
      like libbpf, libperf, libtraceevent, etc.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-0p2df4kq1afrxbck4e4ct34r@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f19a85c6
    • Arnaldo Carvalho de Melo's avatar
      libbeauty: Add a generator for x86's IRQ vectors -> strings · 5fa022ae
      Arnaldo Carvalho de Melo authored
      We'll wire this up with the 'vector' arg in irq_vectors:*, etc:
      
      Just run it straight away and check what it produces:
      
        $ tools/perf/trace/beauty/tracepoints/x86_irq_vectors.sh
        static const char *x86_irq_vectors[] = {
        	[0x02] = "NMI",
        	[0x12] = "MCE",
        	[0x20] = "IRQ_MOVE_CLEANUP",
        	[0x80] = "IA32_SYSCALL",
        	[0xec] = "LOCAL_TIMER",
        	[0xed] = "HYPERV_STIMER0",
        	[0xee] = "HYPERV_REENLIGHTENMENT",
        	[0xef] = "MANAGED_IRQ_SHUTDOWN",
        	[0xf0] = "POSTED_INTR_NESTED",
        	[0xf1] = "POSTED_INTR_WAKEUP",
        	[0xf2] = "POSTED_INTR",
        	[0xf3] = "HYPERVISOR_CALLBACK",
        	[0xf4] = "DEFERRED_ERROR",
        	[0xf6] = "IRQ_WORK",
        	[0xf7] = "X86_PLATFORM_IPI",
        	[0xf8] = "REBOOT",
        	[0xf9] = "THRESHOLD_APIC",
        	[0xfa] = "THERMAL_APIC",
        	[0xfb] = "CALL_FUNCTION_SINGLE",
        	[0xfc] = "CALL_FUNCTION",
        	[0xfd] = "RESCHEDULE",
        	[0xfe] = "ERROR_APIC",
        	[0xff] = "SPURIOUS_APIC",
        };
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-cpl1pa7kkwn0llufi5qw4li8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5fa022ae
    • Arnaldo Carvalho de Melo's avatar
      tools arch x86: Grab a copy of the file containing the IRQ vector defines · d2b72b72
      Arnaldo Carvalho de Melo authored
      We'll use it to generate a table and then convert the irq_vectors:*
      tracepoint 'vector' arg in things like perf trace, script, etc.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-z7gi058lzhnrm32slevg3xod@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d2b72b72
    • John Garry's avatar
      perf vendor events arm64: Add some missing events for Hisi hip08 HHA PMU · 2b784715
      John Garry authored
      Add some more missing events.
      
      A trivial typo is also fixed.
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarShaokun Zhang <zhangshaokun@hisilicon.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Will Deacon <will@kernel.org>
      Cc: linuxarm@huawei.com
      Link: http://lore.kernel.org/lkml/1567612484-195727-5-git-send-email-john.garry@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2b784715
    • John Garry's avatar
      perf vendor events arm64: Add some missing events for Hisi hip08 L3C PMU · e3ae5695
      John Garry authored
      Add some more missing events.
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarShaokun Zhang <zhangshaokun@hisilicon.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Will Deacon <will@kernel.org>
      Cc: linuxarm@huawei.com
      Link: http://lore.kernel.org/lkml/1567612484-195727-4-git-send-email-john.garry@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e3ae5695
    • John Garry's avatar
      perf vendor events arm64: Add some missing events for Hisi hip08 DDRC PMU · 1410732a
      John Garry authored
      Add some more missing events.
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarShaokun Zhang <zhangshaokun@hisilicon.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Will Deacon <will@kernel.org>
      Cc: linuxarm@huawei.com
      Link: http://lore.kernel.org/lkml/1567612484-195727-3-git-send-email-john.garry@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1410732a
    • John Garry's avatar
      perf vendor events arm64: Fix Hisi hip08 DDRC PMU eventname · 84b0975f
      John Garry authored
      The "EventName" for the DDRC precharge command event is incorrect, so
      fix it.
      
      Fixes: 57cc7324 ("perf jevents: Add support for Hisi hip08 DDRC PMU aliasing")
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarShaokun Zhang <zhangshaokun@hisilicon.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Will Deacon <will@kernel.org>
      Cc: linuxarm@huawei.com
      Link: http://lore.kernel.org/lkml/1567612484-195727-2-git-send-email-john.garry@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      84b0975f
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Support tracepoint dynamic char arrays · c5e006cd
      Arnaldo Carvalho de Melo authored
      Things like:
      
        # grep __data_loc /sys/kernel/debug/tracing/events/sched/sched_process_exec/format
      	field:__data_loc char[] filename;	offset:8;	size:4;	signed:1;
        #
      
      That, at that offset (8) and with that size(8) have an integer that
      contains the real length and offset for the contents of that array.
      
      Now this works:
      
        # perf trace --max-events 1 -e sched:*exec -a
           0.000 sed/19441 sched:sched_process_exec(filename: "/usr/bin/sync", pid: 19441 (sync), old_pid: 19441 (sync))
        #
      
      As when using the libtraceevent based beautifier:
      
        # perf trace --libtraceevent --max-events 1 -e sched:*exec -a
           0.000 sync/19463 sched:sched_process_exec(filename=/usr/bin/sync pid=19463 old_pid=19463)
        #
      
      I.e. that 'filename' is implemented as a dynamic char array.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-950p0m842fe6n7sxsdwqj5i2@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c5e006cd
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Filter own pid to avoid a feedback look in 'perf trace record -a' · 7fbfe22c
      Arnaldo Carvalho de Melo authored
      When doing a system wide 'perf trace record' we need, just like in 'perf
      trace' live mode, to filter out perf trace's own pid, so set up a
      tracepoint filter for the raw_syscalls tracepoints right after adding
      them to the argv array that is set up to then call cmd_record().
      Reported-by: default avatarAndi Kleen <ak@linux.intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-uysx5w8f2y5ndoln5cq370tv@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7fbfe22c
    • Arnaldo Carvalho de Melo's avatar
      perf string: Export asprintf__tp_filter_pids() · da949f50
      Arnaldo Carvalho de Melo authored
      Will be used directly in 'perf trace' for setting up the command line
      argv array to pass to cmd_record, as this was how 'perf trace record'
      was implemented, following the model used in 'perf kvm record', 'perf
      sched record', etc.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-w3cuwjs63lxf5zpryy3145uv@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      da949f50
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Introduce --errno-summary · b88b14db
      Arnaldo Carvalho de Melo authored
      To be used with -S or -s, using just this new option implies -s,
      examples:
      
        # perf trace --errno-summary sleep 1
      
         Summary of events:
      
         sleep (10793), 80 events, 93.0%
      
           syscall            calls  errors  total       min       avg       max       stddev
                                             (msec)    (msec)    (msec)    (msec)        (%)
           --------------- --------  ------ -------- --------- --------- ---------     ------
           nanosleep              1      0  1000.427  1000.427  1000.427  1000.427      0.00%
           mmap                   8      0     0.026     0.002     0.003     0.005      9.18%
           close                  5      0     0.018     0.001     0.004     0.009     48.97%
           mprotect               4      0     0.017     0.003     0.004     0.006     16.49%
           openat                 3      0     0.012     0.003     0.004     0.005      9.41%
           munmap                 1      0     0.010     0.010     0.010     0.010      0.00%
           brk                    4      0     0.005     0.001     0.001     0.002     22.77%
           read                   4      0     0.005     0.001     0.001     0.002     22.33%
           access                 1      1     0.004     0.004     0.004     0.004      0.00%
        				ENOENT: 1
           fstat                  3      0     0.004     0.001     0.001     0.002     17.18%
           lseek                  3      0     0.003     0.001     0.001     0.001     11.62%
           arch_prctl             2      1     0.002     0.001     0.001     0.001      3.32%
        				EINVAL: 1
           execve                 1      0     0.000     0.000     0.000     0.000      0.00%
      
        #
      
      Works as well together with --failure and -S, i.e. collect the stats and
      show just the syscalls that failed:
      
        # perf trace --failure -S --errno-summary sleep 1
             0.032 arch_prctl(option: 0x3001, arg2: 0x7fffdb11b580) = -1 EINVAL (Invalid argument)
             0.045 access(filename: "/etc/ld.so.preload", mode: R) = -1 ENOENT (No such file or directory)
      
         Summary of events:
      
         sleep (10806), 80 events, 93.0%
      
           syscall            calls  errors  total       min       avg       max       stddev
                                             (msec)    (msec)    (msec)    (msec)        (%)
           --------------- --------  ------ -------- --------- --------- ---------     ------
           nanosleep              1      0  1000.094  1000.094  1000.094  1000.094      0.00%
           mmap                   8      0     0.026     0.002     0.003     0.005      9.06%
           close                  5      0     0.018     0.001     0.004     0.010     49.58%
           mprotect               4      0     0.017     0.003     0.004     0.006     17.56%
           openat                 3      0     0.014     0.004     0.005     0.006     12.29%
           munmap                 1      0     0.010     0.010     0.010     0.010      0.00%
           brk                    4      0     0.005     0.001     0.001     0.002     22.75%
           read                   4      0     0.005     0.001     0.001     0.002     17.19%
           access                 1      1     0.005     0.005     0.005     0.005      0.00%
        				ENOENT: 1
           fstat                  3      0     0.004     0.001     0.001     0.002     21.66%
           lseek                  3      0     0.003     0.001     0.001     0.001     11.71%
           arch_prctl             2      1     0.002     0.001     0.001     0.001      2.66%
        				EINVAL: 1
           execve                 1      0     0.000     0.000     0.000     0.000      0.00%
      
        #
      Suggested-by: default avatarAndi Kleen <ak@linux.intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-l0mjwczkpouov7lss5zn8d9h@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b88b14db