mbox series

[PATCHv7,bpf-next,00/28] bpf: Add multi uprobe link

Message ID 20230809083440.3209381-1-jolsa@kernel.org (mailing list archive)
Headers show
Series bpf: Add multi uprobe link | expand

Message

Jiri Olsa Aug. 9, 2023, 8:34 a.m. UTC
hi,
this patchset is adding support to attach multiple uprobes and usdt probes
through new uprobe_multi link.

The current uprobe is attached through the perf event and attaching many
uprobes takes a lot of time because of that.

The main reason is that we need to install perf event for each probed function
and profile shows perf event installation (perf_install_in_context) as culprit.

The new uprobe_multi link just creates raw uprobes and attaches the bpf
program to them without perf event being involved.

In addition to being faster we also save file descriptors. For the current
uprobe attach we use extra perf event fd for each probed function. The new
link just need one fd that covers all the functions we are attaching to.

v7 changes:
  - fixed task release on error path and re-org the error
    path to be more straightforward [Yonghong]
  - re-organized uprobe_prog_run locking to follow general pattern
    and removed might_fault check as it's not needed in uprobe/task
    context [Yonghong]


There's support for bpftrace [2] and tetragon [1].

Also available at:
  https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  uprobe_multi

thanks,
jirka


[1] https://github.com/cilium/tetragon/pull/936
[2] https://github.com/iovisor/bpftrace/compare/master...olsajiri:bpftrace:uprobe_multi
[3] https://lore.kernel.org/bpf/20230628115329.248450-1-laoar.shao@gmail.com/
---
Jiri Olsa (28):
      bpf: Switch BPF_F_KPROBE_MULTI_RETURN macro to enum
      bpf: Add attach_type checks under bpf_prog_attach_check_attach_type
      bpf: Add multi uprobe link
      bpf: Add cookies support for uprobe_multi link
      bpf: Add pid filter support for uprobe_multi link
      bpf: Add bpf_get_func_ip helper support for uprobe link
      libbpf: Add uprobe_multi attach type and link names
      libbpf: Move elf_find_func_offset* functions to elf object
      libbpf: Add elf_open/elf_close functions
      libbpf: Add elf symbol iterator
      libbpf: Add elf_resolve_syms_offsets function
      libbpf: Add elf_resolve_pattern_offsets function
      libbpf: Add bpf_link_create support for multi uprobes
      libbpf: Add bpf_program__attach_uprobe_multi function
      libbpf: Add support for u[ret]probe.multi[.s] program sections
      libbpf: Add uprobe multi link detection
      libbpf: Add uprobe multi link support to bpf_program__attach_usdt
      selftests/bpf: Move get_time_ns to testing_helpers.h
      selftests/bpf: Add uprobe_multi skel test
      selftests/bpf: Add uprobe_multi api test
      selftests/bpf: Add uprobe_multi link test
      selftests/bpf: Add uprobe_multi test program
      selftests/bpf: Add uprobe_multi bench test
      selftests/bpf: Add uprobe_multi usdt test code
      selftests/bpf: Add uprobe_multi usdt bench test
      selftests/bpf: Add uprobe_multi cookie test
      selftests/bpf: Add uprobe_multi pid filter tests
      selftests/bpf: Add extra link to uprobe_multi tests

 include/linux/trace_events.h                               |   6 ++
 include/uapi/linux/bpf.h                                   |  22 ++++-
 kernel/bpf/syscall.c                                       | 134 ++++++++++++++--------------
 kernel/trace/bpf_trace.c                                   | 342 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 tools/include/uapi/linux/bpf.h                             |  22 ++++-
 tools/lib/bpf/Build                                        |   2 +-
 tools/lib/bpf/bpf.c                                        |  11 +++
 tools/lib/bpf/bpf.h                                        |  11 ++-
 tools/lib/bpf/elf.c                                        | 440 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/lib/bpf/libbpf.c                                     | 388 ++++++++++++++++++++++++++++++++++++++++++---------------------------------------
 tools/lib/bpf/libbpf.h                                     |  51 +++++++++++
 tools/lib/bpf/libbpf.map                                   |   1 +
 tools/lib/bpf/libbpf_internal.h                            |  21 +++++
 tools/lib/bpf/usdt.c                                       | 116 ++++++++++++++++--------
 tools/testing/selftests/bpf/Makefile                       |   5 ++
 tools/testing/selftests/bpf/bench.h                        |   9 --
 tools/testing/selftests/bpf/prog_tests/bpf_cookie.c        |  78 +++++++++++++++++
 tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c |   8 --
 tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c | 415 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/testing/selftests/bpf/progs/uprobe_multi.c           | 101 +++++++++++++++++++++
 tools/testing/selftests/bpf/progs/uprobe_multi_bench.c     |  15 ++++
 tools/testing/selftests/bpf/progs/uprobe_multi_usdt.c      |  16 ++++
 tools/testing/selftests/bpf/testing_helpers.h              |  10 +++
 tools/testing/selftests/bpf/uprobe_multi.c                 |  91 +++++++++++++++++++
 24 files changed, 1992 insertions(+), 323 deletions(-)
 create mode 100644 tools/lib/bpf/elf.c
 create mode 100644 tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
 create mode 100644 tools/testing/selftests/bpf/progs/uprobe_multi.c
 create mode 100644 tools/testing/selftests/bpf/progs/uprobe_multi_bench.c
 create mode 100644 tools/testing/selftests/bpf/progs/uprobe_multi_usdt.c
 create mode 100644 tools/testing/selftests/bpf/uprobe_multi.c

Comments

patchwork-bot+netdevbpf@kernel.org Aug. 21, 2023, 11 p.m. UTC | #1
Hello:

This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:

On Wed,  9 Aug 2023 10:34:12 +0200 you wrote:
> hi,
> this patchset is adding support to attach multiple uprobes and usdt probes
> through new uprobe_multi link.
> 
> The current uprobe is attached through the perf event and attaching many
> uprobes takes a lot of time because of that.
> 
> [...]

Here is the summary with links:
  - [PATCHv7,bpf-next,01/28] bpf: Switch BPF_F_KPROBE_MULTI_RETURN macro to enum
    https://git.kernel.org/bpf/bpf-next/c/c5487f8d9186
  - [PATCHv7,bpf-next,02/28] bpf: Add attach_type checks under bpf_prog_attach_check_attach_type
    https://git.kernel.org/bpf/bpf-next/c/3505cb9fa26c
  - [PATCHv7,bpf-next,03/28] bpf: Add multi uprobe link
    https://git.kernel.org/bpf/bpf-next/c/89ae89f53d20
  - [PATCHv7,bpf-next,04/28] bpf: Add cookies support for uprobe_multi link
    https://git.kernel.org/bpf/bpf-next/c/0b779b61f651
  - [PATCHv7,bpf-next,05/28] bpf: Add pid filter support for uprobe_multi link
    https://git.kernel.org/bpf/bpf-next/c/b733eeade420
  - [PATCHv7,bpf-next,06/28] bpf: Add bpf_get_func_ip helper support for uprobe link
    https://git.kernel.org/bpf/bpf-next/c/686328d80c43
  - [PATCHv7,bpf-next,07/28] libbpf: Add uprobe_multi attach type and link names
    https://git.kernel.org/bpf/bpf-next/c/8097e460cabd
  - [PATCHv7,bpf-next,08/28] libbpf: Move elf_find_func_offset* functions to elf object
    https://git.kernel.org/bpf/bpf-next/c/5c742725045a
  - [PATCHv7,bpf-next,09/28] libbpf: Add elf_open/elf_close functions
    https://git.kernel.org/bpf/bpf-next/c/f90eb70d4489
  - [PATCHv7,bpf-next,10/28] libbpf: Add elf symbol iterator
    https://git.kernel.org/bpf/bpf-next/c/3774705db171
  - [PATCHv7,bpf-next,11/28] libbpf: Add elf_resolve_syms_offsets function
    https://git.kernel.org/bpf/bpf-next/c/7ace84c68929
  - [PATCHv7,bpf-next,12/28] libbpf: Add elf_resolve_pattern_offsets function
    https://git.kernel.org/bpf/bpf-next/c/e613d1d0f7d4
  - [PATCHv7,bpf-next,13/28] libbpf: Add bpf_link_create support for multi uprobes
    https://git.kernel.org/bpf/bpf-next/c/5054a303f896
  - [PATCHv7,bpf-next,14/28] libbpf: Add bpf_program__attach_uprobe_multi function
    https://git.kernel.org/bpf/bpf-next/c/3140cf121c25
  - [PATCHv7,bpf-next,15/28] libbpf: Add support for u[ret]probe.multi[.s] program sections
    https://git.kernel.org/bpf/bpf-next/c/5bfdd32dd575
  - [PATCHv7,bpf-next,16/28] libbpf: Add uprobe multi link detection
    https://git.kernel.org/bpf/bpf-next/c/7e1b46812345
  - [PATCHv7,bpf-next,17/28] libbpf: Add uprobe multi link support to bpf_program__attach_usdt
    https://git.kernel.org/bpf/bpf-next/c/5902da6d8a52
  - [PATCHv7,bpf-next,18/28] selftests/bpf: Move get_time_ns to testing_helpers.h
    https://git.kernel.org/bpf/bpf-next/c/3830d04a7401
  - [PATCHv7,bpf-next,19/28] selftests/bpf: Add uprobe_multi skel test
    https://git.kernel.org/bpf/bpf-next/c/75b3715720d7
  - [PATCHv7,bpf-next,20/28] selftests/bpf: Add uprobe_multi api test
    https://git.kernel.org/bpf/bpf-next/c/ffc68903617a
  - [PATCHv7,bpf-next,21/28] selftests/bpf: Add uprobe_multi link test
    https://git.kernel.org/bpf/bpf-next/c/a93d22ea6092
  - [PATCHv7,bpf-next,22/28] selftests/bpf: Add uprobe_multi test program
    https://git.kernel.org/bpf/bpf-next/c/519dfeaf5119
  - [PATCHv7,bpf-next,23/28] selftests/bpf: Add uprobe_multi bench test
    https://git.kernel.org/bpf/bpf-next/c/3706919ee05f
  - [PATCHv7,bpf-next,24/28] selftests/bpf: Add uprobe_multi usdt test code
    https://git.kernel.org/bpf/bpf-next/c/4cde2d8aa7f7
  - [PATCHv7,bpf-next,25/28] selftests/bpf: Add uprobe_multi usdt bench test
    https://git.kernel.org/bpf/bpf-next/c/85209e839fc2
  - [PATCHv7,bpf-next,26/28] selftests/bpf: Add uprobe_multi cookie test
    https://git.kernel.org/bpf/bpf-next/c/e7cf9a48f8d6
  - [PATCHv7,bpf-next,27/28] selftests/bpf: Add uprobe_multi pid filter tests
    https://git.kernel.org/bpf/bpf-next/c/d571efae0f1d
  - [PATCHv7,bpf-next,28/28] selftests/bpf: Add extra link to uprobe_multi tests
    https://git.kernel.org/bpf/bpf-next/c/8909a9392b41

You are awesome, thank you!