Skip to content

Commit e2b0bda

Browse files
Yonghong Songanakryiko
authored andcommitted
libbpf: Add unique_match option for multi kprobe
Jordan reported an issue in Meta production environment where func try_to_wake_up() is renamed to try_to_wake_up.llvm.<hash>() by clang compiler at lto mode. The original 'kprobe/try_to_wake_up' does not work any more since try_to_wake_up() does not match the actual func name in /proc/kallsyms. There are a couple of ways to resolve this issue. For example, in attach_kprobe(), we could do lookup in /proc/kallsyms so try_to_wake_up() can be replaced by try_to_wake_up.llvm.<hach>(). Or we can force users to use bpf_program__attach_kprobe() where they need to lookup /proc/kallsyms to find out try_to_wake_up.llvm.<hach>(). But these two approaches requires extra work by either libbpf or user. Luckily, suggested by Andrii, multi kprobe already supports wildcard ('*') for symbol matching. In the above example, 'try_to_wake_up*' can match to try_to_wake_up() or try_to_wake_up.llvm.<hash>() and this allows bpf prog works for different kernels as some kernels may have try_to_wake_up() and some others may have try_to_wake_up.llvm.<hash>(). The original intention is to kprobe try_to_wake_up() only, so an optional field unique_match is added to struct bpf_kprobe_multi_opts. If the field is set to true, the number of matched functions must be one. Otherwise, the attachment will fail. In the above case, multi kprobe with 'try_to_wake_up*' and unique_match preserves user functionality. Reported-by: Jordan Rome <[email protected]> Suggested-by: Andrii Nakryiko <[email protected]> Signed-off-by: Yonghong Song <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent e8ec1c9 commit e2b0bda

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

tools/lib/bpf/libbpf.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11534,7 +11534,7 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
1153411534
struct bpf_link *link = NULL;
1153511535
const unsigned long *addrs;
1153611536
int err, link_fd, prog_fd;
11537-
bool retprobe, session;
11537+
bool retprobe, session, unique_match;
1153811538
const __u64 *cookies;
1153911539
const char **syms;
1154011540
size_t cnt;
@@ -11553,13 +11553,16 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
1155311553
addrs = OPTS_GET(opts, addrs, false);
1155411554
cnt = OPTS_GET(opts, cnt, false);
1155511555
cookies = OPTS_GET(opts, cookies, false);
11556+
unique_match = OPTS_GET(opts, unique_match, false);
1155611557

1155711558
if (!pattern && !addrs && !syms)
1155811559
return libbpf_err_ptr(-EINVAL);
1155911560
if (pattern && (addrs || syms || cookies || cnt))
1156011561
return libbpf_err_ptr(-EINVAL);
1156111562
if (!pattern && !cnt)
1156211563
return libbpf_err_ptr(-EINVAL);
11564+
if (!pattern && unique_match)
11565+
return libbpf_err_ptr(-EINVAL);
1156311566
if (addrs && syms)
1156411567
return libbpf_err_ptr(-EINVAL);
1156511568

@@ -11570,6 +11573,14 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
1157011573
err = libbpf_available_kallsyms_parse(&res);
1157111574
if (err)
1157211575
goto error;
11576+
11577+
if (unique_match && res.cnt != 1) {
11578+
pr_warn("prog '%s': failed to find a unique match for '%s' (%zu matches)\n",
11579+
prog->name, pattern, res.cnt);
11580+
err = -EINVAL;
11581+
goto error;
11582+
}
11583+
1157311584
addrs = res.addrs;
1157411585
cnt = res.cnt;
1157511586
}

tools/lib/bpf/libbpf.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,10 +552,12 @@ struct bpf_kprobe_multi_opts {
552552
bool retprobe;
553553
/* create session kprobes */
554554
bool session;
555+
/* enforce unique match */
556+
bool unique_match;
555557
size_t :0;
556558
};
557559

558-
#define bpf_kprobe_multi_opts__last_field session
560+
#define bpf_kprobe_multi_opts__last_field unique_match
559561

560562
LIBBPF_API struct bpf_link *
561563
bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,

0 commit comments

Comments
 (0)