1. 18 Dec, 2018 40 commits
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Add generator for fadvise64's 'advice' arg constants · 069c1c6c
      Arnaldo Carvalho de Melo authored
        $ tools/perf/trace/beauty/fadvise.sh
        static const char *fadvise_advices[] = {
      	[0] = "NORMAL",
      	[1] = "RANDOM",
      	[2] = "SEQUENTIAL",
      	[3] = "WILLNEED",
      	[4] = "DONTNEED",
      	[5] = "NOREUSE",
        };
        $
      
      This has a hack wrt the s390 difference.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-tb7jguv01u8p570piq13eioh@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      069c1c6c
    • Arnaldo Carvalho de Melo's avatar
      tools headers uapi: Grab a copy of fadvise.h · f9cdd63e
      Arnaldo Carvalho de Melo authored
      Will be used to generate the string table for fadvise64's 'advice'
      argument.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-muswpnft8q9krktv052yrgsc@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f9cdd63e
    • Arnaldo Carvalho de Melo's avatar
      perf beauty mmap: Print mmap's 'offset' arg in hexadecimal · a6631340
      Arnaldo Carvalho de Melo authored
      Also to make it match 'strace' output, for regression testing.
      
      Both now produce this option, when 'perf trace' uses a .perfconfig
      asking for the strace like output:
      
        mmap(0x7faf66e6a000, 1363968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7faf66e6a000
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-27qhouo1kaac2iyl85nfnsf5@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a6631340
    • Arnaldo Carvalho de Melo's avatar
      perf beauty mmap: Print PROT_READ before PROT_EXEC to match strace output · 1355e09a
      Arnaldo Carvalho de Melo authored
      Helps with comparing 'strace' and 'perf trace' output, for mutual
      regression testing.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-va0qe95xbhep5hy52aq5qe0v@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1355e09a
    • Arnaldo Carvalho de Melo's avatar
      perf trace beauty: Beautify arch_prctl()'s arguments · fb7068e7
      Arnaldo Carvalho de Melo authored
      This actually so far, AFAIK is available only in x86, so the code was
      put in place with x86 prefixes, in arches where it is not available it
      will just not be called, so no further mechanisms are needed at this
      time.
      
      Later, when other arches wire this up, we'll just look at the uname
      (live sessions) or perf_env data in the perf.data header to auto-wire
      the right beautifier.
      
      With this the output is the same as produced by 'strace' when used with
      the following ~/.perfconfig:
      
        # cat ~/.perfconfig
        [llvm]
      	dump-obj = true
        [trace]
      	  add_events = /home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
      	  show_zeros = yes
      	  show_duration = no
      	  no_inherit = yes
      	  show_timestamp = no
      	  show_arg_names = no
      	  args_alignment = -40
      	  show_prefix = yes
        #
      
      And, on fedora 29, since the string tables are generated from the kernel
      sources, we don't know about 0x3001, just like strace:
      
        --- /tmp/strace 2018-12-17 11:22:08.707586721 -0300
        +++ /tmp/trace  2018-12-18 11:11:32.037512729 -0300
        @@ -1,49 +1,49 @@
        -arch_prctl(0x3001 /* ARCH_??? */, 0x7ffc8a92dc80) = -1 EINVAL (Invalid argument)
        +arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe4eb93ae0) = -1 EINVAL (Invalid argument)
        -arch_prctl(ARCH_SET_FS, 0x7faf6700f540) = 0
        +arch_prctl(ARCH_SET_FS, 0x7fb507364540) = 0
      
      And that seems to be related to the CET/Shadow Stack feature, that
      userland in Fedora 29 (glibc 2.28) are querying the kernel about, that
      0x3001 seems to be ARCH_CET_STATUS, I'll check the situation and test
      with a fedora 29 kernel to see if the other codes are used.
      
      A diff that ignores the different pointers for different runs needs to
      be put in place in the upcoming regression tests comparing 'perf trace's
      output to strace's.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-73a9prs8ktkrt97trtdmdjs8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      fb7068e7
    • Arnaldo Carvalho de Melo's avatar
      perf trace: When showing string prefixes show prefix + ??? for unknown entries · 9614b8d6
      Arnaldo Carvalho de Melo authored
      To match 'strace' output, like in:
      
        arch_prctl(0x3001 /* ARCH_??? */, 0x7ffc8a92dc80) = -1 EINVAL (Invalid argument)
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-kx59j2dk5l1x04ou57mt99ck@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9614b8d6
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Move strarrays to beauty.h for further reuse · 1f2d085e
      Arnaldo Carvalho de Melo authored
      We'll use it in the upcoming arch_prctl() 'code' arg beautifier.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-6e4tj2fjen8qa73gy4u49vav@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1f2d085e
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Wire up the x86_arch prctl code table generator · 40714e8b
      Arnaldo Carvalho de Melo authored
        $ cat /tmp/build/perf/trace/beauty/generated/x86_arch_prctl_code_array.c
        #define x86_arch_prctl_codes_1_offset 0x1001
        static const char *x86_arch_prctl_codes_1[] = {
      	[0x1001 - 0x1001]= "SET_GS",
      	[0x1002 - 0x1001]= "SET_FS",
      	[0x1003 - 0x1001]= "GET_FS",
      	[0x1004 - 0x1001]= "GET_GS",
      	[0x1011 - 0x1001]= "GET_CPUID",
      	[0x1012 - 0x1001]= "SET_CPUID",
        };
      
        #define x86_arch_prctl_codes_2_offset 0x2001
        static const char *x86_arch_prctl_codes_2[] = {
      	[0x2001 - 0x2001]= "MAP_VDSO_X32",
      	[0x2002 - 0x2001]= "MAP_VDSO_32",
      	[0x2003 - 0x2001]= "MAP_VDSO_64",
        };
        $
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-3r9blij6n8wdlsyd5dujx86r@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      40714e8b
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Add a string table generator for x86's 'arch_prctl' codes · ff4cb769
      Arnaldo Carvalho de Melo authored
        $ tools/perf/trace/beauty/x86_arch_prctl.sh
        #define x86_arch_prctl_codes_1_offset 0x1001
        static const char *x86_arch_prctl_codes_1[] = {
      	[0x1001 - 0x1001]= "SET_GS",
      	[0x1002 - 0x1001]= "SET_FS",
      	[0x1003 - 0x1001]= "GET_FS",
      	[0x1004 - 0x1001]= "GET_GS",
      	[0x1011 - 0x1001]= "GET_CPUID",
      	[0x1012 - 0x1001]= "SET_CPUID",
        };
      
        #define x86_arch_prctl_codes_2_offset 0x2001
        static const char *x86_arch_prctl_codes_2[] = {
      	[0x2001 - 0x2001]= "MAP_VDSO_X32",
      	[0x2002 - 0x2001]= "MAP_VDSO_32",
      	[0x2003 - 0x2001]= "MAP_VDSO_64",
        };
        $
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-w0fux1psivphhx6rve8kn3vq@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ff4cb769
    • Arnaldo Carvalho de Melo's avatar
      tools include arch: Grab a copy of x86's prctl.h · c22e2683
      Arnaldo Carvalho de Melo authored
      We need it to generate the tables for the 'code' arch_prctl's syscall
      argument.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-vu890pi18fpd4eyz61cazckj@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c22e2683
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Show NULL when syscall pointer args are 0 · ce05539f
      Arnaldo Carvalho de Melo authored
      Matching strace's output format. The 'format' file for the syscall
      tracepoints have an indication if the arg is a pointer, with some
      exceptions like 'mmap' that has its first arg as an 'unsigned long', so
      use a heuristic using the argument name, i.e. if it contains the 'addr'
      substring, format it with the pointer formatter.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-ddghemr8qrm6i0sb8awznbze@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ce05539f
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Enclose the errno strings with () · 2c83dfae
      Arnaldo Carvalho de Melo authored
      To match strace, now both emit the same line for calls like:
      
       access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-krxl6klsqc9qyktoaxyih942@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2c83dfae
    • Arnaldo Carvalho de Melo's avatar
      perf augmented_raw_syscalls: Copy 'access' arg as well · c48ee107
      Arnaldo Carvalho de Melo authored
      This will all come from userspace, but to test the changes to make 'perf
      trace' output similar to strace's, do this one more now manually.
      
      To update the precompiled augmented_raw_syscalls.o binary I just run:
      
        # perf record -e ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.c sleep 1
        LLVM: dumping /home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.022 MB perf.data ]
        #
      
      Because to have augmented_raw_syscalls to be always used and a fast
      startup and remove the need to have the llvm toolchain installed, I'm
      using:
      
        # perf config | grep add_events
        trace.add_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        #
      
      So when doing changes to augmented_raw_syscals.c one needs to rebuild
      the .o file.
      
      This will be done automagically later, i.e. have a 'make' behaviour of
      recompiling when the .c gets changed.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-lw3i2atyq8549fpqwmszn3qp@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c48ee107
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Add alignment spaces after the closing parens · 4b8a240e
      Arnaldo Carvalho de Melo authored
      To use strace's style, helping in comparing the output of 'perf trace'
      with the one from 'strace', to help in upcoming regression tests.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-mw6peotz4n84rga0fk78buff@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4b8a240e
    • Arnaldo Carvalho de Melo's avatar
      perf trace beauty: Print O_RDONLY when (flags & O_ACCMODE) == 0 · 601d66d4
      Arnaldo Carvalho de Melo authored
      And there are more flags, to match strace's output.
      
       openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
      
      Also to help with regression tests.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-ofovpmvdli3bwch30936xn7t@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      601d66d4
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow asking for not suppressing common string prefixes · c65c83ff
      Arnaldo Carvalho de Melo authored
      So far we've been suppressing common stuff such as "MAP_" in the mmap
      flags, showing "SHARED" instead of "MAP_SHARED", allow for those
      prefixes (and a few suffixes) to be shown:
      
        # trace -e *map,open*,*seek sleep 1
        openat("/etc/ld.so.cache", CLOEXEC) = 3
        mmap(0, 109093, READ, PRIVATE, 3, 0) = 0x7ff61c695000
        openat("/lib64/libc.so.6", CLOEXEC) = 3
        lseek(3, 792, SET) = 792
        mmap(0, 8192, READ|WRITE, PRIVATE|ANONYMOUS) = 0x7ff61c693000
        lseek(3, 792, SET) = 792
        lseek(3, 864, SET) = 864
        mmap(0, 1857568, READ, PRIVATE|DENYWRITE, 3, 0) = 0x7ff61c4cd000
        mmap(0x7ff61c4ef000, 1363968, EXEC|READ, PRIVATE|FIXED|DENYWRITE, 3, 139264) = 0x7ff61c4ef000
        mmap(0x7ff61c63c000, 311296, READ, PRIVATE|FIXED|DENYWRITE, 3, 1503232) = 0x7ff61c63c000
        mmap(0x7ff61c689000, 24576, READ|WRITE, PRIVATE|FIXED|DENYWRITE, 3, 1814528) = 0x7ff61c689000
        mmap(0x7ff61c68f000, 14368, READ|WRITE, PRIVATE|FIXED|ANONYMOUS) = 0x7ff61c68f000
        munmap(0x7ff61c695000, 109093) = 0
        openat("/usr/lib/locale/locale-archive", CLOEXEC) = 3
        mmap(0, 217749968, READ, PRIVATE, 3, 0) = 0x7ff60f523000
        #
        # vim ~/.perfconfig
        #
        # perf config
        llvm.dump-obj=true
        trace.add_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        trace.show_zeros=yes
        trace.show_duration=no
        trace.no_inherit=yes
        trace.show_timestamp=no
        trace.show_arg_names=no
        trace.args_alignment=0
        trace.string_quote="
        trace.show_prefix=yes
        #
        #
        # trace -e *map,open*,*seek sleep 1
        openat(AT_FDCWD, "/etc/ld.so.cache", O_CLOEXEC) = 3
        mmap(0, 109093, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7ebbe59000
        openat(AT_FDCWD, "/lib64/libc.so.6", O_CLOEXEC) = 3
        lseek(3, 792, SEEK_SET) = 792
        mmap(0, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS) = 0x7f7ebbe57000
        lseek(3, 792, SEEK_SET) = 792
        lseek(3, 864, SEEK_SET) = 864
        mmap(0, 1857568, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7ebbc91000
        mmap(0x7f7ebbcb3000, 1363968, PROT_EXEC|PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 139264) = 0x7f7ebbcb3000
        mmap(0x7f7ebbe00000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 1503232) = 0x7f7ebbe00000
        mmap(0x7f7ebbe4d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 1814528) = 0x7f7ebbe4d000
        mmap(0x7f7ebbe53000, 14368, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS) = 0x7f7ebbe53000
        munmap(0x7f7ebbe59000, 109093) = 0
        openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_CLOEXEC) = 3
        mmap(0, 217749968, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7eaece7000
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-mtn1i4rjowjl72trtnbmvjd4@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c65c83ff
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Add a prefix member to the strarray class · 2e3d7fac
      Arnaldo Carvalho de Melo authored
      So that the user, in an upcoming patch, can select printing it to get
      the full string as used in the source code, not one with a common prefix
      chopped off so as to make the output more compact.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-zypczc88gzbmeqx7b372s138@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2e3d7fac
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Enclose strings with double quotes · 721f5326
      Arnaldo Carvalho de Melo authored
      To match 'strace' output, helping with upcoming regression tests
      comparing both outputs.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-jab52t1dcuh6vlztqle9g7u9@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      721f5326
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Make the alignment of the syscall args be configurable · 9ed45d59
      Arnaldo Carvalho de Melo authored
      Since the start 'perf trace' aligns the parens enclosing the list of
      syscall args to align the syscall results, allow this to be
      configurable, keeping the default of 70. Using:
      
        # perf config
        llvm.dump-obj=true
        trace.add_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        trace.show_zeros=yes
        trace.show_duration=no
        trace.no_inherit=yes
        trace.show_timestamp=no
        trace.show_arg_names=no
        trace.args_alignment=0
        # trace -e open*,close,*sleep sleep 1
        openat(CWD, /etc/ld.so.cache, CLOEXEC) = 3
        close(3) = 0
        openat(CWD, /lib64/libc.so.6, CLOEXEC) = 3
        close(3) = 0
        openat(CWD, /usr/lib/locale/locale-archive, CLOEXEC) = 3
        close(3) = 0
        nanosleep(0x7ffc00de66f0, 0) = 0
        close(1) = 0
        close(2) = 0
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-r8cbhoz1lr5npq9tutpvoigr@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9ed45d59
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow suppressing the syscall argument names · 9d6dc178
      Arnaldo Carvalho de Melo authored
      To show just the values:
      
      Default:
      
        # trace -e open*,close,*sleep sleep 1
        openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC           ) = 3
        close(fd: 3                                                           ) = 0
        openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC           ) = 3
        close(fd: 3                                                           ) = 0
        openat(dfd: CWD, filename: /usr/lib/locale/locale-archive, flags: CLOEXEC) = 3
        close(fd: 3                                                           ) = 0
        nanosleep(rqtp: 0x7ffc0c4ea0d0, rmtp: 0                               ) = 0
        close(fd: 1                                                           ) = 0
        close(fd: 2                                                           ) = 0
        #
      
      Remove it:
      
        # perf config trace.show_arg_names=no
        # trace -e open*,close,*sleep sleep 1
        openat(CWD, /etc/ld.so.cache, CLOEXEC                                 ) = 3
        close(3                                                               ) = 0
        openat(CWD, /lib64/libc.so.6, CLOEXEC                                 ) = 3
        close(3                                                               ) = 0
        openat(CWD, /usr/lib/locale/locale-archive, CLOEXEC                   ) = 3
        close(3                                                               ) = 0
        nanosleep(0x7ffced3a8c40, 0                                           ) = 0
        close(1                                                               ) = 0
        close(2                                                               ) = 0
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-ta9tbdwgodpw719sr2bjm8eb@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9d6dc178
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow configuring if the syscall start timestamp should be printed · b036146f
      Arnaldo Carvalho de Melo authored
        # trace -e open*,close,*sleep sleep 1
           0.000 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC           ) = 3
           0.016 close(fd: 3                                                           ) = 0
           0.024 openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC           ) = 3
           0.074 close(fd: 3                                                           ) = 0
           0.235 openat(dfd: CWD, filename: /usr/lib/locale/locale-archive, flags: CLOEXEC) = 3
           0.251 close(fd: 3                                                           ) = 0
           0.285 nanosleep(rqtp: 0x7ffd68e6d620, rmtp: 0                               ) = 0
        1000.386 close(fd: 1                                                           ) = 0
        1000.395 close(fd: 2                                                           ) = 0
        #
      
        # perf config trace.show_timestamp=no
        # trace -e open*,close,*sleep sleep 1
        openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC           ) = 3
        close(fd: 3                                                           ) = 0
        openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC           ) = 3
        close(fd: 3                                                           ) = 0
        openat(dfd: CWD, filename: , flags: CLOEXEC                           ) = 3
        close(fd: 3                                                           ) = 0
        nanosleep(rqtp: 0x7fffa79c38e0, rmtp: 0                               ) = 0
        close(fd: 1                                                           ) = 0
        close(fd: 2                                                           ) = 0
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-mjjnicy48367jah6ls4k0nk8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b036146f
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow configuring default for perf_event_attr.inherit · d32de87e
      Arnaldo Carvalho de Melo authored
      I.f. if children should inherit the parent perf_event configuration,
      i.e. if we should trace children as well or just the parent.
      
      The default is to follow children, to disable this and have a behaviour
      similar to strace, set this config option or use the --no_inherit 'perf
      trace' option.
      
      E.g.:
      
      Default:
      
        # perf config trace.no_inherit
        # trace -e clone,*sleep time sleep 1
           0.000 time/21107 clone(clone_flags: CHILD_CLEARTID|CHILD_SETTID|0x11, newsp: 0, child_tidptr: 0x7f7b8f9ae810) = 21108 (time)
               ? time/21108  ... [continued]: clone()
           0.691 sleep/21108 nanosleep(rqtp: 0x7ffed01d0540, rmtp: 0                               ) = 0
        0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1988maxresident)k
        0inputs+0outputs (0major+76minor)pagefaults 0swaps
        #
      
      Disable it:
      
        # trace -e clone,*sleep time sleep 1
           0.000 clone(clone_flags: CHILD_CLEARTID|CHILD_SETTID|0x11, newsp: 0, child_tidptr: 0x7ff41e100810) = 21414 (time)
        0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1964maxresident)k
        0inputs+0outputs (0major+76minor)pagefaults 0swaps
        #
      
      Notice that since there is just one thread, the "comm/TID" column is
      suppressed.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-thd8s16pagyza71ufi5vjlan@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d32de87e
    • Arnaldo Carvalho de Melo's avatar
      perf config: Show the configuration when no arguments are provided · 41e0d040
      Arnaldo Carvalho de Melo authored
      More convenient thah having to recall what letter is about
      showing/listing/dumping the configuration, i.e. no arguments means
      -l/--list:
      
        # perf config
        llvm.dump-obj=true
        trace.default_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        trace.show_zeros=yes
        trace.show_duration=no
        # perf config -l
        llvm.dump-obj=true
        trace.default_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        trace.show_zeros=yes
        trace.show_duration=no
        # perf config -h
      
         Usage: perf config [<file-option>] [options] [section.name[=value] ...]
      
            -l, --list            show current config variables
                --system          use system config file
                --user            use user config file
      
        #
      
      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>
      Cc: Taeung Song <treeze.taeung@gmail.com>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-z2n63avz6tliqb5gmu4l1dti@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      41e0d040
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow configuring if the syscall duration should be printed · 42e4a52d
      Arnaldo Carvalho de Melo authored
        # perf config trace.show_duration=no
        # perf config -l | grep trace
        trace.default_events=/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        trace.show_zeros=true
        trace.show_duration=no
        # trace -e *sleep sleep 1
           0.000 sleep/8729 nanosleep(rqtp: 0x7ffcb0b4c940, rmtp: 0) = 0
        # perf config trace.show_duration=yes
        # trace -e *sleep sleep 1
           0.000 (1000.212 ms): sleep/8735 nanosleep(rqtp: 0x7ffca15fa770, rmtp: 0) = 0
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-2c7h1m8fhzb9puxtj9nlevi8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      42e4a52d
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow configuring if zeroed syscall args should be printed · e7c634fc
      Arnaldo Carvalho de Melo authored
      The default so far, since we show argument names followed by its values,
      was to make the output more compact by suppressing most zeroed args.
      
      Make this configurable so that users can choose what best suit their
      needs.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-q0gxws02ygodh94o0hzim5xd@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e7c634fc
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow specifying a set of events to add in perfconfig · ac96287c
      Arnaldo Carvalho de Melo authored
      To add augmented_raw_syscalls to the events speficied by the user, or be
      the only one if no events were specified by the user, one can add this
      to perfconfig:
      
        # cat ~/.perfconfig
        [trace]
      	  add_events = /home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
        #
      
      I.e. pre-compile the augmented_raw_syscalls.c BPF program and make it
      always load, this way:
      
        # perf trace -e open* cat /etc/passwd > /dev/null
           0.000 ( 0.013 ms): cat/31557 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC) = 3
           0.035 ( 0.007 ms): cat/31557 openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC) = 3
           0.353 ( 0.009 ms): cat/31557 openat(dfd: CWD, filename: /usr/lib/locale/locale-archive, flags: CLOEXEC) = 3
           0.424 ( 0.006 ms): cat/31557 openat(dfd: CWD, filename: /etc/passwd) = 3
        #
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-0lgj7vh64hg3ce44gsmvj7ud@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ac96287c
    • Arnaldo Carvalho de Melo's avatar
      perf augmented_raw_syscalls: Do not include stdio.h · 4623ce40
      Arnaldo Carvalho de Melo authored
      We're not using that puts() thing, and thus we don't need to define the
      __bpf_stdout__ map, reducing the setup time.
      
      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>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-3452xgatncpil7v22minkwbo@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4623ce40
    • Leo Yan's avatar
      perf cs-etm: Generate branch sample for exception packet · 7100b12c
      Leo Yan authored
      The exception packet appears as one element with 'elem_type' ==
      OCSD_GEN_TRC_ELEM_EXCEPTION or OCSD_GEN_TRC_ELEM_EXCEPTION_RET, which is
      present for exception entry and exit respectively.  The decoder sets the
      packet fields 'packet->exc' and 'packet->exc_ret' to indicate the
      exception packets; but exception packets don't have a dedicated sample
      type and shares the same sample type CS_ETM_RANGE with normal
      instruction packets.
      
      As a result, the exception packets are taken as normal instruction
      packets and this introduces confusion in mixing different packet types.
      Furthermore, these instruction range packets will be processed for
      branch samples only when 'packet->last_instr_taken_branch' is true,
      otherwise they will be omitted, this can introduce a mess for exception
      and exception returning due to not having the complete address range
      info for context switching.
      
      To process exception packets properly, this patch introduces two new
      sample types: CS_ETM_EXCEPTION and CS_ETM_EXCEPTION_RET; these two types
      of packets will be handled by cs_etm__exception().  The function
      cs_etm__exception() forces setting the previous CS_ETM_RANGE packet flag
      'prev_packet->last_instr_taken_branch' to true, this matches well with
      the program flow when the exception is trapped from user space to kernel
      space, no matter if the most recent flow has branch taken or not; this
      is also safe for returning to user space after exception handling.
      
      After exception packets have their own sample type, the packet fields
      'packet->exc' and 'packet->exc_ret' aren't needed anymore, so remove
      them.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight ml <coresight@lists.linaro.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-9-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7100b12c
    • Leo Yan's avatar
      perf cs-etm: Treat EO_TRACE element as trace discontinuity · 02e7e250
      Leo Yan authored
      If the decoder outputs an EO_TRACE element, it means the end of the
      trace buffer; this is a discontinuity and in this case the end of trace
      data needs to be saved.
      
      This patch generates a CS_ETM_DISCONTINUITY packet for the EO_TRACE
      element hereby flushing the end of trace data in cs-etm.c.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-8-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      02e7e250
    • Leo Yan's avatar
      perf cs-etm: Treat NO_SYNC element as trace discontinuity · 37bb3716
      Leo Yan authored
      The CoreSight tracer driver might insert barrier packets between
      different buffers, thus the decoder can spot the boundaries based on the
      barrier packet; it is possible for the decoder to hit a barrier packet
      and emit a NO_SYNC element, then the decoder will find a periodic
      synchronisation point inside that next trace block that starts the trace
      again but does not have the TRACE_ON element as indicator - usually
      because this trace block has wrapped the buffer so we have lost the
      original point when the trace was enabled.
      
      In the first case it causes the insertion of a OCSD_GEN_TRC_ELEM_NO_SYNC
      in the middle of the tracing stream, but as we were not handling the
      NO_SYNC element properly this ends up making users miss the
      discontinuity indications.
      
      Though OCSD_GEN_TRC_ELEM_NO_SYNC is different from CS_ETM_TRACE_ON when
      output from the decoder, both indicate that the trace data is
      discontinuous; this patch treats OCSD_GEN_TRC_ELEM_NO_SYNC as a trace
      discontinuity and generates a CS_ETM_DISCONTINUITY packet for it, so
      cs-etm can handle the discontinuity for this case, finally it saves the
      last trace data for the previous trace block and restart samples for the
      new block.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight ml <coresight@lists.linaro.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-7-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      37bb3716
    • Leo Yan's avatar
      perf cs-etm: Rename CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY · 49ccf87b
      Leo Yan authored
      TRACE_ON element is used at the beginning of trace, it also can be
      appeared in the middle of trace data to indicate discontinuity; for
      example, it's possible to see multiple TRACE_ON elements in the trace
      stream if the trace is being limited by address range filtering.
      
      Furthermore, except TRACE_ON element is for discontinuity, NO_SYNC and
      EO_TRACE also can be used to indicate discontinuity, though they are
      used for different scenarios for which the trace is interrupted.
      
      This patch renames sample type CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY,
      firstly the new name describes more closely the purpose of the packet;
      secondly this is a preparation for other output elements which also
      cause the trace discontinuity thus they can share the same one packet
      type.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-6-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      49ccf87b
    • Leo Yan's avatar
      perf cs-etm: Refactor enumeration cs_etm_sample_type · cfc1d427
      Leo Yan authored
      The values in enumeration cs_etm_sample_type are defined with setting
      bit N for each packet type, this is not suggested in the usual case.
      
      This patch refactor cs_etm_sample_type by converting from bit shifting
      values to continuous numbers.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-5-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cfc1d427
    • Leo Yan's avatar
      perf cs-etm: Remove unused 'trace_on' in cs_etm_decoder · cee7a6a2
      Leo Yan authored
      cs_etm_decoder::trace_on is being assigned when TRACE_ON or NO_SYNC
      element is coming, but it is never used hence it is redundant and can
      be removed.
      
      So let's remove 'trace_on' field from cs_etm_decoder struct.
      Suggested-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-4-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cee7a6a2
    • Leo Yan's avatar
      perf cs-etm: Avoid stale branch samples when flush packet · 24fff5eb
      Leo Yan authored
      At the end of trace buffer handling, function cs_etm__flush() is invoked
      to flush any remaining branch stack entries.  As a side effect, it also
      generates branch sample, because the 'etmq->packet' doesn't contains any
      new coming packet but point to one stale packet after packets swapping,
      so it wrongly makes synthesize branch samples with stale packet info.
      
      We could review below detailed flow which causes issue:
      
        Packet1: start_addr=0xffff000008b1fbf0 end_addr=0xffff000008b1fbfc
        Packet2: start_addr=0xffff000008b1fb5c end_addr=0xffff000008b1fb6c
      
        step 1: cs_etm__sample():
      	sample: ip=(0xffff000008b1fbfc-4) addr=0xffff000008b1fb5c
      
        step 2: flush packet in cs_etm__run_decoder():
      	cs_etm__run_decoder()
      	  `-> err = cs_etm__flush(etmq, false);
      	sample: ip=(0xffff000008b1fb6c-4) addr=0xffff000008b1fbf0
      
      Packet1 and packet2 are two continuous packets, when packet2 is the new
      coming packet, cs_etm__sample() generates branch sample for these two
      packets and use [packet1::end_addr - 4 => packet2::start_addr] as branch
      jump flow, thus we can see the first generated branch sample in step 1.
      At the end of cs_etm__sample() it swaps packets so 'etm->prev_packet'=
      packet2 and 'etm->packet'=packet1, so far it's okay for branch sample.
      
      If packet2 is the last one packet in trace buffer, even there have no
      any new coming packet, cs_etm__run_decoder() invokes cs_etm__flush() to
      flush branch stack entries as expected, but it also generates branch
      samples by taking 'etm->packet' as a new coming packet, thus the branch
      jump flow is as [packet2::end_addr - 4 =>  packet1::start_addr]; this
      is the second sample which is generated in step 2.  So actually the
      second sample is a stale sample and we should not generate it.
      
      This patch introduces a new function cs_etm__end_block(), at the end of
      trace block this function is invoked to only flush branch stack entries
      and thus can avoid to generate branch sample for stale packet.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-3-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      24fff5eb
    • Leo Yan's avatar
      perf cs-etm: Correct packets swapping in cs_etm__flush() · 43fd5666
      Leo Yan authored
      The structure cs_etm_queue uses 'prev_packet' to point to previous
      packet, this can be used to combine with new coming packet to generate
      samples.
      
      In function cs_etm__flush() it swaps packets only when the flag
      'etm->synth_opts.last_branch' is true, this means that it will not swap
      packets if without option '--itrace=il' to generate last branch entries;
      thus for this case the 'prev_packet' doesn't point to the correct
      previous packet and the stale packet still will be used to generate
      sequential sample.  Thus if dump trace with 'perf script' command we can
      see the incorrect flow with the stale packet's address info.
      
      This patch corrects packets swapping in cs_etm__flush(); except using
      the flag 'etm->synth_opts.last_branch' it also checks the another flag
      'etm->sample_branches', if any flag is true then it swaps packets so can
      save correct content to 'prev_packet'.  Finally this can fix the wrong
      program flow dumping issue.
      
      The patch has a minor refactoring to use 'etm->synth_opts.last_branch'
      instead of 'etmq->etm->synth_opts.last_branch' for condition checking,
      this is consistent with that is done in cs_etm__sample().
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-2-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      43fd5666
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Switch to using a struct for the aumented_raw_syscalls syscalls map values · bbab50dd
      Arnaldo Carvalho de Melo authored
      We'll start adding more perf-syscall stuff, so lets do this prep step so
      that the next ones are just about adding more fields.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-vac4sn1ns1vj4y07lzj7y4b8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bbab50dd
    • Arnaldo Carvalho de Melo's avatar
      perf augmented_syscalls: Switch to using a struct for the syscalls map values · 27f2992e
      Arnaldo Carvalho de Melo authored
      We'll start adding more perf-syscall stuff, so lets do this prep step so
      that the next ones are just about adding more fields.
      
      Run it with the .c file once to cache the .o file:
      
        # trace --filter-pids 2834,2199 -e openat,augmented_raw_syscalls.c
        LLVM: dumping augmented_raw_syscalls.o
             0.000 ( 0.021 ms): tmux: server/4952 openat(dfd: CWD, filename: /proc/5691/cmdline                         ) = 11
           349.807 ( 0.040 ms): DNS Res~er #39/11082 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 44
          4988.759 ( 0.052 ms): gsd-color/2431 openat(dfd: CWD, filename: /etc/localtime                             ) = 18
          4988.976 ( 0.029 ms): gsd-color/2431 openat(dfd: CWD, filename: /etc/localtime                             ) = 18
        ^C[root@quaco bpf]#
      
      From now on, we can use just the newly built .o file, skipping the
      compilation step for a faster startup:
      
        # trace --filter-pids 2834,2199 -e openat,augmented_raw_syscalls.o
             0.000 ( 0.046 ms): DNS Res~er #39/11088 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 44
          1946.408 ( 0.190 ms): systemd/1 openat(dfd: CWD, filename: /proc/1071/cgroup, flags: CLOEXEC          ) = 20
          1946.792 ( 0.215 ms): systemd/1 openat(dfd: CWD, filename: /proc/954/cgroup, flags: CLOEXEC           ) = 20
        ^C#
      
      Now on to do the same in the builtin-trace.c side of things.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-k8mwu04l8es29rje5loq9vg7@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      27f2992e
    • Arnaldo Carvalho de Melo's avatar
      perf bpf: Move perf_event_output() from stdio.h to bpf.h · 61d00713
      Arnaldo Carvalho de Melo authored
      So that we don't always carry that __bpf_output__ map, leaving that to
      the scripts wanting to use that facility.
      
      'perf trace' will be changed to look if that map is present and only
      setup the bpf-output events if so.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-azwys8irxqx9053vpajr0k5h@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      61d00713
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Implement syscall filtering in augmented_syscalls · b27b38ed
      Arnaldo Carvalho de Melo authored
      Just another map, this time an BPF_MAP_TYPE_ARRAY, stating with
      one bool per syscall, stating if it should be filtered or not.
      
      So, with a pre-built augmented_raw_syscalls.o file, we use:
      
        # perf trace -e open*,augmented_raw_syscalls.o
           0.000 ( 0.016 ms): DNS Res~er #37/29652 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 138
         187.039 ( 0.048 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /etc/fstab, flags: CLOEXEC                 ) = 11
         187.348 ( 0.041 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         188.793 ( 0.036 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         189.803 ( 0.029 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         190.774 ( 0.027 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         284.620 ( 0.149 ms): DataStorage/3076 openat(dfd: CWD, filename: /home/acme/.mozilla/firefox/ina67tev.default/SiteSecurityServiceState.txt, flags: CREAT|TRUNC|WRONLY, mode: IRUGO|IWUSR|IWGRP) = 167
        ^C#
      
      What is it that this gsd-housekeeping thingy needs to open
      /proc/self/mountinfo four times periodically? :-)
      
      This map will be extended to tell per-syscall parameters, i.e. how many
      bytes to copy per arg, using the function signature to get the types and
      then the size of those types, via BTF.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-cy222g9ucvnym3raqvxp0hpg@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b27b38ed
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Avoid using raw_syscalls in duplicity with eBPF augmentation · 0df50e0b
      Arnaldo Carvalho de Melo authored
      So when we do something like:
      
         # perf trace -e open*,augmented_raw_syscalls.o
      
      We need to set trace->trace_syscalls because there is logic that use
      that when mixing strace-like output with other events, such as scheduler
      tracepoints, but with that set we ended up having multiple
      raw_syscalls:sys_{enter,exit} setup, which garbled the output, so
      check if trace->augmented_raw_syscalls is set and avoid the two extra
      tracepoints.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-kjmnbrlgu0c38co1ye8egbsb@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0df50e0b