Blame README.btf

Packit b92951
We'll test the BTF encoder using perf's eBPF integration, but really we can plain
Packit b92951
use clang directly, setting up all its options.
Packit b92951
Packit b92951
Using perf's integration will save some time here, to see all it does, use
Packit b92951
'perf trace -vv' plus the options used below, then all the steps will be shown.
Packit b92951
Packit b92951
Build perf from the latest kernel sources, use it with clang/llvm like:
Packit b92951
Packit b92951
  [root@seventh ~]# clang --version
Packit b92951
  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c)
Packit b92951
  Target: x86_64-unknown-linux-gnu
Packit b92951
  Thread model: posix
Packit b92951
  InstalledDir: /usr/local/bin
Packit b92951
  [root@seventh ~]# llc --version | head -17
Packit b92951
  LLVM (http://llvm.org/):
Packit b92951
    LLVM version 8.0.0svn
Packit b92951
    DEBUG build with assertions.
Packit b92951
    Default target: x86_64-unknown-linux-gnu
Packit b92951
    Host CPU: skylake
Packit b92951
Packit b92951
    Registered Targets:
Packit b92951
      aarch64    - AArch64 (little endian)
Packit b92951
      aarch64_be - AArch64 (big endian)
Packit b92951
      amdgcn     - AMD GCN GPUs
Packit b92951
      arm        - ARM
Packit b92951
      arm64      - ARM64 (little endian)
Packit b92951
      armeb      - ARM (big endian)
Packit b92951
      bpf        - BPF (host endian)
Packit b92951
      bpfeb      - BPF (big endian)
Packit b92951
      bpfel      - BPF (little endian)
Packit b92951
      hexagon    - Hexagon
Packit b92951
  [root@seventh ~]# 
Packit b92951
Packit b92951
Then enable saving the object file build as part of perf's handling of foo.c type
Packit b92951
events, i.e. eBPF programs that will be compiled with clang and then loaded with
Packit b92951
sys_bpf() to possibly insert events in perf's ring buffer via bpf_perf_event_output(),
Packit b92951
or interact with the system via bpf_trace_printk() or just work as filters, etc:
Packit b92951
Packit b92951
  # cat ~/.perfconfig
Packit b92951
  [llvm]
Packit b92951
	dump-obj = true
Packit b92951
Packit b92951
Then run a simple example, found in the kernel sources:
Packit b92951
Packit b92951
  # perf trace -e tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null
Packit b92951
  LLVM: dumping tools/perf/examples/bpf/hello.o
Packit b92951
     0.000 __bpf_stdout__:Hello, world
Packit b92951
     0.028 __bpf_stdout__:Hello, world
Packit b92951
     0.291 __bpf_stdout__:Hello, world
Packit b92951
  #
Packit b92951
Packit b92951
Notice that "LLVM: dumping..." line, look at the ELF sections in that file:
Packit b92951
Packit b92951
  [root@seventh perf]# readelf -SW tools/perf/examples/bpf/hello.o
Packit b92951
  There are 11 section headers, starting at offset 0x220:
Packit b92951
Packit b92951
  Section Headers:
Packit b92951
    [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
Packit b92951
    [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
Packit b92951
    [ 1] .strtab           STRTAB          0000000000000000 00018c 00008d 00      0   0  1
Packit b92951
    [ 2] .text             PROGBITS        0000000000000000 000040 000000 00  AX  0   0  4
Packit b92951
    [ 3] syscalls:sys_enter_openat PROGBITS        0000000000000000 000040 000088 00  AX  0   0  8
Packit b92951
    [ 4] .relsyscalls:sys_enter_openat REL             0000000000000000 000178 000010 10     10   3  8
Packit b92951
    [ 5] maps              PROGBITS        0000000000000000 0000c8 00001c 00  WA  0   0  4
Packit b92951
    [ 6] .rodata.str1.1    PROGBITS        0000000000000000 0000e4 00000e 01 AMS  0   0  1
Packit b92951
    [ 7] license           PROGBITS        0000000000000000 0000f2 000004 00  WA  0   0  1
Packit b92951
    [ 8] version           PROGBITS        0000000000000000 0000f8 000004 00  WA  0   0  4
Packit b92951
    [ 9] .llvm_addrsig     LOOS+0xfff4c03  0000000000000000 000188 000004 00   E 10   0  1
Packit b92951
    [10] .symtab           SYMTAB          0000000000000000 000100 000078 18      1   1  8
Packit b92951
  Key to Flags:
Packit b92951
    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
Packit b92951
    L (link order), O (extra OS processing required), G (group), T (TLS),
Packit b92951
    C (compressed), x (unknown), o (OS specific), E (exclude),
Packit b92951
    p (processor specific)
Packit b92951
  [root@seventh perf]#
Packit b92951
Packit b92951
No DWARF debugging info, so we need to further customize ~/.perfconfig LLVM section:
Packit b92951
Packit b92951
  [root@seventh perf]# cat ~/.perfconfig
Packit b92951
  [llvm]
Packit b92951
	  dump-obj = true
Packit b92951
	  clang-opt = -g
Packit b92951
  [root@seventh perf]# perf trace -e tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null
Packit b92951
  LLVM: dumping tools/perf/examples/bpf/hello.o
Packit b92951
       0.000 __bpf_stdout__:Hello, world
Packit b92951
       0.015 __bpf_stdout__:Hello, world
Packit b92951
       0.184 __bpf_stdout__:Hello, world
Packit b92951
  [root@seventh perf]# 
Packit b92951
  [root@seventh perf]# readelf -SW tools/perf/examples/bpf/hello.o
Packit b92951
  There are 26 section headers, starting at offset 0xe20:
Packit b92951
Packit b92951
  Section Headers:
Packit b92951
    [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
Packit b92951
    [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
Packit b92951
    [ 1] .strtab           STRTAB          0000000000000000 000cf4 000127 00      0   0  1
Packit b92951
    [ 2] .text             PROGBITS        0000000000000000 000040 000000 00  AX  0   0  4
Packit b92951
    [ 3] syscalls:sys_enter_openat PROGBITS        0000000000000000 000040 000088 00  AX  0   0  8
Packit b92951
    [ 4] .relsyscalls:sys_enter_openat REL             0000000000000000 000a80 000010 10     25   3  8
Packit b92951
    [ 5] maps              PROGBITS        0000000000000000 0000c8 00001c 00  WA  0   0  4
Packit b92951
    [ 6] .rodata.str1.1    PROGBITS        0000000000000000 0000e4 00000e 01 AMS  0   0  1
Packit b92951
    [ 7] license           PROGBITS        0000000000000000 0000f2 000004 00  WA  0   0  1
Packit b92951
    [ 8] version           PROGBITS        0000000000000000 0000f8 000004 00  WA  0   0  4
Packit b92951
    [ 9] .debug_str        PROGBITS        0000000000000000 0000fc 0001d2 01  MS  0   0  1
Packit b92951
    [10] .debug_loc        PROGBITS        0000000000000000 0002ce 000023 00      0   0  1
Packit b92951
    [11] .debug_abbrev     PROGBITS        0000000000000000 0002f1 0000e3 00      0   0  1
Packit b92951
    [12] .debug_info       PROGBITS        0000000000000000 0003d4 000182 00      0   0  1
Packit b92951
    [13] .rel.debug_info   REL             0000000000000000 000a90 000210 10     25  12  8
Packit b92951
    [14] .debug_ranges     PROGBITS        0000000000000000 000556 000030 00      0   0  1
Packit b92951
    [15] .debug_macinfo    PROGBITS        0000000000000000 000586 000001 00      0   0  1
Packit b92951
    [16] .debug_pubnames   PROGBITS        0000000000000000 000587 00006e 00      0   0  1
Packit b92951
    [17] .rel.debug_pubnames REL             0000000000000000 000ca0 000010 10     25  16  8
Packit b92951
    [18] .debug_pubtypes   PROGBITS        0000000000000000 0005f5 000056 00      0   0  1
Packit b92951
    [19] .rel.debug_pubtypes REL             0000000000000000 000cb0 000010 10     25  18  8
Packit b92951
    [20] .debug_frame      PROGBITS        0000000000000000 000650 000028 00      0   0  8
Packit b92951
    [21] .rel.debug_frame  REL             0000000000000000 000cc0 000020 10     25  20  8
Packit b92951
    [22] .debug_line       PROGBITS        0000000000000000 000678 0000a7 00      0   0  1
Packit b92951
    [23] .rel.debug_line   REL             0000000000000000 000ce0 000010 10     25  22  8
Packit b92951
    [24] .llvm_addrsig     LOOS+0xfff4c03  0000000000000000 000cf0 000004 00   E 25   0  1
Packit b92951
    [25] .symtab           SYMTAB          0000000000000000 000720 000360 18      1  32  8
Packit b92951
  Key to Flags:
Packit b92951
    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
Packit b92951
    L (link order), O (extra OS processing required), G (group), T (TLS),
Packit b92951
    C (compressed), x (unknown), o (OS specific), E (exclude),
Packit b92951
    p (processor specific)
Packit b92951
  [root@seventh perf]#
Packit b92951
Packit b92951
Now lets use 'pahole --btf_encode' (or 'pahole -J') to add an ELF section to that object
Packit b92951
file with the conversion from the DWARF sections to a new one, for BTF:
Packit b92951
Packit b92951
  [root@seventh perf]# pahole --btf_encode tools/perf/examples/bpf/hello.o
Packit b92951
Packit b92951
  [root@seventh perf]# readelf -SW tools/perf/examples/bpf/hello.o
Packit b92951
  There are 27 section headers, starting at offset 0x1080:
Packit b92951
Packit b92951
  Section Headers:
Packit b92951
    [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
Packit b92951
    [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
Packit b92951
    [ 1] .text             PROGBITS        0000000000000000 000040 000000 00  AX  0   0  4
Packit b92951
    [ 2] syscalls:sys_enter_openat PROGBITS        0000000000000000 000040 000088 00  AX  0   0  8
Packit b92951
    [ 3] maps              PROGBITS        0000000000000000 0000c8 00001c 00  WA  0   0  4
Packit b92951
    [ 4] .rodata.str1.1    PROGBITS        0000000000000000 0000e4 00000e 01 AMS  0   0  1
Packit b92951
    [ 5] license           PROGBITS        0000000000000000 0000f2 000004 00  WA  0   0  1
Packit b92951
    [ 6] version           PROGBITS        0000000000000000 0000f8 000004 00  WA  0   0  4
Packit b92951
    [ 7] .debug_str        PROGBITS        0000000000000000 0000fc 0001d2 01  MS  0   0  1
Packit b92951
    [ 8] .debug_loc        PROGBITS        0000000000000000 0002ce 000023 00      0   0  1
Packit b92951
    [ 9] .debug_abbrev     PROGBITS        0000000000000000 0002f1 0000e3 00      0   0  1
Packit b92951
    [10] .debug_info       PROGBITS        0000000000000000 0003d4 000182 00      0   0  1
Packit b92951
    [11] .debug_ranges     PROGBITS        0000000000000000 000556 000030 00      0   0  1
Packit b92951
    [12] .debug_macinfo    PROGBITS        0000000000000000 000586 000001 00      0   0  1
Packit b92951
    [13] .debug_pubnames   PROGBITS        0000000000000000 000587 00006e 00      0   0  1
Packit b92951
    [14] .debug_pubtypes   PROGBITS        0000000000000000 0005f5 000056 00      0   0  1
Packit b92951
    [15] .debug_frame      PROGBITS        0000000000000000 000650 000028 00      0   0  8
Packit b92951
    [16] .debug_line       PROGBITS        0000000000000000 000678 0000a7 00      0   0  1
Packit b92951
    [17] .symtab           SYMTAB          0000000000000000 000720 000360 18     25  32  8
Packit b92951
    [18] .relsyscalls:sys_enter_openat REL             0000000000000000 000a80 000010 10     17   2  8
Packit b92951
    [19] .rel.debug_info   REL             0000000000000000 000a90 000210 10     17  10  8
Packit b92951
    [20] .rel.debug_pubnames REL             0000000000000000 000ca0 000010 10     17  13  8
Packit b92951
    [21] .rel.debug_pubtypes REL             0000000000000000 000cb0 000010 10     17  14  8
Packit b92951
    [22] .rel.debug_frame  REL             0000000000000000 000cc0 000020 10     17  15  8
Packit b92951
    [23] .rel.debug_line   REL             0000000000000000 000ce0 000010 10     17  16  8
Packit b92951
    [24] .llvm_addrsig     LOOS+0xfff4c03  0000000000000000 000cf0 000004 00   E  0   0  1
Packit b92951
    [25] .strtab           STRTAB          0000000000000000 000cf4 00019c 00      0   0  1
Packit b92951
    [26] .BTF              PROGBITS        0000000000000000 000e90 0001ea 00      0   0  1
Packit b92951
  Key to Flags:
Packit b92951
    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
Packit b92951
    L (link order), O (extra OS processing required), G (group), T (TLS),
Packit b92951
    C (compressed), x (unknown), o (OS specific), E (exclude),
Packit b92951
    p (processor specific)
Packit b92951
  readelf: tools/perf/examples/bpf/hello.o: Warning: possibly corrupt ELF header - it has a non-zero program header offset, but no program headers
Packit b92951
  [root@seventh perf]# 
Packit b92951
Packit b92951
That new ".BTF" section should then be parseable by the kernel, that has a BTF
Packit b92951
decoder, something not available for pahole at this time, but that will come in
Packit b92951
a later version.
Packit b92951
Packit b92951
When pahole tries to read the DWARF info in that BPF ELF file, hello.o, we can se
Packit b92951
a problem that will require us to add another option to the .perfconfig llvm section:
Packit b92951
Packit b92951
  # pahole tools/perf/examples/bpf/hello.o
Packit b92951
  struct clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c) {
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*     0     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*     4     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*     8     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*    12     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*    16     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*    20     4 */
Packit b92951
	  clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566ec377 clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /*    24     4 */
Packit b92951
Packit b92951
	  /* size: 28, cachelines: 1, members: 7 */
Packit b92951
	  /* last cacheline: 28 bytes */
Packit b92951
  };
Packit b92951
#
Packit b92951
Packit b92951
We need to pass some options to llvm, via the llvm.opts variable in ~/.perfconfig:
Packit b92951
Packit b92951
  [root@seventh perf]# cat ~/.perfconfig 
Packit b92951
  [llvm]
Packit b92951
	  dump-obj = true
Packit b92951
	  clang-opt = -g
Packit b92951
	  opts = -mattr=dwarfris
Packit b92951
  [root@seventh perf]# perf trace -e tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null
Packit b92951
  LLVM: dumping tools/perf/examples/bpf/hello.o
Packit b92951
       0.000 __bpf_stdout__:Hello, world
Packit b92951
       0.018 __bpf_stdout__:Hello, world
Packit b92951
       0.209 __bpf_stdout__:Hello, world
Packit b92951
  [root@seventh perf]# pahole tools/perf/examples/bpf/hello.o
Packit b92951
  struct bpf_map {
Packit b92951
	  unsigned int               type;                 /*     0     4 */
Packit b92951
	  unsigned int               key_size;             /*     4     4 */
Packit b92951
	  unsigned int               value_size;           /*     8     4 */
Packit b92951
	  unsigned int               max_entries;          /*    12     4 */
Packit b92951
	  unsigned int               map_flags;            /*    16     4 */
Packit b92951
	  unsigned int               inner_map_idx;        /*    20     4 */
Packit b92951
	  unsigned int               numa_node;            /*    24     4 */
Packit b92951
Packit b92951
	  /* size: 28, cachelines: 1, members: 7 */
Packit b92951
	  /* last cacheline: 28 bytes */
Packit b92951
  };
Packit b92951
  [root@seventh perf]#
Packit b92951
Packit b92951
This is not needed when using elfutils >= 0.173, pahole will just work as above.
Packit b92951
Packit b92951
Now we need to go test the kernel, and to load that file with a BTF section we
Packit b92951
can also use perf, passing the .o file instead of the .c one, skipping the
Packit b92951
compilation phase and using the modified .o file, we will also run in system
Packit b92951
wide mode, so taht we can keep that BPF object loaded and attached to the
Packit b92951
tracepoint, so that we can use the kernel facilities to inspect the BTF file as
Packit b92951
read and processed by the kernel:
Packit b92951
Packit b92951
  # perf trace -e tools/perf/examples/bpf/hello.c 2> /dev/null
Packit b92951
Packit b92951
Now to look if the kernel has the bpf filesystem:
Packit b92951
Packit b92951
  [acme@jouet perf]$ grep bpf /proc/filesystems 
Packit b92951
  nodev	bpf
Packit b92951
  [acme@jouet perf]$
Packit b92951
  [root@jouet ~]# mount -t bpf nodev /sys/fs/bpf
Packit b92951
  [root@jouet ~]# mount | grep bpf
Packit b92951
  nodev on /sys/fs/bpf type bpf (rw,relatime)
Packit b92951
  [root@jouet ~]# cd /sys/fs/bpf
Packit b92951
  [root@jouet bpf]# ls -la
Packit b92951
  total 0
Packit b92951
  drwxrwxrwt.  2 root root 0 Aug 15 17:42 .
Packit b92951
  drwxr-xr-x. 10 root root 0 Aug 13 15:04 ..
Packit b92951
  [root@jouet bpf]#
Packit b92951
Packit b92951
Work is planned to allow using BTF info to pretty print from the bpf fs, see:
Packit b92951
Packit b92951
  https://www.spinics.net/lists/netdev/msg518606.html
Packit b92951
  Date: Sat, 11 Aug 2018
Packit b92951
Packit b92951
<quote>
Packit b92951
For bpftool, BTF pretty print support is missing
Packit b92951
for per-cpu maps. bpffs print for per-cpu hash/array maps
Packit b92951
need to be added as well. Will add them later.
Packit b92951
Packit b92951
Acked-by: Yonghong Song <yhs@xxxxxx>
Packit b92951
</quote>
Packit b92951
Packit b92951
To see what libbpf and its users, like perf, does when a ".BTF" ELF section is
Packit b92951
found in a BPF object being loaded via sys_bpf(), we can use 'perf ftrace' to
Packit b92951
show the sequence of events inside the kernel to load, validade and initialize
Packit b92951
data structures related to the request:
Packit b92951
Packit b92951
  # perf ftrace -G *btf* perf trace -e tools/perf/examples/bpf/hello.o cat /etc/passwd
Packit b92951
  3)               |  bpf_btf_load() {
Packit b92951
  3)               |    capable() {
Packit b92951
  3)               |      ns_capable_common() {
Packit b92951
  3)               |        security_capable() {
Packit b92951
  3)   0.048 us    |          cap_capable();
Packit b92951
  3)               |          selinux_capable() {
Packit b92951
  3)   0.092 us    |            cred_has_capability();
Packit b92951
  3)   0.444 us    |          }
Packit b92951
  3)   1.387 us    |        }
Packit b92951
  3)   1.764 us    |      }
Packit b92951
  3)   2.168 us    |    }
Packit b92951
  3)               |    btf_new_fd() {
Packit b92951
  3)               |      kmem_cache_alloc_trace() {
Packit b92951
  3)               |        _cond_resched() {
Packit b92951
  3)   0.041 us    |          rcu_all_qs();
Packit b92951
  3)   0.407 us    |        }
Packit b92951
  3)   0.040 us    |        should_failslab();
Packit b92951
  3)   0.161 us    |        prefetch_freepointer();
Packit b92951
  3)   0.097 us    |        memcg_kmem_put_cache();
Packit b92951
  3)   2.719 us    |      }
Packit b92951
  3)               |      kmem_cache_alloc_trace() {
Packit b92951
  3)               |        _cond_resched() {
Packit b92951
  3)   0.040 us    |          rcu_all_qs();
Packit b92951
  3)   0.409 us    |        }
Packit b92951
  3)   0.040 us    |        should_failslab();
Packit b92951
  3)   0.110 us    |        prefetch_freepointer();
Packit b92951
  3)   0.099 us    |        memcg_kmem_put_cache();
Packit b92951
  3)   2.296 us    |      }
Packit b92951
  3)   0.054 us    |      bpf_check_uarg_tail_zero();
Packit b92951
  3)               |      __check_object_size() {
Packit b92951
  3)   0.152 us    |        __virt_addr_valid();
Packit b92951
  3)   0.047 us    |        __check_heap_object();
Packit b92951
  3)   0.040 us    |        check_stack_object();
Packit b92951
  3)   1.465 us    |      }
Packit b92951
  3)   0.041 us    |      btf_sec_info_cmp();
Packit b92951
  3)               |      kvmalloc_node() {
Packit b92951
  3)               |        __kmalloc_node() {
Packit b92951
  3)   0.051 us    |          kmalloc_slab();
Packit b92951
  3)               |          _cond_resched() {
Packit b92951
  3)   0.042 us    |            rcu_all_qs();
Packit b92951
  3)   0.401 us    |          }
Packit b92951
  3)   0.038 us    |          should_failslab();
Packit b92951
  3)   0.040 us    |          memcg_kmem_put_cache();
Packit b92951
  3)   2.168 us    |        }
Packit b92951
  3)   2.591 us    |      }
Packit b92951
  3)               |      __check_object_size() {
Packit b92951
  3)   0.108 us    |        __virt_addr_valid();
Packit b92951
  3)   0.050 us    |        __check_heap_object();
Packit b92951
  3)   0.039 us    |        check_stack_object();
Packit b92951
  3)   1.469 us    |      }
Packit b92951
  3)               |      btf_struct_check_meta() {
Packit b92951
  3)   0.057 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.057 us    |        btf_verifier_log_member();
Packit b92951
  3)   0.043 us    |        btf_verifier_log_member();
Packit b92951
  3)   0.042 us    |        btf_verifier_log_member();
Packit b92951
  3)   0.043 us    |        btf_verifier_log_member();
Packit b92951
  3)   0.043 us    |        btf_verifier_log_member();
Packit b92951
  3)               |        btf_verifier_log_member() {
Packit b92951
  3)   ==========> |
Packit b92951
  3)               |        smp_irq_work_interrupt() {
Packit b92951
  3)               |          irq_enter() {
Packit b92951
  3)               |            rcu_irq_enter() {
Packit b92951
  3)   0.038 us    |              rcu_nmi_enter();
Packit b92951
  3)   0.412 us    |            }
Packit b92951
  3)   0.054 us    |            irqtime_account_irq();
Packit b92951
  3)   1.409 us    |          }
Packit b92951
  3)               |          __wake_up() {
Packit b92951
  3)               |            __wake_up_common_lock() {
Packit b92951
  3)   0.040 us    |              _raw_spin_lock_irqsave();
Packit b92951
  3)   0.051 us    |              __wake_up_common();
Packit b92951
  3)   0.044 us    |              _raw_spin_unlock_irqrestore();
Packit b92951
  3)   1.155 us    |            }
Packit b92951
  3)   1.508 us    |          }
Packit b92951
  3)               |          irq_exit() {
Packit b92951
  3)   0.062 us    |            irqtime_account_irq();
Packit b92951
  3)   0.038 us    |            idle_cpu();
Packit b92951
  3)               |            rcu_irq_exit() {
Packit b92951
  3)   0.038 us    |              rcu_nmi_exit();
Packit b92951
  3)   0.419 us    |            }
Packit b92951
  3)   1.601 us    |          }
Packit b92951
  3)   6.230 us    |        }
Packit b92951
  3)   <========== |
Packit b92951
  3)   0.088 us    |        } /* btf_verifier_log_member */
Packit b92951
  3)   0.041 us    |        btf_verifier_log_member();
Packit b92951
  3) + 10.759 us   |      }
Packit b92951
  3)               |      kvmalloc_node() {
Packit b92951
  3)               |        __kmalloc_node() {
Packit b92951
  3)   0.043 us    |          kmalloc_slab();
Packit b92951
  3)               |          _cond_resched() {
Packit b92951
  3)   0.037 us    |            rcu_all_qs();
Packit b92951
  3)   0.455 us    |          }
Packit b92951
  3)   0.040 us    |          should_failslab();
Packit b92951
  3)   0.037 us    |          memcg_kmem_put_cache();
Packit b92951
  3)   2.227 us    |        }
Packit b92951
  3)   2.624 us    |      } /* kvmalloc_node */
Packit b92951
  3)               |      kvfree() {
Packit b92951
  3)   0.048 us    |        kfree();
Packit b92951
  3)   0.662 us    |      }
Packit b92951
  3)               |      btf_int_check_meta() {
Packit b92951
  3)   0.043 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.457 us    |      }
Packit b92951
  3)               |      btf_array_check_meta() {
Packit b92951
  3)   0.041 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.393 us    |      }
Packit b92951
  3)               |      btf_int_check_meta() {
Packit b92951
  3)   0.094 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.447 us    |      }
Packit b92951
  3)               |      btf_int_check_meta() {
Packit b92951
  3)   0.043 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.573 us    |      }
Packit b92951
  3)               |      btf_int_check_meta() {
Packit b92951
  3)   0.085 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.446 us    |      }
Packit b92951
  3)               |      btf_ref_type_check_meta() {
Packit b92951
  3)   0.042 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.451 us    |      }
Packit b92951
  3)               |      btf_ref_type_check_meta() {
Packit b92951
  3)   0.042 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.427 us    |      }
Packit b92951
  3)               |      btf_ref_type_check_meta() {
Packit b92951
  3)   0.042 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.397 us    |      }
Packit b92951
  3)               |      btf_ref_type_check_meta() {
Packit b92951
  3)   0.041 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.399 us    |      }
Packit b92951
  3)               |      btf_int_check_meta() {
Packit b92951
  3)   0.043 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.602 us    |      }
Packit b92951
  3)               |      btf_ref_type_check_meta() {
Packit b92951
  3)   0.040 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.733 us    |      }
Packit b92951
  3)               |      btf_array_check_meta() {
Packit b92951
  3)   0.094 us    |        __btf_verifier_log_type();
Packit b92951
  3)   0.452 us    |      }
Packit b92951
  3)               |      kvmalloc_node() {
Packit b92951
  3)               |        __kmalloc_node() {
Packit b92951
  3)   0.039 us    |          kmalloc_slab();
Packit b92951
  3)               |          _cond_resched() {
Packit b92951
  3)   0.041 us    |            rcu_all_qs();
Packit b92951
  3)   0.579 us    |          }
Packit b92951
  3)   0.039 us    |          should_failslab();
Packit b92951
  3)   0.042 us    |          memcg_kmem_put_cache();
Packit b92951
  3)   2.538 us    |        }
Packit b92951
  3)   2.886 us    |      }
Packit b92951
  3)               |      kvmalloc_node() {
Packit b92951
  3)               |        __kmalloc_node() {
Packit b92951
  3)   0.041 us    |          kmalloc_slab();
Packit b92951
  3)               |          _cond_resched() {
Packit b92951
  3)   0.038 us    |            rcu_all_qs();
Packit b92951
  3)   0.708 us    |          }
Packit b92951
  3)   0.038 us    |          should_failslab();
Packit b92951
  3)   0.040 us    |          memcg_kmem_put_cache();
Packit b92951
  3)   2.483 us    |        }
Packit b92951
  3)   2.829 us    |      }
Packit b92951
  3)               |      kvmalloc_node() {
Packit b92951
  3)               |        __kmalloc_node() {
Packit b92951
  3)   0.057 us    |          kmalloc_slab();
Packit b92951
  3)               |          _cond_resched() {
Packit b92951
  3)   0.040 us    |            rcu_all_qs();
Packit b92951
  3)   0.533 us    |          }
Packit b92951
  3)   0.039 us    |          should_failslab();
Packit b92951
  3)   0.038 us    |          memcg_kmem_put_cache();
Packit b92951
  3)   2.680 us    |        }
Packit b92951
  3)   3.171 us    |      }
Packit b92951
  3)   0.054 us    |      env_stack_push();
Packit b92951
  3)               |      btf_struct_resolve() {
Packit b92951
  3)   0.051 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.039 us    |        btf_int_check_member();
Packit b92951
  3)   0.039 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.039 us    |        btf_int_check_member();
Packit b92951
  3)   0.040 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.040 us    |        btf_int_check_member();
Packit b92951
  3)   0.039 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.099 us    |        btf_int_check_member();
Packit b92951
  3)   0.040 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.042 us    |        btf_int_check_member();
Packit b92951
  3)   0.040 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.038 us    |        btf_int_check_member();
Packit b92951
  3)   0.038 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.039 us    |        btf_int_check_member();
Packit b92951
  3)   6.545 us    |      }
Packit b92951
  3)   0.053 us    |      env_stack_push();
Packit b92951
  3)               |      btf_array_resolve() {
Packit b92951
  3)   0.039 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.090 us    |        btf_type_id_size();
Packit b92951
  3)   0.060 us    |        btf_type_int_is_regular();
Packit b92951
  3)   0.058 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.051 us    |        btf_type_id_size();
Packit b92951
  3)   0.055 us    |        btf_type_int_is_regular();
Packit b92951
  3)   3.414 us    |      }
Packit b92951
  3)   0.041 us    |      btf_type_id_size();
Packit b92951
  3)   0.057 us    |      env_stack_push();
Packit b92951
  3)               |      btf_ptr_resolve() {
Packit b92951
  3)   0.056 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.054 us    |        env_stack_push();
Packit b92951
  3)   1.056 us    |      }
Packit b92951
  3)   0.063 us    |      btf_ptr_resolve();
Packit b92951
  3)               |      btf_ptr_resolve() {
Packit b92951
  3)   0.049 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.086 us    |        btf_type_id_size();
Packit b92951
  3)   1.052 us    |      }
Packit b92951
  3)   0.045 us    |      env_stack_push();
Packit b92951
  3)   0.060 us    |      btf_ptr_resolve();
Packit b92951
  3)   0.045 us    |      env_stack_push();
Packit b92951
  3)               |      btf_ptr_resolve() {
Packit b92951
  3)   0.039 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.062 us    |        btf_type_id_size();
Packit b92951
  3)   1.325 us    |      }
Packit b92951
  3)   0.054 us    |      env_stack_push();
Packit b92951
  3)               |      btf_modifier_resolve() {
Packit b92951
  3)   0.061 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.043 us    |        btf_type_id_size();
Packit b92951
  3)   0.877 us    |      }
Packit b92951
  3)   0.052 us    |      env_stack_push();
Packit b92951
  3)               |      btf_array_resolve() {
Packit b92951
  3)   0.060 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.051 us    |        btf_type_id_size();
Packit b92951
  3)   0.042 us    |        btf_type_int_is_regular();
Packit b92951
  3)   0.040 us    |        env_type_is_resolve_sink.isra.19();
Packit b92951
  3)   0.042 us    |        btf_type_id_size();
Packit b92951
  3)   0.041 us    |        btf_type_int_is_regular();
Packit b92951
  3)   2.822 us    |      }
Packit b92951
  3)   0.048 us    |      btf_type_id_size();
Packit b92951
  3)               |      kvfree() {
Packit b92951
  3)   0.148 us    |        kfree();
Packit b92951
  3)   0.685 us    |      }
Packit b92951
  3)   0.287 us    |      kfree();
Packit b92951
  3)   0.042 us    |      _raw_spin_lock_bh();
Packit b92951
  3)               |      kmem_cache_alloc() {
Packit b92951
  3)   0.040 us    |        should_failslab();
Packit b92951
  3)   0.111 us    |        prefetch_freepointer();
Packit b92951
  3)   0.094 us    |        memcg_kmem_put_cache();
Packit b92951
  3)   2.139 us    |      }
Packit b92951
  3)               |      _raw_spin_unlock_bh() {
Packit b92951
  3)   0.079 us    |        __local_bh_enable_ip();
Packit b92951
  3)   0.460 us    |      }
Packit b92951
  3)               |      anon_inode_getfd() {
Packit b92951
  3)               |        get_unused_fd_flags() {
Packit b92951
  3)               |          __alloc_fd() {
Packit b92951
  3)   0.040 us    |            _raw_spin_lock();
Packit b92951
  3)   0.041 us    |            expand_files();
Packit b92951
  3)   1.374 us    |          }
Packit b92951
  3)   1.759 us    |        }
Packit b92951
  3)               |        anon_inode_getfile() {
Packit b92951
  3)               |          d_alloc_pseudo() {
Packit b92951
  3)               |            __d_alloc() {
Packit b92951
  3)               |              kmem_cache_alloc() {
Packit b92951
  3)               |                _cond_resched() {
Packit b92951
  3)   0.035 us    |                  rcu_all_qs();
Packit b92951
  3)   0.507 us    |                }
Packit b92951
  3)   0.040 us    |                should_failslab();
Packit b92951
  3)               |                memcg_kmem_get_cache() {
Packit b92951
  3)   0.091 us    |                  get_mem_cgroup_from_mm();
Packit b92951
  3)   0.633 us    |                }
Packit b92951
  3)   0.111 us    |                prefetch_freepointer();
Packit b92951
  3)   0.082 us    |                memcg_kmem_put_cache();
Packit b92951
  3)   4.178 us    |              }
Packit b92951
  3)   0.162 us    |              d_set_d_op();
Packit b92951
  3)   5.545 us    |            }
Packit b92951
  3)   6.270 us    |          }
Packit b92951
  3)   0.112 us    |          mntget();
Packit b92951
  3)   0.125 us    |          ihold();
Packit b92951
  3)               |          d_instantiate() {
Packit b92951
  3)   0.120 us    |            security_d_instantiate();
Packit b92951
  3)   0.106 us    |            _raw_spin_lock();
Packit b92951
  3)               |            __d_instantiate() {
Packit b92951
  3)   0.069 us    |              d_flags_for_inode();
Packit b92951
  3)   0.090 us    |              _raw_spin_lock();
Packit b92951
  3)   1.483 us    |            }
Packit b92951
  3)   2.767 us    |          }
Packit b92951
  3)               |          alloc_file() {
Packit b92951
  3)               |            get_empty_filp() {
Packit b92951
  3)               |              kmem_cache_alloc() {
Packit b92951
  3)               |                _cond_resched() {
Packit b92951
  3)   0.039 us    |                  rcu_all_qs();
Packit b92951
  3)root:x:0:0:root:/root:/bin/bash
Packit b92951
  bin:x:1:1:bin:/bin:/sbin/nologin
Packit b92951
  daemon:x:2:2:daemon:/sbin:/sbin/nologin
Packit b92951
  adm:x:3:4:adm:/var/adm:/sbin/nologin
Packit b92951
  <SNIP rest of /proc/passwd contents>
Packit b92951
    0.382 us    |                }
Packit b92951
  3)   0.040 us    |                should_failslab();
Packit b92951
  3)               |                memcg_kmem_get_cache() {
Packit b92951
  3)   0.039 us    |                  get_mem_cgroup_from_mm();
Packit b92951
  3)   0.626 us    |                }
Packit b92951
  3)   0.050 us    |                prefetch_freepointer();
Packit b92951
  3)   0.059 us    |                memcg_kmem_put_cache();
Packit b92951
  3)   3.280 us    |              }
Packit b92951
  3)               |              security_file_alloc() {
Packit b92951
  3)               |                selinux_file_alloc_security() {
Packit b92951
  3)               |                  kmem_cache_alloc() {
Packit b92951
  3)               |                    _cond_resched() {
Packit b92951
  3)   0.038 us    |                      rcu_all_qs();
Packit b92951
  3)   0.422 us    |                    }
Packit b92951
  3)   0.040 us    |                    should_failslab();
Packit b92951
  3)   0.051 us    |                    prefetch_freepointer();
Packit b92951
  3)   0.054 us    |                    memcg_kmem_put_cache();
Packit b92951
  3)   2.660 us    |                  }
Packit b92951
  3)   3.062 us    |                }
Packit b92951
  3)   3.548 us    |              }
Packit b92951
  3)   0.039 us    |              __mutex_init();
Packit b92951
  3)   8.091 us    |            }
Packit b92951
  3)   8.617 us    |          }
Packit b92951
  3) + 20.810 us   |        }
Packit b92951
  3)               |        fd_install() {
Packit b92951
  3)   0.054 us    |          __fd_install();
Packit b92951
  3)   0.723 us    |        }
Packit b92951
  3) + 24.438 us   |      }
Packit b92951
  3) ! 109.639 us  |    }
Packit b92951
  3) ! 112.925 us  |  }
Packit b92951
  3)               |  btf_release() {
Packit b92951
  3)               |    btf_put() {
Packit b92951
  3)   0.145 us    |      _raw_spin_lock_irqsave();
Packit b92951
  3)               |      call_rcu_sched() {
Packit b92951
  3)               |        __call_rcu() {
Packit b92951
  3)   0.082 us    |          rcu_segcblist_enqueue();
Packit b92951
  3)   1.323 us    |        }
Packit b92951
  3)   1.782 us    |      }
Packit b92951
  3)   0.069 us    |      _raw_spin_unlock_irqrestore();
Packit b92951
  3)               |      call_rcu_sched() {
Packit b92951
  3)               |        __call_rcu() {
Packit b92951
  3)   0.069 us    |          rcu_segcblist_enqueue();
Packit b92951
  3)   0.541 us    |        }
Packit b92951
  3)   0.984 us    |      }
Packit b92951
  3)   5.210 us    |    }
Packit b92951
  3)   5.954 us    |  }
Packit b92951
Packit b92951
This should be enough for us to validate pahole's BTF encoder, and now one can
Packit b92951
use 'pahole -F btf' to obtain mostly the same results as with the default use
Packit b92951
of '-F dwarf', modulo things like explicit alignments that are not present in
Packit b92951
BTF and need some work to be inferred from existing non-natural alignment holes.
Packit b92951
Packit b92951
- Arnaldo