1. 23 Aug, 2023 1 commit
  2. 22 Aug, 2023 1 commit
    • Arnaldo Carvalho de Melo's avatar
      perf lzma: Convert some pr_err() to pr_debug() as callers already use pr_debug() · 7a46404b
      Arnaldo Carvalho de Melo authored
      I noticed some error with:
      
        # perf list ex_ret_brn
        lzma: fopen failed on /usr/lib/modules/5.15.14-100.fc34.x86_64/kernel/net/bluetooth/bnep/bnep.ko.xz: 'No such file or directory'
        lzma: fopen failed on /usr/lib/modules/5.16.16-200.fc35.x86_64/kernel/drivers/gpu/drm/drm_kms_helper.ko.xz: 'No such file or directory'
        lzma: fopen failed on /usr/lib/modules/5.18.16-200.fc36.x86_64/kernel/arch/x86/crypto/crct10dif-pclmul.ko.xz: 'No such file or directory'
        lzma: fopen failed on /usr/lib/modules/5.16.16-200.fc35.x86_64/kernel/drivers/i2c/busses/i2c-piix4.ko.xz: 'No such file or directory'
        <BIG SNIP>
      
      Then using 'perf probe' + 'perf trace' to debug 'perf list', it seems
      its some inconsistency in the ~/.debug/ cache where broken build id
      symlinks that ends up making it try to uncompress some kernel modules
      using the lzma routines:
      
         395.309 perf/3594447 probe_perf:lzma_decompress_to_file(__probe_ip: 6118448, input_string: "/usr/lib/modules/5.18.17-200.fc36.x86_64/kernel/drivers/nvme/host/nvme.ko.xz")
                                             lzma_decompress_to_file (/var/home/acme/bin/perf)
                                             filename__decompress (/var/home/acme/bin/perf)
                                             filename__read_build_id (/var/home/acme/bin/perf)
                                             filename__sprintf_build_id (inlined)
                                             build_id_cache__valid_id (inlined)
                                             build_id_cache__list_all (/var/home/acme/bin/perf)
                                             print_sdt_events (/var/home/acme/bin/perf)
                                             cmd_list (/var/home/acme/bin/perf)
                                             run_builtin (/var/home/acme/bin/perf)
                                             handle_internal_command (inlined)
                                             run_argv (inlined)
                                             main (/var/home/acme/bin/perf)
                                             __libc_start_call_main (/usr/lib64/libc.so.6)
                                             __libc_start_main@@GLIBC_2.34 (/usr/lib64/libc.so.6)
                                             _start (/var/home/acme/bin/perf)
      
      But callers of filename__decompress() already check its return and use
      pr_debug(), so be consistent and make functions it calls also use
      pr_debug().
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lore.kernel.org/lkml/ZOUD0+GkuCVkYF7n@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7a46404b
  3. 21 Aug, 2023 8 commits
  4. 18 Aug, 2023 2 commits
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Use heuristic when deciding if a syscall tracepoint "const char *"... · 64917f4d
      Arnaldo Carvalho de Melo authored
      perf trace: Use heuristic when deciding if a syscall tracepoint "const char *" field is really a string
      
      'perf trace' tries to find BPF progs associated with a syscall that have
      a signature that is similar to syscalls without one to try and reuse,
      so, for instance, the 'open' signature can be reused with many other
      syscalls that have as its first arg a string.
      
      It uses the tracefs events format file for finding a signature that can
      be reused, but then comes the "write" syscall with its second argument
      as a "const char *":
      
        # cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_write/format
        name: sys_enter_write
        ID: 746
        format:
        	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
        	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
        	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
        	field:int common_pid;	offset:4;	size:4;	signed:1;
      
        	field:int __syscall_nr;	offset:8;	size:4;	signed:1;
        	field:unsigned int fd;	offset:16;	size:8;	signed:0;
        	field:const char * buf;	offset:24;	size:8;	signed:0;
        	field:size_t count;	offset:32;	size:8;	signed:0;
      
        print fmt: "fd: 0x%08lx, buf: 0x%08lx, count: 0x%08lx", ((unsigned long)(REC->fd)), ((unsigned long)(REC->buf)), ((unsigned long)(REC->count))
        #
      
      Which isn't a string (the man page for glibc has buf as "void *"), so we
      have to use the name of the argument as an heuristic, to consider a
      string just args that are "const char *" and that have in its name  the
      "path", "file", etc substrings.
      
      With that now it reuses:
      
        [root@quaco ~]# perf trace -v --max-events=1 |& grep Reus
        Reusing "open" BPF sys_enter augmenter for "stat"
        Reusing "open" BPF sys_enter augmenter for "lstat"
        Reusing "open" BPF sys_enter augmenter for "access"
        Reusing "connect" BPF sys_enter augmenter for "accept"
        Reusing "sendto" BPF sys_enter augmenter for "recvfrom"
        Reusing "connect" BPF sys_enter augmenter for "bind"
        Reusing "connect" BPF sys_enter augmenter for "getsockname"
        Reusing "connect" BPF sys_enter augmenter for "getpeername"
        Reusing "open" BPF sys_enter augmenter for "execve"
        Reusing "open" BPF sys_enter augmenter for "truncate"
        Reusing "open" BPF sys_enter augmenter for "chdir"
        Reusing "open" BPF sys_enter augmenter for "mkdir"
        Reusing "open" BPF sys_enter augmenter for "rmdir"
        Reusing "open" BPF sys_enter augmenter for "creat"
        Reusing "open" BPF sys_enter augmenter for "link"
        Reusing "open" BPF sys_enter augmenter for "unlink"
        Reusing "open" BPF sys_enter augmenter for "symlink"
        Reusing "open" BPF sys_enter augmenter for "readlink"
        Reusing "open" BPF sys_enter augmenter for "chmod"
        Reusing "open" BPF sys_enter augmenter for "chown"
        Reusing "open" BPF sys_enter augmenter for "lchown"
        Reusing "open" BPF sys_enter augmenter for "mknod"
        Reusing "open" BPF sys_enter augmenter for "statfs"
        Reusing "open" BPF sys_enter augmenter for "pivot_root"
        Reusing "open" BPF sys_enter augmenter for "chroot"
        Reusing "open" BPF sys_enter augmenter for "acct"
        Reusing "open" BPF sys_enter augmenter for "swapon"
        Reusing "open" BPF sys_enter augmenter for "swapoff"
        Reusing "open" BPF sys_enter augmenter for "delete_module"
        Reusing "open" BPF sys_enter augmenter for "setxattr"
        Reusing "open" BPF sys_enter augmenter for "lsetxattr"
        Reusing "openat" BPF sys_enter augmenter for "fsetxattr"
        Reusing "open" BPF sys_enter augmenter for "getxattr"
        Reusing "open" BPF sys_enter augmenter for "lgetxattr"
        Reusing "openat" BPF sys_enter augmenter for "fgetxattr"
        Reusing "open" BPF sys_enter augmenter for "listxattr"
        Reusing "open" BPF sys_enter augmenter for "llistxattr"
        Reusing "open" BPF sys_enter augmenter for "removexattr"
        Reusing "open" BPF sys_enter augmenter for "lremovexattr"
        Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr"
        Reusing "open" BPF sys_enter augmenter for "mq_open"
        Reusing "open" BPF sys_enter augmenter for "mq_unlink"
        Reusing "fsetxattr" BPF sys_enter augmenter for "add_key"
        Reusing "fremovexattr" BPF sys_enter augmenter for "request_key"
        Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch"
        Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "linkat"
        Reusing "open" BPF sys_enter augmenter for "symlinkat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat"
        Reusing "connect" BPF sys_enter augmenter for "accept4"
        Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at"
        Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2"
        Reusing "open" BPF sys_enter augmenter for "memfd_create"
        Reusing "fremovexattr" BPF sys_enter augmenter for "execveat"
        Reusing "fremovexattr" BPF sys_enter augmenter for "statx"
        [root@quaco ~]#
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alan Maguire <alan.maguire@oracle.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lore.kernel.org/lkml/ZN5lrdeEdSMCn7hk@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      64917f4d
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Use the augmented_raw_syscall BPF skel only for tracing syscalls · 83a0943b
      Arnaldo Carvalho de Melo authored
      It is possible to use 'perf trace' with tracepoints and in that case we
      can't initialize/use the augmented_raw_syscalls BPF skel.
      
      For instance, this usecase:
      
        # perf trace -e sched:*exec --max-events=5
               ? (         ): NetworkManager/1183  ... [continued]: poll())                                             = 1
           0.043 ( 0.007 ms): NetworkManager/1183 epoll_wait(epfd: 17<anon_inode:[eventpoll]>, events: 0x55555f90e920, maxevents: 6) = 0
           0.060 ( 0.007 ms): NetworkManager/1183 write(fd: 3<anon_inode:[eventfd]>, buf: 0x7ffc5a27cd30, count: 8)     = 8
           0.073 ( 0.005 ms): NetworkManager/1183 epoll_wait(epfd: 24<anon_inode:[eventpoll]>, events: 0x7ffc5a27cd20, maxevents: 2) = 1
           0.082 ( 0.010 ms): NetworkManager/1183 recvmmsg(fd: 26<socket:[30298]>, mmsg: 0x7ffc5a27caa0, vlen: 8)       = 1
        #
      
      Where we want to trace just some sched tracepoints ending in 'exec' ends
      up tracing all syscalls.
      
      Fix it by checking existing trace->trace_syscalls boolean to see if we
      need the augmenter.
      
      A followup patch will move those sections of code used only with the
      augmenter to separate functions, to get it cleaner and remove the goto,
      done just for reviewing purposes.
      
      With this patch in place the previous behaviour is restored: no syscalls
      when we have other events and no syscall names:
      
        [root@quaco ~]# perf probe do_filp_open "filename=pathname->name:string"
        Added new event:
          probe:do_filp_open   (on do_filp_open with filename=pathname->name:string)
      
        You can now use it in all perf tools, such as:
      
      	  perf record -e probe:do_filp_open -aR sleep 1
      
        [root@quaco ~]# perf trace --max-events=10 -e probe:do_filp_open sleep 1
           0.000 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/etc/ld.so.cache")
           0.056 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/lib64/libc.so.6")
           0.481 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/locale-archive")
           0.501 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/share/locale/locale.alias")
           0.572 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION")
           0.581 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION")
           0.616 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib64/gconv/gconv-modules.cache")
           0.656 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT")
           0.664 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/en_US.utf8/LC_MEASUREMENT")
           0.696 sleep/455122 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/en_US.UTF-8/LC_TELEPHONE")
        [root@quaco ~]#
      
      As well as mixing syscalls with tracepoints, getting the syscall
      tracepoints used augmented using the BPF skel:
      
        [root@quaco ~]# perf trace --max-events=10 -e open*,probe:do_filp_open sleep 1
           0.000 (         ): sleep/455124 openat(dfd: CWD, filename: "/etc/ld.so.cache", flags: RDONLY|CLOEXEC) ...
           0.005 (         ): sleep/455124 probe:do_filp_open(__probe_ip: -1186560412, filename: "/etc/ld.so.cache")
           0.000 ( 0.011 ms): sleep/455124  ... [continued]: openat())                                           = 3
           0.031 (         ): sleep/455124 openat(dfd: CWD, filename: "/lib64/libc.so.6", flags: RDONLY|CLOEXEC) ...
           0.033 (         ): sleep/455124 probe:do_filp_open(__probe_ip: -1186560412, filename: "/lib64/libc.so.6")
           0.031 ( 0.006 ms): sleep/455124  ... [continued]: openat())                                           = 3
           0.258 (         ): sleep/455124 openat(dfd: CWD, filename: "/usr/lib/locale/locale-archive", flags: RDONLY|CLOEXEC) ...
           0.261 (         ): sleep/455124 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/lib/locale/locale-archive")
           0.258 ( 0.006 ms): sleep/455124  ... [continued]: openat())                                           = -1 ENOENT (No such file or directory)
           0.272 (         ): sleep/455124 openat(dfd: CWD, filename: "/usr/share/locale/locale.alias", flags: RDONLY|CLOEXEC) ...
           0.273  (        ): sleep/455124 probe:do_filp_open(__probe_ip: -1186560412, filename: "/usr/share/locale/locale.alias")
      
      A final note: the probe:do_filp_open uses a kprobe (probably optimized
      as its in the start of a function) that uses the kprobe_tracer mechanism
      in the kernel to collect the pathname->name string and stash it into the
      tracepoint created by 'perf probe' for that:
      
        [root@quaco ~]# cat /sys/kernel/debug/tracing/kprobe_events
        p:probe/do_filp_open _text+4621920 filename=+0(+0(%si)):string
        [root@quaco ~]#
      
      While the syscalls:sys_enter_openat tracepoint gets its string from a
      BPF program attached to raw_syscalls:sys_enter that tail calls into
      another BPF program that knows the types for the openat syscall args and
      thus can bpf_probe_read it right after the normal
      sys_enter/sys_enter_openat tracepoint payload that comes prefixed with
      whatever perf_event_open asked for (CPU, timestamp, etc):
      
        [root@quaco ~]# bpftool prog | grep -E "sys_enter |sys_enter_opena" -A3
        3176: tracepoint  name sys_enter  tag 0bc3fc9d11754ba1  gpl
      	loaded_at 2023-08-17T12:32:20-0300  uid 0
      	xlated 272B  jited 257B  memlock 4096B  map_ids 2462,2466,2463
      	btf_id 2976
        --
        3180: tracepoint  name sys_enter_opena  tag 19dd077f00ec2f58  gpl
      	  loaded_at 2023-08-17T12:32:20-0300  uid 0
      	  xlated 328B  jited 206B  memlock 4096B  map_ids 2466,2465
      	  btf_id 2976
        [root@quaco ~]#
      
      Fixes: 5e6da6be ("perf trace: Migrate BPF augmentation to use a skeleton")
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Andrii Nakryiko <andrii@kernel.org>
      Cc: Anshuman Khandual <anshuman.khandual@arm.com>
      Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Carsten Haitzler <carsten.haitzler@arm.com>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nathan Chancellor <nathan@kernel.org>
      Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
      Cc: Tom Rix <trix@redhat.com>
      Cc: Wang Nan <wangnan0@huawei.com>
      Cc: Wang ShaoBo <bobo.shaobowang@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yonghong Song <yhs@fb.com>
      Cc: YueHaibing <yuehaibing@huawei.com>
      Link: https://lore.kernel.org/lkml/ZN4+s2Wl+zYmXTDj@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      83a0943b
  5. 17 Aug, 2023 7 commits
    • Arnaldo Carvalho de Melo's avatar
      perf lock: Don't pass an ERR_PTR() directly to perf_session__delete() · abaf1e03
      Arnaldo Carvalho de Melo authored
      While debugging a segfault on 'perf lock contention' without an
      available perf.data file I noticed that it was basically calling:
      
      	perf_session__delete(ERR_PTR(-1))
      
      Resulting in:
      
        (gdb) run lock contention
        Starting program: /root/bin/perf lock contention
        [Thread debugging using libthread_db enabled]
        Using host libthread_db library "/lib64/libthread_db.so.1".
        failed to open perf.data: No such file or directory  (try 'perf record' first)
        Initializing perf session failed
      
        Program received signal SIGSEGV, Segmentation fault.
        0x00000000005e7515 in auxtrace__free (session=0xffffffffffffffff) at util/auxtrace.c:2858
        2858		if (!session->auxtrace)
        (gdb) p session
        $1 = (struct perf_session *) 0xffffffffffffffff
        (gdb) bt
        #0  0x00000000005e7515 in auxtrace__free (session=0xffffffffffffffff) at util/auxtrace.c:2858
        #1  0x000000000057bb4d in perf_session__delete (session=0xffffffffffffffff) at util/session.c:300
        #2  0x000000000047c421 in __cmd_contention (argc=0, argv=0x7fffffffe200) at builtin-lock.c:2161
        #3  0x000000000047dc95 in cmd_lock (argc=0, argv=0x7fffffffe200) at builtin-lock.c:2604
        #4  0x0000000000501466 in run_builtin (p=0xe597a8 <commands+552>, argc=2, argv=0x7fffffffe200) at perf.c:322
        #5  0x00000000005016d5 in handle_internal_command (argc=2, argv=0x7fffffffe200) at perf.c:375
        #6  0x0000000000501824 in run_argv (argcp=0x7fffffffe02c, argv=0x7fffffffe020) at perf.c:419
        #7  0x0000000000501b11 in main (argc=2, argv=0x7fffffffe200) at perf.c:535
        (gdb)
      
      So just set it to NULL after using PTR_ERR(session) to decode the error
      as perf_session__delete(NULL) is supported.
      
      Fixes: eef4fee5 ("perf lock: Dynamically allocate lockhash_table")
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mamatha Inamdar <mamatha4@linux.vnet.ibm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Ross Zwisler <zwisler@chromium.org>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/lkml/ZN4R1AYfsD2J8lRs@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      abaf1e03
    • Arnaldo Carvalho de Melo's avatar
      perf top: Don't pass an ERR_PTR() directly to perf_session__delete() · ef23cb59
      Arnaldo Carvalho de Melo authored
      While debugging a segfault on 'perf lock contention' without an
      available perf.data file I noticed that it was basically calling:
      
      	perf_session__delete(ERR_PTR(-1))
      
      Resulting in:
      
        (gdb) run lock contention
        Starting program: /root/bin/perf lock contention
        [Thread debugging using libthread_db enabled]
        Using host libthread_db library "/lib64/libthread_db.so.1".
        failed to open perf.data: No such file or directory  (try 'perf record' first)
        Initializing perf session failed
      
        Program received signal SIGSEGV, Segmentation fault.
        0x00000000005e7515 in auxtrace__free (session=0xffffffffffffffff) at util/auxtrace.c:2858
        2858		if (!session->auxtrace)
        (gdb) p session
        $1 = (struct perf_session *) 0xffffffffffffffff
        (gdb) bt
        #0  0x00000000005e7515 in auxtrace__free (session=0xffffffffffffffff) at util/auxtrace.c:2858
        #1  0x000000000057bb4d in perf_session__delete (session=0xffffffffffffffff) at util/session.c:300
        #2  0x000000000047c421 in __cmd_contention (argc=0, argv=0x7fffffffe200) at builtin-lock.c:2161
        #3  0x000000000047dc95 in cmd_lock (argc=0, argv=0x7fffffffe200) at builtin-lock.c:2604
        #4  0x0000000000501466 in run_builtin (p=0xe597a8 <commands+552>, argc=2, argv=0x7fffffffe200) at perf.c:322
        #5  0x00000000005016d5 in handle_internal_command (argc=2, argv=0x7fffffffe200) at perf.c:375
        #6  0x0000000000501824 in run_argv (argcp=0x7fffffffe02c, argv=0x7fffffffe020) at perf.c:419
        #7  0x0000000000501b11 in main (argc=2, argv=0x7fffffffe200) at perf.c:535
        (gdb)
      
      So just set it to NULL after using PTR_ERR(session) to decode the error
      as perf_session__delete(NULL) is supported.
      
      The same problem was found in 'perf top' after an audit of all
      perf_session__new() failure handling.
      
      Fixes: 6ef81c55 ("perf session: Return error code for perf_session__new() function on failure")
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Jeremie Galarneau <jeremie.galarneau@efficios.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kate Stewart <kstewart@linuxfoundation.org>
      Cc: Mamatha Inamdar <mamatha4@linux.vnet.ibm.com>
      Cc: Mukesh Ojha <mojha@codeaurora.org>
      Cc: Nageswara R Sastry <rnsastry@linux.vnet.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Shawn Landden <shawn@git.icu>
      Cc: Song Liu <songliubraving@fb.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Tzvetomir Stoyanov <tstoyanov@vmware.com>
      Link: https://lore.kernel.org/lkml/ZN4Q2rxxsL08A8rd@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ef23cb59
    • James Clark's avatar
      perf vendor events arm64: Update N2 and V2 metrics and events using Arm telemetry repo · 44739490
      James Clark authored
      Apart from some slight naming and grouping differences, the new metrics
      are functionally the same as the existing ones. Any missing metrics were
      manually appended to the end of the auto generated file.
      
      For the events, the new data includes descriptions that may have product
      specific details and new groupings that will be consistent with other
      products.
      
      After generating the metrics from the telemetry repo [1], the following
      manual steps were performed:
      
       * Change the topdown expressions to compare on CPUID and use
         #slots so that the same data can be shared between N2 and V2. Apart
         from these modifications, the expressions now match more closely with
         the Arm telemetry data which will hopefully make future updates
         easier.
      
       * Append some metrics from the old N2/V2 data that aren't present in
         the telemetry data. These will possibly be added to the
         telemetry-solution repo at a later time:
      
          l3d_cache_mpki, l3d_cache_miss_rate, branch_pki, ipc_rate, spec_ipc,
          retired_rate, wasted_rate, branch_immed_spec_rate,
          branch_return_spec_rate, branch_indirect_spec_rate
      
      [1]: https://gitlab.arm.com/telemetry-solution/telemetry-solution/-/blob/main/data/pmu/cpu/neoverse/neoverse-n2.jsonSigned-off-by: default avatarJames Clark <james.clark@arm.com>
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andrii Nakryiko <andrii@kernel.org>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Forrington <nick.forrington@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Sohom Datta <sohomdatta1@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20230816114841.1679234-7-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      44739490
    • James Clark's avatar
      perf vendor events arm64: Update stall_slot workaround for N2 r0p3 · d43f5491
      James Clark authored
      N2 r0p3 doesn't require the workaround [1], so gating on (#slots - 5) no
      longer works because all N2s have 5 slots. Use the new expression
      builtin that allows calling strcmp_cpuid_str() and comparing CPUIDs in
      metric formulas.
      
      In this case, the commented formula looks like this:
      
        strcmp_cpuid_str(0x410fd493)        # greater than or equal to N2 r0p3
        | strcmp_cpuid_str(0x410fd490) ^ 1  # OR NOT any version of N2
      
      [1]: https://gitlab.arm.com/telemetry-solution/telemetry-solution/-/blob/main/data/pmu/cpu/neoverse/neoverse-n2-r0p3.jsonSigned-off-by: default avatarJames Clark <james.clark@arm.com>
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Forrington <nick.forrington@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Sohom Datta <sohomdatta1@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20230816114841.1679234-6-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d43f5491
    • James Clark's avatar
      perf jevents: Add a new expression builtin strcmp_cpuid_str() · 9d5da30e
      James Clark authored
      This will allow writing formulas that are conditional on a specific
      CPU type or CPU version. It calls through to the existing
      strcmp_cpuid_str() function in Perf which has a default weak version,
      and an arch specific version for x86 and arm64.
      
      The function takes an 'ID' type value, which is a string. But in this
      case Arm CPU IDs are hex numbers prefixed with '0x'. metric.py
      assumes strings are only used by event names, and that they can't start
      with a number ('0'), so an additional change has to be made to the
      regex to convert hex numbers back to 'ID' types.
      Signed-off-by: default avatarJames Clark <james.clark@arm.com>
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Forrington <nick.forrington@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Sohom Datta <sohomdatta1@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20230816114841.1679234-5-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9d5da30e
    • James Clark's avatar
      perf test: Add a test for the new Arm CPU ID comparison behavior · 81f7da54
      James Clark authored
      Now that variant and revision fields are taken into account the behavior
      is slightly more complicated so add a test to ensure that this behaves
      as expected.
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      Signed-off-by: default avatarJames Clark <james.clark@arm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Forrington <nick.forrington@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Sohom Datta <sohomdatta1@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20230816114841.1679234-3-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      81f7da54
    • James Clark's avatar
      perf arm64: Allow version comparisons of CPU IDs · c3e1e8cf
      James Clark authored
      Currently variant and revision fields are masked out of the MIDR so
      it's not possible to compare different versions of the same CPU.
      In a later commit a workaround will be removed just for N2 r0p3, so
      enable comparisons on version.
      
      This has the side effect of changing the MIDR stored in the header of
      the perf.data file to no longer have masked version fields. It also
      affects the lookups in mapfile.csv, but as that currently only has
      zeroed version fields, it has no actual effect. The mapfile.csv
      documentation also states to zero the version fields, so unless this
      isn't done it will continue to have no effect.
      
      There is an existing weak default strcmp_cpuid_str() function, and an
      x86 version. This adds another version for arm64.
      Signed-off-by: default avatarJames Clark <james.clark@arm.com>
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andrii Nakryiko <andrii@kernel.org>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Forrington <nick.forrington@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Sohom Datta <sohomdatta1@gmail.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20230816114841.1679234-2-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c3e1e8cf
  6. 16 Aug, 2023 17 commits
    • Arnaldo Carvalho de Melo's avatar
      perf bpf_skel augmented_raw_syscalls: Cap the socklen parameter using &= sizeof(saddr) · 18364804
      Arnaldo Carvalho de Melo authored
      This works with:
      
        $ clang -v
        clang version 14.0.5 (Fedora 14.0.5-2.fc36)
        $
      
      But not with:
      
        $ clang -v
        clang version 16.0.6 (Fedora 16.0.6-2.fc38)
        $
      
        [root@quaco ~]# perf trace -e connect*,sendto* ping -c 10 localhost
        libbpf: prog 'sys_enter_sendto': BPF program load failed: Permission denied
        libbpf: prog 'sys_enter_sendto': -- BEGIN PROG LOAD LOG --
        reg type unsupported for arg#0 function sys_enter_sendto#59
        0: R1=ctx(off=0,imm=0) R10=fp0
        ; int sys_enter_sendto(struct syscall_enter_args *args)
        0: (bf) r6 = r1                       ; R1=ctx(off=0,imm=0) R6_w=ctx(off=0,imm=0)
        1: (b7) r1 = 0                        ; R1_w=0
        ; int key = 0;
        2: (63) *(u32 *)(r10 -4) = r1         ; R1_w=0 R10=fp0 fp-8=0000????
        3: (bf) r2 = r10                      ; R2_w=fp0 R10=fp0
        ;
        4: (07) r2 += -4                      ; R2_w=fp-4
        ; return bpf_map_lookup_elem(&augmented_args_tmp, &key);
        5: (18) r1 = 0xffff8de5a5b8bc00       ; R1_w=map_ptr(off=0,ks=4,vs=8272,imm=0)
        7: (85) call bpf_map_lookup_elem#1    ; R0_w=map_value_or_null(id=1,off=0,ks=4,vs=8272,imm=0)
        8: (bf) r7 = r0                       ; R0_w=map_value_or_null(id=1,off=0,ks=4,vs=8272,imm=0) R7_w=map_value_or_null(id=1,off=0,ks=4,vs=8272,imm=0)
        9: (b7) r0 = 1                        ; R0_w=1
        ; if (augmented_args == NULL)
        10: (15) if r7 == 0x0 goto pc+25      ; R7_w=map_value(off=0,ks=4,vs=8272,imm=0)
        ; unsigned int socklen = args->args[5];
        11: (79) r1 = *(u64 *)(r6 +56)        ; R1_w=scalar() R6_w=ctx(off=0,imm=0)
        ;
        12: (bf) r2 = r1                      ; R1_w=scalar(id=2) R2_w=scalar(id=2)
        13: (67) r2 <<= 32                    ; R2_w=scalar(smax=9223372032559808512,umax=18446744069414584320,var_off=(0x0; 0xffffffff00000000),s32_min=0,s32_max=0,u32_max=0)
        14: (77) r2 >>= 32                    ; R2_w=scalar(umax=4294967295,var_off=(0x0; 0xffffffff))
        15: (b7) r8 = 128                     ; R8=128
        ; if (socklen > sizeof(augmented_args->saddr))
        16: (25) if r2 > 0x80 goto pc+1       ; R2=scalar(umax=128,var_off=(0x0; 0xff))
        17: (bf) r8 = r1                      ; R1=scalar(id=2) R8_w=scalar(id=2)
        ; const void *sockaddr_arg = (const void *)args->args[4];
        18: (79) r3 = *(u64 *)(r6 +48)        ; R3_w=scalar() R6=ctx(off=0,imm=0)
        ; bpf_probe_read(&augmented_args->saddr, socklen, sockaddr_arg);
        19: (bf) r1 = r7                      ; R1_w=map_value(off=0,ks=4,vs=8272,imm=0) R7=map_value(off=0,ks=4,vs=8272,imm=0)
        20: (07) r1 += 64                     ; R1_w=map_value(off=64,ks=4,vs=8272,imm=0)
        ; bpf_probe_read(&augmented_args->saddr, socklen, sockaddr_arg);
        21: (bf) r2 = r8                      ; R2_w=scalar(id=2) R8_w=scalar(id=2)
        22: (85) call bpf_probe_read#4
        R2 min value is negative, either use unsigned or 'var &= const'
        processed 22 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1
        -- END PROG LOAD LOG --
        libbpf: prog 'sys_enter_sendto': failed to load: -13
        libbpf: failed to load object 'augmented_raw_syscalls_bpf'
        libbpf: failed to load BPF skeleton 'augmented_raw_syscalls_bpf': -13
      
      So use the suggested &= variant since sizeof(saddr) == 128 bytes.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      18364804
    • Kajol Jain's avatar
      perf vendor events: Update metric events for power10 platform · 5ceb8b5b
      Kajol Jain authored
      Update JSON/events for power10 platform with additional metrics.
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-7-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5ceb8b5b
    • Kajol Jain's avatar
      perf vendor events: Update metric event names for power10 platform · edd65d2b
      Kajol Jain authored
      Update metric event name for some of the JSON/metric events for
      power10 platform.
      
      Fixes: 3ca3af7d ("perf vendor events power10: Add metric events JSON file for power10 platform")
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-6-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      edd65d2b
    • Kajol Jain's avatar
      perf vendor events: Update JSON/events for power10 platform · 426c804b
      Kajol Jain authored
      Update JSON/events for power10 platform with additional events.
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-5-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      426c804b
    • Kajol Jain's avatar
      perf vendor events: Move JSON/events to appropriate files for power10 platform · 7d473f47
      Kajol Jain authored
      Move some of the power10 JSON/events to appropriate files.
      
      Fixes: 32daa5d7 ("perf vendor events: Initial JSON/events list for power10 platform")
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-4-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7d473f47
    • Kajol Jain's avatar
      perf vendor events: Drop STORES_PER_INST metric event for power10 platform · 4836b9a8
      Kajol Jain authored
      Drop STORES_PER_INST metric event for the power10 platform, as the
      metric expression of STORES_PER_INST metric event using dropped event
      PM_ST_FIN.
      
      Fixes: 3ca3af7d ("perf vendor events power10: Add metric events JSON file for power10 platform")
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-3-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4836b9a8
    • Kajol Jain's avatar
      perf vendor events: Drop some of the JSON/events for power10 platform · e104df97
      Kajol Jain authored
      Drop some of the JSON/events for power10 platform due to counter
      data mismatch.
      
      Fixes: 32daa5d7 ("perf vendor events: Initial JSON/events list for power10 platform")
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-2-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e104df97
    • Kajol Jain's avatar
      perf vendor events: Update the JSON/events descriptions for power10 platform · 3286f88f
      Kajol Jain authored
      Update the description for some of the JSON/events for power10 platform.
      
      Fixes: 32daa5d7 ("perf vendor events: Initial JSON/events list for power10 platform")
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20230814112803.1508296-1-kjain@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3286f88f
    • Alexandre Ghiti's avatar
      perf tests mmap-basic: Adapt for riscv · 10da1b8e
      Alexandre Ghiti authored
      riscv now supports mmaping hardware counters to userspace so adapt the
      test to run on this architecture.
      Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
      Reviewed-by: default avatarAtish Patra <atishp@rivosinc.com>
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Anup Patel <anup@brainfault.org>
      Cc: Atish Patra <atishp@atishpatra.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Rémi Denis-Courmont <remi@remlab.net>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-doc@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230802080328.1213905-11-alexghiti@rivosinc.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      10da1b8e
    • Alexandre Ghiti's avatar
      libperf: Implement riscv mmap support · 159a8bb0
      Alexandre Ghiti authored
      riscv now supports mmaping hardware counters so add what's needed to
      take advantage of that in libperf.
      Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
      Reviewed-by: default avatarAtish Patra <atishp@rivosinc.com>
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Anup Patel <anup@brainfault.org>
      Cc: Atish Patra <atishp@atishpatra.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Rémi Denis-Courmont <remi@remlab.net>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-doc@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230802080328.1213905-10-alexghiti@rivosinc.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      159a8bb0
    • Leo Yan's avatar
      perf parse-regs: Move out arch specific header from util/perf_regs.h · ff382c1c
      Leo Yan authored
      util/perf_regs.h includes another perf_regs.h:
      
        #include <perf_regs.h>
      
      Here it includes architecture specific header, for example, if we build
      arm64 target, the header tools/perf/arch/arm64/include/perf_regs.h is
      included.
      
      We use this implicit way to include architecture specific header, which
      is not directive; furthermore, util/perf_regs.c is coupled with the
      architecture specific definitions.
      
      This patch moves out arch specific header from util/perf_regs.h for
      generalizing the 'util' folder, as a result, the source files in 'arch'
      folder explicitly include architecture's perf_regs.h.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-7-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ff382c1c
    • Leo Yan's avatar
      perf parse-regs: Remove PERF_REGS_{MAX|MASK} from common code · 856caabf
      Leo Yan authored
      The macros PERF_REGS_MAX and PERF_REGS_MASK are architecture specific,
      let's remove them from the common file util/perf_regs.c.
      
      As a side effect, the weak functions arch__intr_reg_mask() and
      arch__user_reg_mask() just return zeros, every arch defines its own
      functions in the 'arch' folder for returning right values.
      
      Note, we don't need to return intr/user register masks dynamically, this
      is because these two functions are invoked during recording phase but
      not decoding phase, they are always invoked on the native environment,
      thus we don't need to parse them dynamically.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-6-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      856caabf
    • Leo Yan's avatar
      perf parse-regs: Remove unused macros PERF_REG_{IP|SP} · 6a87e0f0
      Leo Yan authored
      The macros PERF_REG_{IP|SP} have been replaced by using functions
      perf_arch_reg_{ip|sp}(), remove them!
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-5-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      6a87e0f0
    • Leo Yan's avatar
      perf unwind: Use perf_arch_reg_{ip|sp}() to substitute macros · d8f69fb6
      Leo Yan authored
      We use perf_arch_reg_ip() and perf_arch_reg_sp() to substitute macros
      for obtaining the register numbers of SP and IP.  This modification
      enables cross analysis in the unwinding, therefore, the unwinding is
      not restricted to the predefined values by the macros.
      
      Consequently, the macros LIBUNWIND__ARCH_REG_{IP|SP} are removed since
      they are no longer used.
      
      Committer notes:
      
      Add missing "util/env.h" header to make sure we have the definition for
      perf_env__arch(), that when built with NO_LIBUNWIND=1 isn't available,
      i.e. it was being included by sheer luck.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-4-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d8f69fb6
    • Leo Yan's avatar
      perf parse-regs: Introduce functions perf_arch_reg_{ip|sp}() · 34af56af
      Leo Yan authored
      The current code uses macros PERF_REG_IP and PERF_REG_SP for parsing
      registers and we build perf with these macros statically, which means it
      only can correctly analyze CPU registers for the native architecture and
      fails to support cross analysis (e.g. we build perf on x86 and cannot
      analyze Arm64's registers).
      
      We need to generalize util/perf_regs.c for support multi architectures,
      as a first step, this commit introduces new functions perf_arch_reg_ip()
      and perf_arch_reg_sp(), these two functions dynamically return IP and SP
      register index respectively according to the parameter "arch".
      
      Every architecture has its own functions (like __perf_reg_ip_arm64 and
      __perf_reg_sp_arm64), these architecture specific functions are defined
      in each arch source file under folder util/perf-regs-arch; at the end
      all of them are built into the tool for cross analysis.
      
      Committer notes:
      
      Make DWARF_MINIMAL_REGS() an inline function, so that we can use the
      __maybe_unused attribute for the 'arch' parameter, as this will avoid a
      build failure when that variable is unused in the callers. That happens
      when building on unsupported architectures, the ones without
      HAVE_PERF_REGS_SUPPORT defined.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-3-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      34af56af
    • Leo Yan's avatar
      perf parse-regs: Refactor arch register parsing functions · 5000e7f6
      Leo Yan authored
      Every architecture has a specific register parsing function for
      returning register name based on register index, to support cross
      analysis (e.g. we use perf x86 binary to parse Arm64's perf data), we
      build all these register parsing functions into the tool, this is why
      we place all related functions into util/perf_regs.c.
      
      Unfortunately, since util/perf_regs.c needs to include every arch's
      perf_regs.h, this easily introduces duplicated definitions coming from
      multiple headers, finally it's fragile for building and difficult for
      maintenance.
      
      We cannot simply move these register parsing functions into the
      corresponding 'arch' folder, the folder is only conditionally built
      based on the target architecture.
      
      Therefore, this commit creates a new folder util/perf-regs-arch/ and
      uses a dedicated source file to keep every architecture's register
      parsing function to avoid definition conflicts.
      
      This is only a refactoring, no functionality change is expected.
      
      Committer notes:
      
      Had to add util/perf-regs-arch/*.c to tools/perf/util/python-ext-sources
      to keep 'perf test python' passing.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Eric Lin <eric.lin@sifive.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Ivan Babrou <ivan@cloudflare.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@dabbelt.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-csky@vger.kernel.org
      Cc: linux-riscv@lists.infradead.org
      Link: https://lore.kernel.org/r/20230606014559.21783-2-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5000e7f6
    • Changbin Du's avatar
      perf docs: Fix format of unordered lists · a1ef3aaf
      Changbin Du authored
      Fix the format of unordered lists so the can wrap properly.
      Signed-off-by: default avatarChangbin Du <changbin.du@huawei.com>
      Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20230718085242.3090797-1-changbin.du@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a1ef3aaf
  7. 15 Aug, 2023 4 commits