From: Hengqi Chen <hengqi.chen@gmail.com>
To: Andrii Nakryiko <andrii@kernel.org>,
bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net
Cc: kernel-team@fb.com, Alan Maguire <alan.maguire@oracle.com>,
Dave Marchevsky <davemarchevsky@fb.com>
Subject: Re: [PATCH v3 bpf-next 0/7] Add libbpf support for USDTs
Date: Tue, 5 Apr 2022 21:23:58 +0800 [thread overview]
Message-ID: <278c1ba7-13c8-c83f-9b74-489d10f4fb4b@gmail.com> (raw)
In-Reply-To: <20220404234202.331384-1-andrii@kernel.org>
On 2022/4/5 7:41 AM, Andrii Nakryiko wrote:
> Add libbpf support for USDT (User Statically-Defined Tracing) probes.
> USDTs is important part of tracing, and BPF, ecosystem, widely used in
> mission-critical production applications for observability, performance
> analysis, and debugging.
>
> And while USDTs themselves are pretty complicated abstraction built on top of
> uprobes, for end-users USDT is as natural a primitive as uprobes themselves.
> And thus it's important for libbpf to provide best possible user experience
> when it comes to build tracing applications relying on USDTs.
>
> USDTs historically presented a lot of challenges for libbpf's no
> compilation-on-the-fly general approach to BPF tracing. BCC utilizes power of
> on-the-fly source code generation and compilation using its embedded Clang
> toolchain, which was impractical for more lightweight and thus more rigid
> libbpf-based approach. But still, with enough diligence and BPF cookies it's
> possible to implement USDT support that feels as natural as tracing any
> uprobe.
>
> This patch set is the culmination of such effort to add libbpf USDT support
> following the spirit and philosophy of BPF CO-RE (even though it's not
> inherently relying on BPF CO-RE much, see patch #1 for some notes regarding
> this). Each respective patch has enough details and explanations, so I won't
> go into details here.
>
> In the end, I think the overall usability of libbpf's USDT support *exceeds*
> the status quo set by BCC due to the elimination of awkward runtime USDT
> supporting code generation. It also exceeds BCC's capabilities due to the use
> of BPF cookie. This eliminates the need to determine a USDT call site (and
> thus specifics about how exactly to fetch arguments) based on its *absolute IP
> address*, which is impossible with shared libraries if no PID is specified (as
> we then just *can't* know absolute IP at which shared library is loaded,
> because it might be different for each process). With BPF cookie this is not
> a problem as we record "call site ID" directly in a BPF cookie value. This
> makes it possible to do a system-wide tracing of a USDT defined in a shared
> library. Think about tracing some USDT in libc across any process in the
> system, both running at the time of attachment and all the new processes
> started *afterwards*. This is a very powerful capability that allows more
> efficient observability and tracing tooling.
>
> Once this functionality lands, the plan is to extend libbpf-bootstrap ([0])
> with an USDT example. It will also become possible to start converting BCC
> tools that rely on USDTs to their libbpf-based counterparts ([1]).
>
> It's worth noting that preliminary version of this code was currently used and
> tested in production code running fleet-wide observability toolkit.
>
> Libbpf functionality is broken down into 5 mostly logically independent parts,
> for ease of reviewing:
> - patch #1 adds BPF-side implementation;
> - patch #2 adds user-space APIs and wires bpf_link for USDTs;
> - patch #3 adds the most mundate pieces: handling ELF, parsing USDT notes,
> dealing with memory segments, relative vs absolute addresses, etc;
> - patch #4 adds internal ID allocation and setting up/tearing down of
> BPF-side state (spec and IP-to-ID mapping);
> - patch #5 implements x86/x86-64-specific logic of parsing USDT argument
> specifications;
> - patch #6 adds testing of various basic aspects of handling of USDT;
> - patch #7 extends the set of tests with more combinations of semaphore,
> executable vs shared library, and PID filter options.
>
> [0] https://github.com/libbpf/libbpf-bootstrap
> [1] https://github.com/iovisor/bcc/tree/master/libbpf-tools
>
> v2->v3:
> - fix typos, leave link to systemtap doc, acks, etc (Dave);
> - include sys/sdt.h to avoid extra system-wide package dependencies;
> v1->v2:
> - huge high-level comment describing how all the moving parts fit together
> (Alan, Alexei);
> - switched from `__hidden __weak` to `static inline __noinline` for now, as
> there is a bug in BPF linker breaking final BPF object file due to invalid
> .BTF.ext data; I want to fix it separately at which point I'll switch back
> to __hidden __weak again. The fix isn't trivial, so I don't want to block
> on that. Same for __weak variable lookup bug that Henqi reported.
> - various fixes and improvements, addressing other feedback (Alan, Hengqi);
>
> Cc: Alan Maguire <alan.maguire@oracle.com>
> Cc: Dave Marchevsky <davemarchevsky@fb.com>
> Cc: Hengqi Chen <hengqi.chen@gmail.com>
>
> Andrii Nakryiko (7):
> libbpf: add BPF-side of USDT support
> libbpf: wire up USDT API and bpf_link integration
> libbpf: add USDT notes parsing and resolution logic
> libbpf: wire up spec management and other arch-independent USDT logic
> libbpf: add x86-specific USDT arg spec parsing logic
> selftests/bpf: add basic USDT selftests
> selftests/bpf: add urandom_read shared lib and USDTs
>
> tools/lib/bpf/Build | 3 +-
> tools/lib/bpf/Makefile | 2 +-
> tools/lib/bpf/libbpf.c | 115 +-
> tools/lib/bpf/libbpf.h | 31 +
> tools/lib/bpf/libbpf.map | 1 +
> tools/lib/bpf/libbpf_internal.h | 19 +
> tools/lib/bpf/usdt.bpf.h | 256 ++++
> tools/lib/bpf/usdt.c | 1280 +++++++++++++++++
> tools/testing/selftests/bpf/Makefile | 25 +-
> tools/testing/selftests/bpf/prog_tests/usdt.c | 421 ++++++
> .../selftests/bpf/progs/test_urandom_usdt.c | 70 +
> tools/testing/selftests/bpf/progs/test_usdt.c | 96 ++
> .../selftests/bpf/progs/test_usdt_multispec.c | 32 +
> tools/testing/selftests/bpf/sdt-config.h | 6 +
> tools/testing/selftests/bpf/sdt.h | 513 +++++++
> tools/testing/selftests/bpf/urandom_read.c | 63 +-
> .../testing/selftests/bpf/urandom_read_aux.c | 9 +
> .../testing/selftests/bpf/urandom_read_lib1.c | 13 +
> .../testing/selftests/bpf/urandom_read_lib2.c | 8 +
> 19 files changed, 2938 insertions(+), 25 deletions(-)
> create mode 100644 tools/lib/bpf/usdt.bpf.h
> create mode 100644 tools/lib/bpf/usdt.c
> create mode 100644 tools/testing/selftests/bpf/prog_tests/usdt.c
> create mode 100644 tools/testing/selftests/bpf/progs/test_urandom_usdt.c
> create mode 100644 tools/testing/selftests/bpf/progs/test_usdt.c
> create mode 100644 tools/testing/selftests/bpf/progs/test_usdt_multispec.c
> create mode 100644 tools/testing/selftests/bpf/sdt-config.h
> create mode 100644 tools/testing/selftests/bpf/sdt.h
> create mode 100644 tools/testing/selftests/bpf/urandom_read_aux.c
> create mode 100644 tools/testing/selftests/bpf/urandom_read_lib1.c
> create mode 100644 tools/testing/selftests/bpf/urandom_read_lib2.c
>
For the first 5 patches:
Reviewed-by: Hengqi Chen <hengqi.chen@gmail.com>
Tested-by: Hengqi Chen <hengqi.chen@gmail.com>
Hengqi
next prev parent reply other threads:[~2022-04-05 19:53 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-04 23:41 [PATCH v3 bpf-next 0/7] Add libbpf support for USDTs Andrii Nakryiko
2022-04-04 23:41 ` [PATCH v3 bpf-next 1/7] libbpf: add BPF-side of USDT support Andrii Nakryiko
2022-04-05 1:05 ` Dave Marchevsky
2022-04-07 14:19 ` Ilya Leoshkevich
2022-04-07 23:27 ` Andrii Nakryiko
2022-04-04 23:41 ` [PATCH v3 bpf-next 2/7] libbpf: wire up USDT API and bpf_link integration Andrii Nakryiko
2022-04-04 23:41 ` [PATCH v3 bpf-next 3/7] libbpf: add USDT notes parsing and resolution logic Andrii Nakryiko
2022-04-04 23:41 ` [PATCH v3 bpf-next 4/7] libbpf: wire up spec management and other arch-independent USDT logic Andrii Nakryiko
2022-04-04 23:42 ` [PATCH v3 bpf-next 5/7] libbpf: add x86-specific USDT arg spec parsing logic Andrii Nakryiko
2022-04-06 17:23 ` Andrii Nakryiko
2022-04-06 22:49 ` Ilya Leoshkevich
2022-04-06 23:15 ` Andrii Nakryiko
2022-04-08 14:16 ` Alan Maguire
2022-04-08 16:17 ` Andrii Nakryiko
2022-04-04 23:42 ` [PATCH v3 bpf-next 6/7] selftests/bpf: add basic USDT selftests Andrii Nakryiko
2022-04-04 23:42 ` [PATCH v3 bpf-next 7/7] selftests/bpf: add urandom_read shared lib and USDTs Andrii Nakryiko
2022-04-05 13:23 ` Hengqi Chen [this message]
2022-04-05 20:30 ` [PATCH v3 bpf-next 0/7] Add libbpf support for USDTs patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=278c1ba7-13c8-c83f-9b74-489d10f4fb4b@gmail.com \
--to=hengqi.chen@gmail.com \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davemarchevsky@fb.com \
--cc=kernel-team@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox