• Arnaldo Carvalho de Melo's avatar
    perf trace: Use the augmented filename, expanding syscall enter pointers · 75d1e306
    Arnaldo Carvalho de Melo authored
    This is the final touch in showing how a syscall argument beautifier can
    access the augmented args put in place by the
    tools/perf/examples/bpf/augmented_syscalls.c eBPF script, right after
    the regular raw syscall args, i.e. the up to 6 long integer values in
    the syscall interface.
    
    With this we are able to show the 'openat' syscall arg, now with up to
    64 bytes, but in time this will be configurable, just like with the
    'strace -s strsize' argument, from 'strace''s man page:
    
      -s strsize  Specify the maximum string size to print (the default is 32).
    
    This actually is the maximum string to _collect_ and store in the ring
    buffer, not just print.
    
    Before:
    
      # perf trace -e tools/perf/examples/bpf/augmented_syscalls.c,openat cat /etc/passwd > /dev/null
         0.000 (         ): cat/9658 openat(dfd: CWD, filename: 0x6626eda8, flags: CLOEXEC)
         0.017 ( 0.007 ms): cat/9658 openat(dfd: CWD, filename: 0x6626eda8, flags: CLOEXEC) = 3
         0.049 (         ): cat/9658 openat(dfd: CWD, filename: 0x66476ce0, flags: CLOEXEC)
         0.051 ( 0.007 ms): cat/9658 openat(dfd: CWD, filename: 0x66476ce0, flags: CLOEXEC) = 3
         0.377 (         ): cat/9658 openat(dfd: CWD, filename: 0x1e8f806b)
         0.379 ( 0.005 ms): cat/9658 openat(dfd: CWD, filename: 0x1e8f806b) = 3
      #
    
    After:
    
      # perf trace -e tools/perf/examples/bpf/augmented_syscalls.c,openat cat /etc/passwd > /dev/null
         0.000 (         ): cat/11966 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC)
         0.006 ( 0.006 ms): cat/11966 openat(dfd: CWD, filename: 0x4bfdcda8, flags: CLOEXEC) = 3
         0.034 (         ): cat/11966 openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC)
         0.036 ( 0.008 ms): cat/11966 openat(dfd: CWD, filename: 0x4c1e4ce0, flags: CLOEXEC) = 3
         0.375 (         ): cat/11966 openat(dfd: CWD, filename: /etc/passwd)
         0.377 ( 0.005 ms): cat/11966 openat(dfd: CWD, filename: 0xe87906b) = 3
      #
    
    This cset should show all the aspects of establishing a protocol between
    an eBPF syscall arg augmenter program, tools/perf/examples/bpf/augmented_syscalls.c and
    a 'perf trace' beautifier, the one associated with all 'char *' point
    syscall args with names that can heuristically be associated with
    filenames.
    
    Now to wire up 'open' to show a second syscall using this scheme, all we
    have to do now is to change tools/perf/examples/bpf/augmented_syscalls.c,
    as 'perf trace' will notice that the perf_sample.raw_size is more than
    what is expected for a particular syscall payload as defined by its
    tracefs format file and will then use the augmented payload in the
    'filename' syscall arg beautifier.
    
    The same protocol will be used for structs such as 'struct sockaddr *',
    'struct pollfd', etc, with additions for handling arrays.
    
    This will all be done under the hood when 'perf trace' realizes the
    system has the necessary components, and also can be done by providing
    a precompiled augmented_syscalls.c eBPF ELF object.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    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: https://lkml.kernel.org/n/tip-gj9kqb61wo7m3shtpzercbcr@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    75d1e306
augmented_syscalls.c 2.02 KB