Skip to content
  • Arnaldo Carvalho de Melo's avatar
    perf trace: Grow the syscall table as needed when using libaudit · d21cb73a
    Arnaldo Carvalho de Melo authored
    
    
    The audit-libs API doesn't provide a way to figure out what is the
    syscall with the greatest number/id, take that into account when using
    that method to go on growing the syscall table as we the syscalls go on
    appearing on the radar.
    
    With this the libaudit based method is back working, i.e. when building
    with:
    
      $ make NO_SYSCALL_TABLE=1 O=/tmp/build/perf -C tools/perf install-bin
      <SNIP>
      Auto-detecting system features:
      <SNIP>
      ...                      libaudit: [ on  ]
      ...                        libbfd: [ on  ]
      ...                        libcap: [ on  ]
      <SNIP>
      $ ldd ~/bin/perf | grep audit
    	libaudit.so.1 => /lib64/libaudit.so.1 (0x00007faef22df000)
      $
    
    perf trace is back working, which makes it functional in arches other
    than x86_64, powerpc, arm64 and s390, that provides these generators:
    
      $ find tools/perf/arch/ -name "*syscalltbl*"
      tools/perf/arch/x86/entry/syscalls/syscalltbl.sh
      tools/perf/arch/arm64/entry/syscalls/mksyscalltbl
      tools/perf/arch/s390/entry/syscalls/mksyscalltbl
      tools/perf/arch/powerpc/entry/syscalls/mksyscalltbl
      $
    
    Example output forcing the libaudit method on x86_64:
    
      # perf trace -e file,nanosleep sleep 0.001
               ? (         ): sleep/859090  ... [continued]: execve())                                   = 0
           0.045 ( 0.005 ms): sleep/859090 access(filename: 0x8733e850, mode: R)                         = -1 ENOENT (No such file or directory)
           0.055 ( 0.005 ms): sleep/859090 openat(dfd: CWD, filename: 0x8733ba29, flags: RDONLY|CLOEXEC) = 3
           0.079 ( 0.005 ms): sleep/859090 openat(dfd: CWD, filename: 0x87345d20, flags: RDONLY|CLOEXEC) = 3
           0.085 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483f58, count: 832)                  = 832
           0.090 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483b50, count: 784)                  = 784
           0.094 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483b20, count: 32)                   = 32
           0.098 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483ad0, count: 68)                   = 68
           0.109 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483a50, count: 784)                  = 784
           0.113 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483730, count: 32)                   = 32
           0.117 ( 0.002 ms): sleep/859090 read(fd: 3, buf: 0x7ffd9d483710, count: 68)                   = 68
           0.320 ( 0.008 ms): sleep/859090 openat(dfd: CWD, filename: 0x872c3660, flags: RDONLY|CLOEXEC) = 3
           0.372 ( 1.057 ms): sleep/859090 nanosleep(rqtp: 0x7ffd9d484ac0)                               = 0
      #
    
    There are still some limitations when using the libaudit method, that
    will be fixed at some point, i.e., this works with the mksyscalltbl
    method but not with libaudit's:
    
      # perf trace -e file,*sleep sleep 0.001
      event syntax error: '*sleep'
                           \___ parser error
      Run 'perf list' for a list of valid events
    
       Usage: perf trace [<options>] [<command>]
          or: perf trace [<options>] -- <command> [<options>]
          or: perf trace record [<options>] [<command>]
          or: perf trace record [<options>] -- <command> [<options>]
    
          -e, --event <event>   event/syscall selector. use 'perf list' to list available events
      #
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    d21cb73a