[RFC 00/13] kprobe/bpf: Add support to attach multiple kprobes

Jiri Olsa
2022-01-04T08:09:49Z

hi,
adding support to attach multiple kprobes within single syscall
and speed up attachment of many kprobes.

The previous attempt [1] wasn't fast enough, so coming with new
approach that adds new kprobe interface.

The attachment speed of of this approach (tested in bpftrace)
is now comparable to ftrace tracer attachment speed.. fast ;-)

The limit of this approach is forced by using ftrace as attach
layer, so it allows only kprobes on function's entry (plus
return probes).

This patchset contains:
- kprobes support to register multiple kprobes with current
kprobe API (patches 1 - 8)
- bpf support ot create new kprobe link allowing to attach
multiple addresses (patches 9 - 14)

We don't need to care about multiple probes on same functions
because it's taken care on the ftrace_ops layer.

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

thanks,
jirka

[1] https://lore.kernel.org/bpf/20211124084119.260239-1-jolsa@kernel.org/

---
Jiri Olsa (13):
ftrace: Add ftrace_set_filter_ips function
kprobe: Keep traced function address
kprobe: Add support to register multiple ftrace kprobes
kprobe: Add support to register multiple ftrace kretprobes
kprobe: Allow to get traced function address for multi ftrace kprobes
samples/kprobes: Add support for multi kprobe interface
samples/kprobes: Add support for multi kretprobe interface
bpf: Add kprobe link for attaching raw kprobes
libbpf: Add libbpf__kallsyms_parse function
libbpf: Add bpf_link_create support for multi kprobes
libbpf: Add bpf_program__attach_kprobe_opts for multi kprobes
selftest/bpf: Add raw kprobe attach test
selftest/bpf: Add bpf_cookie test for raw_k[ret]probe

arch/Kconfig | 3 ++
arch/x86/Kconfig | 1 +
arch/x86/kernel/kprobes/ftrace.c | 51 +++++++++++++-----
include/linux/bpf_types.h | 1 +
include/linux/ftrace.h | 3 ++
include/linux/kprobes.h | 55 ++++++++++++++++++++
include/uapi/linux/bpf.h | 12 +++++
kernel/bpf/syscall.c | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
kernel/kprobes.c | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
kernel/trace/bpf_trace.c | 7 ++-
kernel/trace/ftrace.c | 53 +++++++++++++++----
samples/kprobes/kprobe_example.c | 47 +++++++++++++++--
samples/kprobes/kretprobe_example.c | 43 +++++++++++++++-
tools/include/uapi/linux/bpf.h | 12 +++++
tools/lib/bpf/bpf.c | 5 ++
tools/lib/bpf/bpf.h | 7 ++-
tools/lib/bpf/libbpf.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
tools/lib/bpf/libbpf_internal.h | 5 ++
tools/testing/selftests/bpf/prog_tests/bpf_cookie.c | 42 +++++++++++++++
tools/testing/selftests/bpf/prog_tests/raw_kprobe_test.c | 92 +++++++++++++++++++++++++++++++++
tools/testing/selftests/bpf/progs/get_func_ip_test.c | 4 +-
tools/testing/selftests/bpf/progs/raw_kprobe.c | 58 +++++++++++++++++++++
tools/testing/selftests/bpf/progs/test_bpf_cookie.c | 24 ++++++++-
23 files changed, 1062 insertions(+), 104 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/raw_kprobe_test.c
create mode 100644 tools/testing/selftests/bpf/progs/raw_kprobe.c