perf test bpf: Hook on epoll_pwait()

The 'perf test bpf' was hooking a eBPF program on the SyS_epoll_wait()
kernel function, that was what the epoll_wait() glibc function ended up
calling, but since at least glibc 2.26, the one that comes with, for
instance, Fedora 27, glibc ends up calling SyS_epoll_pwait() when
epoll_wait() is used, causing this 'perf test' entry to fail.

So switch to using epoll_pwait() and hook the eBPF program to the
SyS_epoll_pwait() kernel function to make it work on a wider range of
glibc and kernel versions.
Tested-by: default avatarWang Nan <wangnan0@huawei.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-zynvquy63er8s5mrgsz65pto@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 13cb2d0f
...@@ -31,8 +31,8 @@ struct bpf_map_def SEC("maps") flip_table = { ...@@ -31,8 +31,8 @@ struct bpf_map_def SEC("maps") flip_table = {
.max_entries = 1, .max_entries = 1,
}; };
SEC("func=SyS_epoll_wait") SEC("func=SyS_epoll_pwait")
int bpf_func__SyS_epoll_wait(void *ctx) int bpf_func__SyS_epoll_pwait(void *ctx)
{ {
int ind =0; int ind =0;
int *flag = bpf_map_lookup_elem(&flip_table, &ind); int *flag = bpf_map_lookup_elem(&flip_table, &ind);
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
#ifdef HAVE_LIBBPF_SUPPORT #ifdef HAVE_LIBBPF_SUPPORT
static int epoll_wait_loop(void) static int epoll_pwait_loop(void)
{ {
int i; int i;
/* Should fail NR_ITERS times */ /* Should fail NR_ITERS times */
for (i = 0; i < NR_ITERS; i++) for (i = 0; i < NR_ITERS; i++)
epoll_wait(-(i + 1), NULL, 0, 0); epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
return 0; return 0;
} }
...@@ -68,7 +68,7 @@ static struct { ...@@ -68,7 +68,7 @@ static struct {
.name = "[basic_bpf_test]", .name = "[basic_bpf_test]",
.msg_compile_fail = "fix 'perf test LLVM' first", .msg_compile_fail = "fix 'perf test LLVM' first",
.msg_load_fail = "load bpf object failed", .msg_load_fail = "load bpf object failed",
.target_func = &epoll_wait_loop, .target_func = &epoll_pwait_loop,
.expect_result = (NR_ITERS + 1) / 2, .expect_result = (NR_ITERS + 1) / 2,
}, },
{ {
...@@ -77,7 +77,7 @@ static struct { ...@@ -77,7 +77,7 @@ static struct {
.name = "[bpf_pinning]", .name = "[bpf_pinning]",
.msg_compile_fail = "fix kbuild first", .msg_compile_fail = "fix kbuild first",
.msg_load_fail = "check your vmlinux setting?", .msg_load_fail = "check your vmlinux setting?",
.target_func = &epoll_wait_loop, .target_func = &epoll_pwait_loop,
.expect_result = (NR_ITERS + 1) / 2, .expect_result = (NR_ITERS + 1) / 2,
.pin = true, .pin = true,
}, },
......
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