Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libbpf: Add uprobe multi link detection

Adding uprobe-multi link detection. It will be used later in
bpf_program__attach_usdt function to check and use uprobe_multi
link over standard uprobe links.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/r/20230809083440.3209381-17-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Jiri Olsa and committed by
Alexei Starovoitov
7e1b4681 5bfdd32d

+38
+36
tools/lib/bpf/libbpf.c
··· 4829 4829 return link_fd < 0 && err == -EBADF; 4830 4830 } 4831 4831 4832 + static int probe_uprobe_multi_link(void) 4833 + { 4834 + LIBBPF_OPTS(bpf_prog_load_opts, load_opts, 4835 + .expected_attach_type = BPF_TRACE_UPROBE_MULTI, 4836 + ); 4837 + LIBBPF_OPTS(bpf_link_create_opts, link_opts); 4838 + struct bpf_insn insns[] = { 4839 + BPF_MOV64_IMM(BPF_REG_0, 0), 4840 + BPF_EXIT_INSN(), 4841 + }; 4842 + int prog_fd, link_fd, err; 4843 + unsigned long offset = 0; 4844 + 4845 + prog_fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", 4846 + insns, ARRAY_SIZE(insns), &load_opts); 4847 + if (prog_fd < 0) 4848 + return -errno; 4849 + 4850 + /* Creating uprobe in '/' binary should fail with -EBADF. */ 4851 + link_opts.uprobe_multi.path = "/"; 4852 + link_opts.uprobe_multi.offsets = &offset; 4853 + link_opts.uprobe_multi.cnt = 1; 4854 + 4855 + link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_UPROBE_MULTI, &link_opts); 4856 + err = -errno; /* close() can clobber errno */ 4857 + 4858 + if (link_fd >= 0) 4859 + close(link_fd); 4860 + close(prog_fd); 4861 + 4862 + return link_fd < 0 && err == -EBADF; 4863 + } 4864 + 4832 4865 static int probe_kern_bpf_cookie(void) 4833 4866 { 4834 4867 struct bpf_insn insns[] = { ··· 4957 4924 }, 4958 4925 [FEAT_SYSCALL_WRAPPER] = { 4959 4926 "Kernel using syscall wrapper", probe_kern_syscall_wrapper, 4927 + }, 4928 + [FEAT_UPROBE_MULTI_LINK] = { 4929 + "BPF multi-uprobe link support", probe_uprobe_multi_link, 4960 4930 }, 4961 4931 }; 4962 4932
+2
tools/lib/bpf/libbpf_internal.h
··· 355 355 FEAT_BTF_ENUM64, 356 356 /* Kernel uses syscall wrapper (CONFIG_ARCH_HAS_SYSCALL_WRAPPER) */ 357 357 FEAT_SYSCALL_WRAPPER, 358 + /* BPF multi-uprobe link support */ 359 + FEAT_UPROBE_MULTI_LINK, 358 360 __FEAT_CNT, 359 361 }; 360 362