Skip to content
  • Arnaldo Carvalho de Melo's avatar
    perf trace beauty kcmp: Beautify arguments · 1de3038d
    Arnaldo Carvalho de Melo authored
    For some unknown reason there is no entry in tracefs's syscalls for
    kcmp, i.e. no tracefs/events/syscalls/sys_{enter,exit}_kcmp, so we need
    to provide a data dictionary for the fields.
    
    To beautify the 'type' argument we automatically generate a strarray
    from tools/include/uapi/kcmp.h, the idx1 and idx2 args, nowadays used
    only if type == KCMP_FILE, are masked for all the other types and a
    lookup is made for the thread and fd to show the path, if possible,
    getting it from the probe:vfs_getname if in place or from procfs, races
    allowing.
    
    A system wide strace like tracing session, with callchains shows just
    one user so far in this fedora 25 machine:
    
      # perf trace --max-stack 5 -e kcmp
      <SNIP>
      1502914.400 ( 0.001 ms): systemd/1 kcmp(pid1: 1 (systemd), pid2: 1 (systemd), type: FILE, idx1: 271<socket:[4723475]>, idx2: 25<socket:[4788686]>) = -1 ENOSYS Function not implemented
                                             syscall (/usr/lib64/libc-2.25.so)
                                             same_fd (/usr/lib/systemd/libsystemd-shared-233.so)
                                             service_add_fd_store (/usr/lib/systemd/systemd)
                                             service_notify_message.lto_priv.127 (/usr/lib/systemd/systemd)
      1502914.407 ( 0.001 ms): systemd/1 kcmp(pid1: 1 (systemd), pid2: 1 (systemd), type: FILE, idx1: 270<socket:[4726396]>, idx2: 25<socket:[4788686]>) = -1 ENOSYS Function not implemented
                                             syscall (/usr/lib64/libc-2.25.so)
                                             same_fd (/usr/lib/systemd/libsystemd-shared-233.so)
                                             service_add_fd_store (/usr/lib/systemd/systemd)
                                             service_notify_message.lto_priv.127 (/usr/lib/systemd/systemd)
      <SNIP>
    
    The backtraces seem to agree this is really kcmp(), but this system
    doesn't have the sys_kcmp(), bummer:
    
      # uname -a
      Linux jouet 4.14.0-rc3+ #1 SMP Fri Oct 13 12:21:12 -03 2017 x86_64 x86_64 x86_64 GNU/Linux
      # grep kcmp /proc/kallsyms
      ffffffffb60b8890 W sys_kcmp
      $ grep CONFIG_CHECKPOINT_RESTORE ../build/v4.14.0-rc3+/.config
      # CONFIG_CHECKPOINT_RESTORE is not set
      $
    
    So systemd uses it, good fedora kernel config has it:
    
      $ grep CONFIG_CHECKPOINT_RESTORE /boot/config-4.13.4-200.fc26.x86_64
      CONFIG_CHECKPOINT_RESTORE=y
      [acme@jouet linux]$
    
    /me goes to rebuild a kernel...
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andrey Vagin <avagin@openvz.org>
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/n/tip-gz5fca968viw8m7hryjqvrln@git.kernel.org
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1de3038d