Commit a3d697ff authored by Alexei Starovoitov's avatar Alexei Starovoitov

Merge branch 'libbpf: add legacy uprobe support'

Andrii Nakryiko says:

====================

Implement libbpf support for attaching uprobes/uretprobes using legacy
tracefs interfaces. This is a logical complement to recently landed legacy
kprobe support ([0]). This patch refactors existing legacy kprobe code to be more
uniform with uprobe code as well, making the logic easier to compare and
follow.

This patch set also fixes two bugs recently found by Coverity in legacy kprobe
handling code, and thus subsumes previously submitted two patches ([1]):
original patch #1 is kept as is, while original patch #2 was dropped because
patch #3 of the current series refactors and fixes affected code.

  [0] https://patchwork.kernel.org/project/netdevbpf/patch/20210912064844.3181742-1-rafaeldtinoco@gmail.com/
  [1] https://patchwork.kernel.org/project/netdevbpf/list/?series=549977&state=*

v1->v2:
  - drop 'legacy = true' debug left-over and explain legacy check (Alexei).
====================
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents cf8980a3 cc10623c
This diff is collapsed.
...@@ -269,7 +269,7 @@ struct bpf_kprobe_opts { ...@@ -269,7 +269,7 @@ struct bpf_kprobe_opts {
/* custom user-provided value fetchable through bpf_get_attach_cookie() */ /* custom user-provided value fetchable through bpf_get_attach_cookie() */
__u64 bpf_cookie; __u64 bpf_cookie;
/* function's offset to install kprobe to */ /* function's offset to install kprobe to */
unsigned long offset; size_t offset;
/* kprobe is return probe */ /* kprobe is return probe */
bool retprobe; bool retprobe;
size_t :0; size_t :0;
......
...@@ -14,6 +14,20 @@ void test_attach_probe(void) ...@@ -14,6 +14,20 @@ void test_attach_probe(void)
struct test_attach_probe* skel; struct test_attach_probe* skel;
size_t uprobe_offset; size_t uprobe_offset;
ssize_t base_addr, ref_ctr_offset; ssize_t base_addr, ref_ctr_offset;
bool legacy;
/* Check if new-style kprobe/uprobe API is supported.
* Kernels that support new FD-based kprobe and uprobe BPF attachment
* through perf_event_open() syscall expose
* /sys/bus/event_source/devices/kprobe/type and
* /sys/bus/event_source/devices/uprobe/type files, respectively. They
* contain magic numbers that are passed as "type" field of
* perf_event_attr. Lack of such file in the system indicates legacy
* kernel with old-style kprobe/uprobe attach interface through
* creating per-probe event through tracefs. For such cases
* ref_ctr_offset feature is not supported, so we don't test it.
*/
legacy = access("/sys/bus/event_source/devices/kprobe/type", F_OK) != 0;
base_addr = get_base_addr(); base_addr = get_base_addr();
if (CHECK(base_addr < 0, "get_base_addr", if (CHECK(base_addr < 0, "get_base_addr",
...@@ -45,10 +59,11 @@ void test_attach_probe(void) ...@@ -45,10 +59,11 @@ void test_attach_probe(void)
goto cleanup; goto cleanup;
skel->links.handle_kretprobe = kretprobe_link; skel->links.handle_kretprobe = kretprobe_link;
ASSERT_EQ(uprobe_ref_ctr, 0, "uprobe_ref_ctr_before"); if (!legacy)
ASSERT_EQ(uprobe_ref_ctr, 0, "uprobe_ref_ctr_before");
uprobe_opts.retprobe = false; uprobe_opts.retprobe = false;
uprobe_opts.ref_ctr_offset = ref_ctr_offset; uprobe_opts.ref_ctr_offset = legacy ? 0 : ref_ctr_offset;
uprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uprobe, uprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uprobe,
0 /* self pid */, 0 /* self pid */,
"/proc/self/exe", "/proc/self/exe",
...@@ -58,11 +73,12 @@ void test_attach_probe(void) ...@@ -58,11 +73,12 @@ void test_attach_probe(void)
goto cleanup; goto cleanup;
skel->links.handle_uprobe = uprobe_link; skel->links.handle_uprobe = uprobe_link;
ASSERT_GT(uprobe_ref_ctr, 0, "uprobe_ref_ctr_after"); if (!legacy)
ASSERT_GT(uprobe_ref_ctr, 0, "uprobe_ref_ctr_after");
/* if uprobe uses ref_ctr, uretprobe has to use ref_ctr as well */ /* if uprobe uses ref_ctr, uretprobe has to use ref_ctr as well */
uprobe_opts.retprobe = true; uprobe_opts.retprobe = true;
uprobe_opts.ref_ctr_offset = ref_ctr_offset; uprobe_opts.ref_ctr_offset = legacy ? 0 : ref_ctr_offset;
uretprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uretprobe, uretprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uretprobe,
-1 /* any pid */, -1 /* any pid */,
"/proc/self/exe", "/proc/self/exe",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment