libbpf: Add the ability to suppress perf event enablement

Automatically enabling a perf event after attaching a BPF prog to it is
not always desirable.

Add a new "dont_enable" field to struct bpf_perf_event_opts. While
introducing "enable" instead would be nicer in that it would avoid
a double negation in the implementation, it would make
DECLARE_LIBBPF_OPTS() less efficient.

Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Suggested-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Co-developed-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Link: https://lore.kernel.org/r/20250806162417.19666-2-iii@linux.ibm.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
pull/1340/head
Ilya Leoshkevich 2025-08-06 18:22:41 +02:00 committed by Alexei Starovoitov
parent 1b30d44417
commit 9474e27a24
2 changed files with 11 additions and 6 deletions

View File

@ -10965,11 +10965,14 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p
} }
link->link.fd = pfd; link->link.fd = pfd;
} }
if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
err = -errno; if (!OPTS_GET(opts, dont_enable, false)) {
pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n", if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
prog->name, pfd, errstr(err)); err = -errno;
goto err_out; pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n",
prog->name, pfd, errstr(err));
goto err_out;
}
} }
return &link->link; return &link->link;

View File

@ -499,9 +499,11 @@ struct bpf_perf_event_opts {
__u64 bpf_cookie; __u64 bpf_cookie;
/* don't use BPF link when attach BPF program */ /* don't use BPF link when attach BPF program */
bool force_ioctl_attach; bool force_ioctl_attach;
/* don't automatically enable the event */
bool dont_enable;
size_t :0; size_t :0;
}; };
#define bpf_perf_event_opts__last_field force_ioctl_attach #define bpf_perf_event_opts__last_field dont_enable
LIBBPF_API struct bpf_link * LIBBPF_API struct bpf_link *
bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd);