Commit Graph

1871 Commits

Author SHA1 Message Date
Arnaldo Carvalho de Melo b99c4008ac core: Make namespace->name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

For the namespace->name case we get the bonus of removing another
user of dwarves__active_loader.

This covers unions, enums, structs and classes.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-12 09:39:46 -03:00
Arnaldo Carvalho de Melo 379a73c6eb core: Make class_member->name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

For the class_member->name case we get the bonus of removing another
user of dwarves__active_loader.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-12 09:39:46 -03:00
Arnaldo Carvalho de Melo 3280cb4176 core: Make parameter->name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

For the parameter->name case we get the bonus of removing a user of
dwarves__active_loader.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-12 09:39:46 -03:00
Arnaldo Carvalho de Melo f009162fd1 core: Make base_type->name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

For the base_type->name case we get the bonus of removing some more
functions related base types and a user of dwarves__active_loader.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-12 09:39:46 -03:00
Arnaldo Carvalho de Melo e2ee753fa7 pahole: Disable incomplete CTF encoder
It was never fully functional and now its getting in the way of further
improvements for loading/encoding BTF and loading DWARF.

Eventually we can use Oracle's libctf library to add an encoder.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-12 09:39:44 -03:00
Arnaldo Carvalho de Melo 0d13bc50ee core: Ditch unused cu__find_struct_by_sname()
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:17 -03:00
Arnaldo Carvalho de Melo 46f3f37241 core: Convert cu__find_base_type_by_sname_and_size to search for a string
It looked for an index into a string table, a string_t, but since for
multithreading we'd be growing the string table while looking up stuff,
we'd be looking at realloc'ed memory, so lets move to stable char
pointer strings.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo f84e8777ea core: Convert cu__find_enumeration_by_sname_and_size to search for a string
It looked for an index into a string table, a string_t, but since for
multithreading we'd be growing the string table while looking up stuff,
we'd be looking at realloc'ed memory, so lets move to stable char
pointer strings.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo a16c82f711 dwarf_loader: Rename strings_t 'name' to 'sname' to clarify usage
We're transitioning to plain strings, so lets pave the way for that
step by step.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 82e5b5101a core: Make function->name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

For the function->name case we get the bonus of removing the need of a
debug_fmt_ops->function() callback receiving the 'cu', just access the
string directly.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 4f73cac853 core: Make function->linkage_name a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo a93160df53 dwarf_loader: Make dwarf_tag->decl_file a real string
For the threaded code we want to access strings in tags at the same time
that the string table may grow in another thread making the previous
pointer invalid, so, to avoid excessive locking, use plain strings.

The way the tools work will either consume the just produced CU straight
away or keep just one copy of each data structure when we keep all CUs
in memory, so lets try stopping using strings_t for strings.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo a3fcbcacf7 pahole: Allow specifying the number of threads to use while loading files
Using the same command line option as 'make' and 'ninja': -j.
Unfortunately the argp parser in glibc expects a '=' for single letter
args, so it is:

  $ pahole -j=10

or, like with 'make':

  $ make --jobs=10

This is unwired at the moment, probably I'll reorder the patch, but for
testing, add it first.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo d70b2562ee pahole: Make '-j' available for use as number of jobs (threads)
The '-j' option, to generate detached BTF files wasn't published in any
tagged release, so leave it as just --btf_encode_detached and make '-j'
available for specifying the number of jobs/threads, as is the case with
'make -j', 'ninja -j', etc.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 41a283c65d core: Protect cus->cus with a mutex
Paving the way for having multiple threads creating CUs and possibly
adding them to cus->cus.

The mutex will also be used to ask elfutils-libdwfl to read the next CU,
after a thread finishes reading one.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 972065482a core: Make 'struct cus' opaque, only visible in dwarves.c
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 3895b29060 core: Introduce helper to return number of cu entries in a 'struct cus'
Provide a helper so that we can make 'struct cus' opaque.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 874e750fb8 core: Move cus__find_pair() from codiff to the core
To avoid touching 'struct cus' internal state outside dwarves.c

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo bf74fc1fcf core: Introduce helper to return if there is no cu entries in a 'struct cus'
Provide a helper so that we can make 'struct cus' opaque.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 7020f92143 core: Prepare cus__find_cu_by_name() for locking
By having just one exit point.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 4bf7285b37 core: Prepare cus__find_function_at_addr() for locking
By having just one exit point.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 73a2fd1e5a core: Prepare __cus__find_struct_by_name() for locking
By having just one exit point.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo 5020bf721b core: Prepare cus__find_type_by_name() for locking
By having just one exit point.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:18:16 -03:00
Arnaldo Carvalho de Melo d124926baf core: Initialize cu->priv in cu__new()
cus__load_btf() may bail out if btf__parse_split() fails, for instance
when processing a malformed detached BTF file, and then call
cu__delete(cu) that in turn calls btf__cu_delete(cu->priv), and as
cu->priv wasn't initialized, a segfault ensues.

Fix it by initializing cu->priv in cu__new().

This fix was in the 'next'/'tmp.master' branch and was also found and
fixed by Thomas Weißschuh <thomas@t-8ch.de>.

Link: https://git.kernel.org/pub/scm/devel/pahole/pahole.git/commit/?h=tmp.master&id=e9f3028efbeff225d8ced3c0bfa9fe82857b0a14
Link: https://lore.kernel.org/dwarves/20210728175459.143265-1-thomas@t-8ch.de/
Reported-by: Thomas Weißschuh <thomas@t-8ch.de>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-28 15:13:08 -03:00
Arnaldo Carvalho de Melo 3ec54ee72f CMakeList.txt: Bump version to the upcoming 1.22 release, not out of the door yet
This is just for CIs to be able to, building from master, encode
variables, that are disabled in the Linux kernel but fixed with what
came after v1.21.

Requested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-07-27 13:28:19 -03:00
Arnaldo Carvalho de Melo 1ef87b26fd Revert "btf_encoder: Reduce the size of encode_cu() by moving function encoding to separate method"
This reverts commit de3a7f9125.

Andrii reports that this cset is breaking the CI, as reported at:

  https://travis-ci.com/github/libbpf/libbpf/jobs/514329152

So revert it while investigation about the root cause continues.

Reported-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-16 21:07:22 -03:00
Arnaldo Carvalho de Melo 7869cc113b dwarf_loader: Separate non-LTO per CU processing + BTF encoding part
So that we can on from there to a multi-threaded CU loading + BTF
encoding.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-15 18:10:01 -03:00
Arnaldo Carvalho de Melo de3a7f9125 btf_encoder: Reduce the size of encode_cu() by moving function encoding to separate method
Just to make code more manageable, no change intended.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-15 15:12:00 -03:00
Arnaldo Carvalho de Melo d348b37ed1 btf_encoder: Reduce the size of encode_cu() by moving var encoding to separate method
Just to make code more manageable, no change intended.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-15 15:07:41 -03:00
Arnaldo Carvalho de Melo f62196d3be btf_encoder: No need to set the endianness twice when encoding into an ELF file
We do it already at the constructor.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 819f83bd97 btf_encoder: Pass detached_filename to the constructor
The ->filename only points out to the ELF file when we're not writing to
a raw, detached BTF file, so reuse it to store the detached filename
when using that mode.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 7ed4ddc468 btf_encoder: Adopt writing to raw file method
To stop using the btf__ namespace.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 1498094d33 btf_encoder: Rename btf__encode_in_elf to btf_encoder__write_elf, shortening function signature
We were passing two 'btf_encoder' fields, so pass just the btf_encoder
instance. Ditch the unused 'flags' arg.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo cd2b8978c4 btf_encoder: Combine btf__write_elf() with btf__encode_in_elf()
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 18a3e9711c btf_encoder: Move duplicate code to btf_encoder__encode()
Out of the raw and ELF output routines.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 9eb3d7a29d btf_encoder: Pass the 'skip_encoding_vars' to the constructor
Instead of repeatedly passing it to btf_encoder__encode_cu().

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Arnaldo Carvalho de Melo 707101ec38 btf_encoder: No need to export the 'struct btf_definition', make it opaque
Only in btf_encoder.c we use its fields, so move everything there.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 18:53:35 -03:00
Luca Boccassi f1feaa94c7 libbpf: bump dependency to >= 0.4.0
Required for the new API btf__add_float().

Signed-off-by: Luca Boccassi <bluca@debian.org>
Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 15:33:57 -03:00
Luca Boccassi 1b50808c29 libbpf: If LIBBPF_EMBEDDED=OFF and libbpf-dev/pkgconfig is not available, fail the build
If using the system library was explicitly requested, ensure it is present
and fail the build if it is not, rather than falling back to the
embedded version (same for pkg-config).

Signed-off-by: Luca Boccassi <bluca@debian.org>
Requested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-14 15:33:55 -03:00
Arnaldo Carvalho de Melo 790dfbda79 headers: Rebame __unused to __maybe_unused to avoid clashes with system headers
Andrii reported that __unused is a field in /usr/include/bits/stat.h and
vmlinux.h (generated by bpftool), so use the Linux kernel jargon for
this and rename it to '__maybe_unused'.

Reported-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-13 10:25:35 -03:00
Luca Boccassi 82756ea3ea libbpf: Fixup patch to allow to use packaged version
The original "libbpf: allow to use packaged version" had a symlink as
suggested during review, that got mistakenly dropped by Arnaldo when
applying the patch by hand to fixup conflicts, add it back.

Committer notes:

This caused mixups with libbpf-devel files that ended up breaking the
build as reported by Andrii.

Reported-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Tested-by: Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Luca Boccassi <bluca@debian.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-13 10:22:21 -03:00
Deepak Kumar Mishra ba953a53be README: Add documentation for -DBUILD_SHARED_LIBS
Added a section in README to give details about use of
-DBUILD_SHARED_LIBS cmake option and existing documentation reformatted
to accommodate this.

Signed-off-by: Deepak Kumar Mishra <deepakkumar.mishra@arm.com>
Cc: Qais Yousef <qais.yousef@arm.com>
Cc: dwarves@vger.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-10 14:31:44 -03:00
Deepak Kumar Mishra aa20277086 CMakeLists.txt: Enable SHARED and STATIC lib creation
CMakeLists.txt does not allow creation of static library and link applications
accordingly.

Creation of SHARED and STATIC should be allowed using -DBUILD_SHARED_LIBS
If -DBUILD_SHARED_LIBS option is not supplied, CMakeLists.txt sets it to ON.

Ex:

  $ cmake -D__LIB=lib -DBUILD_SHARED_LIBS=OFF ..
  $ cmake -D__LIB=lib -DBUILD_SHARED_LIBS=ON ..

Committer testing:

I had to fixup it a bit due to changes related to allowing building with
libbpf-devel, test resuts:

With the default, i.e. creating libdwarves.so and using it:

  ⬢[acme@toolbox pahole]$ rm -f vmlinux.btf ; perf stat -r5 pahole -j vmlinux.btf vmlinux && perf stat -r5 btfdiff vmlinux vmlinux.btf

   Performance counter stats for 'pahole -j vmlinux.btf vmlinux' (5 runs):

            8,612.69 msec task-clock:u              #    1.014 CPUs utilized            ( +-  0.68% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             775,702      page-faults:u             #   91.330 K/sec                    ( +-  0.00% )
      33,720,048,514      cycles:u                  #    3.970 GHz                      ( +-  0.38% )  (83.33%)
         689,752,139      stalled-cycles-frontend:u #    2.05% frontend cycles idle     ( +-  2.57% )  (83.33%)
       5,070,723,369      stalled-cycles-backend:u  #   15.04% backend cycles idle      ( +-  1.20% )  (83.34%)
      77,270,640,084      instructions:u            #    2.29  insn per cycle
                                                    #    0.07  stalled cycles per insn  ( +-  0.01% )  (83.34%)
      18,164,028,242      branches:u                #    2.139 G/sec                    ( +-  0.04% )  (83.33%)
         150,194,338      branch-misses:u           #    0.83% of all branches          ( +-  0.17% )  (83.32%)

              8.4979 +- 0.0590 seconds time elapsed  ( +-  0.69% )

   Performance counter stats for 'btfdiff vmlinux vmlinux.btf' (5 runs):

            7,001.79 msec task-clock:u              #    1.006 CPUs utilized            ( +-  1.02% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             727,980      page-faults:u             #  104.736 K/sec                    ( +-  0.00% )
      26,912,307,448      cycles:u                  #    3.872 GHz                      ( +-  0.31% )  (83.33%)
         509,467,882      stalled-cycles-frontend:u #    1.90% frontend cycles idle     ( +-  2.44% )  (83.33%)
       3,602,777,263      stalled-cycles-backend:u  #   13.43% backend cycles idle      ( +-  1.34% )  (83.32%)
      66,192,815,701      instructions:u            #    2.47  insn per cycle
                                                    #    0.06  stalled cycles per insn  ( +-  0.01% )  (83.35%)
      15,753,663,095      branches:u                #    2.267 G/sec                    ( +-  0.02% )  (83.35%)
          98,345,696      branch-misses:u           #    0.62% of all branches          ( +-  0.14% )  (83.34%)

              6.9586 +- 0.0720 seconds time elapsed  ( +-  1.03% )

  ⬢[acme@toolbox pahole]$

Then building with:

  ⬢[acme@toolbox pahole]$ rm -rf build ; mkdir build ; cd build ; cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release .. ; cd .. ; make -C build
  ⬢[acme@toolbox pahole]$ ldd build/pahole
	linux-vdso.so.1 (0x00007ffff0172000)
	libdw.so.1 => /lib64/libdw.so.1 (0x00007fdd3905d000)
	libelf.so.1 => /lib64/libelf.so.1 (0x00007fdd39042000)
	libz.so.1 => /lib64/libz.so.1 (0x00007fdd39028000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fdd38e59000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fdd38e52000)
	libzstd.so.1 => /lib64/libzstd.so.1 (0x00007fdd38d5c000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fdd38d2e000)
	libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fdd38d1b000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdd38cfa000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fdd390ff000)
  ⬢[acme@toolbox pahole]$

We get some performance improvement:

- First is encoding detached BTF, i.e. read DWARF, generate BTF.
- Second is about loading both DWARF and BTF, producing output for both, that must match.

  ⬢[acme@toolbox pahole]$ rm -f vmlinux.btf ; perf stat -r5 pahole -j vmlinux.btf vmlinux && perf stat -r5 btfdiff vmlinux vmlinux.btf

   Performance counter stats for 'pahole -j vmlinux.btf vmlinux' (5 runs):

            8,566.34 msec task-clock:u              #    1.025 CPUs utilized            ( +-  0.85% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             775,685      page-faults:u             #   92.865 K/sec                    ( +-  0.00% )
      33,333,991,512      cycles:u                  #    3.991 GHz                      ( +-  0.23% )  (83.34%)
         799,187,919      stalled-cycles-frontend:u #    2.42% frontend cycles idle     ( +-  1.95% )  (83.33%)
       5,157,722,792      stalled-cycles-backend:u  #   15.61% backend cycles idle      ( +-  1.25% )  (83.33%)
      76,273,972,066      instructions:u            #    2.31  insn per cycle
                                                    #    0.07  stalled cycles per insn  ( +-  0.03% )  (83.33%)
      17,843,388,470      branches:u                #    2.136 G/sec                    ( +-  0.05% )  (83.33%)
         150,507,690      branch-misses:u           #    0.84% of all branches          ( +-  0.46% )  (83.33%)

              8.3561 +- 0.0729 seconds time elapsed  ( +-  0.87% )

   Performance counter stats for 'btfdiff vmlinux vmlinux.btf' (5 runs):

            6,685.39 msec task-clock:u              #    0.986 CPUs utilized            ( +-  0.54% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             727,931      page-faults:u             #  107.475 K/sec                    ( +-  0.00% )
      26,149,371,139      cycles:u                  #    3.861 GHz                      ( +-  0.15% )  (83.36%)
         525,918,808      stalled-cycles-frontend:u #    2.00% frontend cycles idle     ( +-  2.96% )  (83.33%)
       3,547,589,546      stalled-cycles-backend:u  #   13.51% backend cycles idle      ( +-  1.28% )  (83.35%)
      65,389,507,702      instructions:u            #    2.49  insn per cycle
                                                    #    0.06  stalled cycles per insn  ( +-  0.03% )  (83.29%)
      15,553,175,605      branches:u                #    2.296 G/sec                    ( +-  0.02% )  (83.34%)
          97,812,971      branch-misses:u           #    0.63% of all branches          ( +-  0.23% )  (83.34%)

              6.7784 +- 0.0359 seconds time elapsed  ( +-  0.53% )

  ⬢[acme@toolbox pahole]$

Signed-off-by: Deepak Kumar Mishra <deepakkumar.mishra@arm.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-10 14:23:25 -03:00
Luca Boccassi ae2581647e libbpf: Allow to use packaged version
Add a new CMake option, LIBBPF_EMBEDDED, to switch between the embedded
version and the system version (searched via pkg-config) of libbpf. Set
the embedded version as the default.

Committer testing:

The default build works as before:

  ⬢[acme@toolbox pahole]$ rm -rf build ; mkdir build ; cd build ; cmake -DCMAKE_BUILD_TYPE=Release .. ; cd ..
  -- The C compiler identification is GNU 11.1.1
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - done
  -- Check for working C compiler: /usr/bin/cc - skipped
  -- Detecting C compile features
  -- Detecting C compile features - done
  -- Checking availability of DWARF and ELF development libraries
  -- Looking for dwfl_module_build_id in elf
  -- Looking for dwfl_module_build_id in elf - found
  -- Found dwarf.h header: /usr/include
  -- Found elfutils/libdw.h header: /usr/include
  -- Found libdw library: /usr/lib64/libdw.so
  -- Found libelf library: /usr/lib64/libelf.so
  -- Checking availability of DWARF and ELF development libraries - done
  -- Found ZLIB: /usr/lib64/libz.so (found version "1.2.11")
  -- Submodule update
  -- Submodule update - done
  -- Performing Test HAVE_REALLOCARRAY_SUPPORT
  -- Performing Test HAVE_REALLOCARRAY_SUPPORT - Success
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /var/home/acme/git/pahole/build
  ⬢[acme@toolbox pahole]$ make -j28 -C build
  make: Entering directory '/var/home/acme/git/pahole/build'
  make[1]: Entering directory '/var/home/acme/git/pahole/build'
  make[2]: Entering directory '/var/home/acme/git/pahole/build'
  Scanning dependencies of target bpf
  make[2]: Leaving directory '/var/home/acme/git/pahole/build'
  make[2]: Entering directory '/var/home/acme/git/pahole/build'
  [  5%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/btf.c.o
  [  5%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/bpf_prog_linfo.c.o
  [  5%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/bpf.c.o
  [  7%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/libbpf_errno.c.o
  <SNIP>
  make[2]: Leaving directory '/var/home/acme/git/pahole/build'
  [ 98%] Built target ctracer
  [100%] Linking C executable pahole
  make[2]: Leaving directory '/var/home/acme/git/pahole/build'
  [100%] Built target pahole
  make[1]: Leaving directory '/var/home/acme/git/pahole/build'
  make: Leaving directory '/var/home/acme/git/pahole/build'
  ⬢[acme@toolbox pahole]$ ldd build/pahole
  	linux-vdso.so.1 (0x00007ffcf4d92000)
  	libdwarves_reorganize.so.1 => /var/home/acme/git/pahole/build/libdwarves_reorganize.so.1 (0x00007f059c289000)
  	libdwarves.so.1 => /var/home/acme/git/pahole/build/libdwarves.so.1 (0x00007f059c226000)
  	libdw.so.1 => /lib64/libdw.so.1 (0x00007f059c186000)
  	libelf.so.1 => /lib64/libelf.so.1 (0x00007f059c16b000)
  	libz.so.1 => /lib64/libz.so.1 (0x00007f059c151000)
  	libc.so.6 => /lib64/libc.so.6 (0x00007f059bf82000)
  	libdl.so.2 => /lib64/libdl.so.2 (0x00007f059bf79000)
  	libzstd.so.1 => /lib64/libzstd.so.1 (0x00007f059be83000)
  	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f059be57000)
  	libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f059be44000)
  	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f059be23000)
  	/lib64/ld-linux-x86-64.so.2 (0x00007f059c290000)
  ⬢[acme@toolbox pahole]$

Then, trying to use the libbpf-devel present in Fedora 34:

  ⬢[acme@toolbox pahole]$ rm -rf build ; mkdir build ; cd build ; cmake -DCMAKE_BUILD_TYPE=Release -DLIBBPF_EMBEDDED=Off .. ; cd ..
  -- The C compiler identification is GNU 11.1.1
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - done
  -- Check for working C compiler: /usr/bin/cc - skipped
  -- Detecting C compile features
  -- Detecting C compile features - done
  -- Found PkgConfig: /usr/bin/pkg-config (found version "1.7.3")
  -- Checking for module 'libbpf>=0.3.0'
  --   Found libbpf, version 0.3.0
  -- Checking availability of DWARF and ELF development libraries
  -- Looking for dwfl_module_build_id in elf
  -- Looking for dwfl_module_build_id in elf - found
  -- Found dwarf.h header: /usr/include
  -- Found elfutils/libdw.h header: /usr/include
  -- Found libdw library: /usr/lib64/libdw.so
  -- Found libelf library: /usr/lib64/libelf.so
  -- Checking availability of DWARF and ELF development libraries - done
  -- Found ZLIB: /usr/lib64/libz.so (found version "1.2.11")
  -- Submodule update
  -- Submodule update - done
  -- Performing Test HAVE_REALLOCARRAY_SUPPORT
  -- Performing Test HAVE_REALLOCARRAY_SUPPORT - Success
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /var/home/acme/git/pahole/build
  ⬢[acme@toolbox pahole]$ m
  make: Entering directory '/var/home/acme/git/pahole/build'
  make[1]: Entering directory '/var/home/acme/git/pahole/build'
  make[2]: Entering directory '/var/home/acme/git/pahole/build'
  Scanning dependencies of target dwarves
  make[2]: Leaving directory '/var/home/acme/git/pahole/build'
  make[2]: Entering directory '/var/home/acme/git/pahole/build'
  [  2%] Building C object CMakeFiles/dwarves.dir/dwarves.c.o
  [  5%] Building C object CMakeFiles/dwarves.dir/dwarves_fprintf.c.o
  [  7%] Building C object CMakeFiles/dwarves.dir/gobuffer.c.o
  <SNIP>
  [ 33%] Building C object CMakeFiles/dwarves.dir/rbtree.c.o
  /var/home/acme/git/pahole/btf_encoder.c:84:10: error: ‘BTF_KIND_FLOAT’ undeclared here (not in a function); did you mean ‘BTF_KIND_INT’?
     84 |         [BTF_KIND_FLOAT]        = "FLOAT",
        |          ^~~~~~~~~~~~~~
        |          BTF_KIND_INT
  /var/home/acme/git/pahole/btf_encoder.c:84:10: error: array index in initializer not of integer type
  /var/home/acme/git/pahole/btf_encoder.c:84:10: note: (near initialization for ‘btf_kind_str’)
  /var/home/acme/git/pahole/btf_encoder.c:84:35: warning: excess elements in array initializer
     84 |         [BTF_KIND_FLOAT]        = "FLOAT",
        |                                   ^~~~~~~
  /var/home/acme/git/pahole/btf_encoder.c:84:35: note: (near initialization for ‘btf_kind_str’)
  /var/home/acme/git/pahole/btf_encoder.c: In function ‘btf_encoder__add_float’:
  /var/home/acme/git/pahole/btf_encoder.c:224:22: warning: implicit declaration of function ‘btf__add_float’; did you mean ‘btf__add_var’? [-Wimplicit-function-declaration]
    224 |         int32_t id = btf__add_float(encoder->btf, name, BITS_ROUNDUP_BYTES(bt->bit_size));
        |                      ^~~~~~~~~~~~~~
        |                      btf__add_var
  /var/home/acme/git/pahole/btf_loader.c: In function ‘btf__load_types’:
  /var/home/acme/git/pahole/btf_loader.c:455:22: error: ‘BTF_KIND_FLOAT’ undeclared (first use in this function); did you mean ‘BTF_KIND_INT’?
    455 |                 case BTF_KIND_FLOAT:
        |                      ^~~~~~~~~~~~~~
        |                      BTF_KIND_INT
  /var/home/acme/git/pahole/btf_loader.c:455:22: note: each undeclared identifier is reported only once for each function it appears in
  make[2]: *** [CMakeFiles/dwarves.dir/build.make:173: CMakeFiles/dwarves.dir/btf_encoder.c.o] Error 1
  make[2]: *** Waiting for unfinished jobs....
  make[2]: *** [CMakeFiles/dwarves.dir/build.make:186: CMakeFiles/dwarves.dir/btf_loader.c.o] Error 1
  make[2]: Leaving directory '/var/home/acme/git/pahole/build'
  make[1]: *** [CMakeFiles/Makefile2:173: CMakeFiles/dwarves.dir/all] Error 2
  make[1]: Leaving directory '/var/home/acme/git/pahole/build'
  make: *** [Makefile:149: all] Error 2
  make: Leaving directory '/var/home/acme/git/pahole/build'
  ⬢[acme@toolbox pahole]$

It doesn't build as libbpf is old and doesn't have support for
BTF_KIND_FLOAT.

Signed-off-by: Luca Boccassi <bluca@debian.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: dwarves@vger.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 13:34:18 -03:00
Arnaldo Carvalho de Melo 743f2536d8 btf_encoder: Move libbtf.c to btf_encoder.c, the only user of its functions
All those functions now operate on a 'struct btf_encoder' object, there
is no need to make them visible outside the btf_encoder.c source file,
so move them all there and make them static.

This leads to some savings as the compiler is free to optimize further,
inlining stuff used in just one place, etc:

Before, for encoding then reading we have:

  ⬢[acme@toolbox pahole]$ rm -f vmlinux.btf ; perf stat -r5 pahole -j vmlinux.btf vmlinux && perf stat -r5 btfdiff vmlinux vmlinux.btf

   Performance counter stats for 'pahole -j vmlinux.btf vmlinux' (5 runs):

            8,546.56 msec task-clock:u              #    0.989 CPUs utilized            ( +-  0.71% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             775,699      page-faults:u             #   89.802 K/sec                    ( +-  0.00% )
      34,082,471,148      cycles:u                  #    3.946 GHz                      ( +-  0.22% )  (83.33%)
         636,039,662      stalled-cycles-frontend:u #    1.87% frontend cycles idle     ( +-  1.69% )  (83.33%)
       4,895,524,778      stalled-cycles-backend:u  #   14.38% backend cycles idle      ( +-  2.10% )  (83.33%)
      77,379,632,646      instructions:u            #    2.27  insn per cycle
                                                    #    0.07  stalled cycles per insn  ( +-  0.04% )  (83.33%)
      18,185,560,802      branches:u                #    2.105 G/sec                    ( +-  0.03% )  (83.34%)
         149,715,849      branch-misses:u           #    0.82% of all branches          ( +-  0.15% )  (83.34%)

              8.6412 +- 0.0612 seconds time elapsed  ( +-  0.71% )

   Performance counter stats for 'btfdiff vmlinux vmlinux.btf' (5 runs):

            7,168.97 msec task-clock:u              #    1.016 CPUs utilized            ( +-  0.50% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             727,965      page-faults:u             #  103.257 K/sec                    ( +-  0.00% )
      27,339,019,686      cycles:u                  #    3.878 GHz                      ( +-  0.17% )  (83.28%)
         511,689,773      stalled-cycles-frontend:u #    1.88% frontend cycles idle     ( +-  1.84% )  (83.34%)
       3,677,090,126      stalled-cycles-backend:u  #   13.53% backend cycles idle      ( +-  1.47% )  (83.35%)
      66,182,032,226      instructions:u            #    2.44  insn per cycle
                                                    #    0.06  stalled cycles per insn  ( +-  0.02% )  (83.35%)
      15,747,149,247      branches:u                #    2.234 G/sec                    ( +-  0.02% )  (83.36%)
          98,013,024      branch-misses:u           #    0.62% of all branches          ( +-  0.21% )  (83.33%)

              7.0554 +- 0.0357 seconds time elapsed  ( +-  0.51% )

  ⬢[acme@toolbox pahole]$

Then, with this patch:

  ⬢[acme@toolbox pahole]$ rm -f vmlinux.btf ; perf stat -r5 pahole -j vmlinux.btf vmlinux && perf stat -r5 btfdiff vmlinux vmlinux.btf

   Performance counter stats for 'pahole -j vmlinux.btf vmlinux' (5 runs):

            8,280.48 msec task-clock:u              #    0.975 CPUs utilized            ( +-  0.72% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             775,699      page-faults:u             #   91.481 K/sec                    ( +-  0.00% )
      33,265,078,702      cycles:u                  #    3.923 GHz                      ( +-  0.32% )  (83.32%)
         725,690,346      stalled-cycles-frontend:u #    2.16% frontend cycles idle     ( +-  1.76% )  (83.34%)
       4,803,211,469      stalled-cycles-backend:u  #   14.33% backend cycles idle      ( +-  2.43% )  (83.34%)
      77,162,277,929      instructions:u            #    2.30  insn per cycle
                                                    #    0.07  stalled cycles per insn  ( +-  0.06% )  (83.34%)
      18,139,715,894      branches:u                #    2.139 G/sec                    ( +-  0.03% )  (83.34%)
         149,609,552      branch-misses:u           #    0.82% of all branches          ( +-  0.16% )  (83.33%)

              8.4921 +- 0.0630 seconds time elapsed  ( +-  0.74% )

   Performance counter stats for 'btfdiff vmlinux vmlinux.btf' (5 runs):

            7,018.11 msec task-clock:u              #    1.013 CPUs utilized            ( +-  0.68% )
                   0      context-switches:u        #    0.000 /sec
                   0      cpu-migrations:u          #    0.000 /sec
             727,949      page-faults:u             #  105.207 K/sec                    ( +-  0.00% )
      26,632,191,985      cycles:u                  #    3.849 GHz                      ( +-  0.31% )  (83.35%)
         496,648,058      stalled-cycles-frontend:u #    1.87% frontend cycles idle     ( +-  2.02% )  (83.29%)
       3,437,243,040      stalled-cycles-backend:u  #   12.92% backend cycles idle      ( +-  0.90% )  (83.33%)
      66,192,034,237      instructions:u            #    2.49  insn per cycle
                                                    #    0.05  stalled cycles per insn  ( +-  0.03% )  (83.34%)
      15,750,883,004      branches:u                #    2.276 G/sec                    ( +-  0.03% )  (83.35%)
          97,544,298      branch-misses:u           #    0.62% of all branches          ( +-  0.12% )  (83.36%)

              6.9247 +- 0.0478 seconds time elapsed  ( +-  0.69% )

  ⬢[acme@toolbox pahole]$

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 13:34:15 -03:00
Arnaldo Carvalho de Melo 6f72dddbed btf_encoder: Move PERCPU_SECTION define to the only source file using it
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 10:56:36 -03:00
Arnaldo Carvalho de Melo f0f5b4f2bc btf_encoder: Move library global variable btf_gen_floats to btf_encoder class
So this should be the last global variable in the BTF encoder, good
riddance!

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 10:54:10 -03:00
Arnaldo Carvalho de Melo 09970b03bd btf_encoder: Ditch unused 'btf_encoder__verbose' global variable
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 10:46:52 -03:00
Arnaldo Carvalho de Melo 1bf2e3511a btf_encoder: Use encoder->verbose instead of btf_encoder__verbose
Its available, has the same value, use the per-instance 'verbose' member
instead of the global, this should be the last use of that global, time
to ditch it.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 10:46:49 -03:00
Arnaldo Carvalho de Melo 4ffa484b6a btf_encoder: Adopt btf__log_func_param() and use encoder->verbose
This will eventually allow us to remove one more global variable,
btf_encoder__verbose.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-06-09 10:46:46 -03:00