Skip to content

Commit 91cbdf7

Browse files
anakryikoAlexei Starovoitov
authored andcommitted
selftests/bpf: Fix perf_buffer test on systems w/ offline CPUs
Fix up perf_buffer.c selftest to take into account offline/missing CPUs. Fixes: ee5cf82 ("selftests/bpf: test perf buffer API") Signed-off-by: Andrii Nakryiko <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 783b8f0 commit 91cbdf7

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

tools/testing/selftests/bpf/prog_tests/perf_buffer.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <sched.h>
55
#include <sys/socket.h>
66
#include <test_progs.h>
7+
#include "libbpf_internal.h"
78

89
static void on_sample(void *ctx, int cpu, void *data, __u32 size)
910
{
@@ -19,7 +20,7 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size)
1920

2021
void test_perf_buffer(void)
2122
{
22-
int err, prog_fd, nr_cpus, i, duration = 0;
23+
int err, prog_fd, on_len, nr_on_cpus = 0, nr_cpus, i, duration = 0;
2324
const char *prog_name = "kprobe/sys_nanosleep";
2425
const char *file = "./test_perf_buffer.o";
2526
struct perf_buffer_opts pb_opts = {};
@@ -29,15 +30,27 @@ void test_perf_buffer(void)
2930
struct bpf_object *obj;
3031
struct perf_buffer *pb;
3132
struct bpf_link *link;
33+
bool *online;
3234

3335
nr_cpus = libbpf_num_possible_cpus();
3436
if (CHECK(nr_cpus < 0, "nr_cpus", "err %d\n", nr_cpus))
3537
return;
3638

39+
err = parse_cpu_mask_file("/sys/devices/system/cpu/online",
40+
&online, &on_len);
41+
if (CHECK(err, "nr_on_cpus", "err %d\n", err))
42+
return;
43+
44+
for (i = 0; i < on_len; i++)
45+
if (online[i])
46+
nr_on_cpus++;
47+
3748
/* load program */
3849
err = bpf_prog_load(file, BPF_PROG_TYPE_KPROBE, &obj, &prog_fd);
39-
if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno))
40-
return;
50+
if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) {
51+
obj = NULL;
52+
goto out_close;
53+
}
4154

4255
prog = bpf_object__find_program_by_title(obj, prog_name);
4356
if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name))
@@ -64,6 +77,11 @@ void test_perf_buffer(void)
6477
/* trigger kprobe on every CPU */
6578
CPU_ZERO(&cpu_seen);
6679
for (i = 0; i < nr_cpus; i++) {
80+
if (i >= on_len || !online[i]) {
81+
printf("skipping offline CPU #%d\n", i);
82+
continue;
83+
}
84+
6785
CPU_ZERO(&cpu_set);
6886
CPU_SET(i, &cpu_set);
6987

@@ -81,8 +99,8 @@ void test_perf_buffer(void)
8199
if (CHECK(err < 0, "perf_buffer__poll", "err %d\n", err))
82100
goto out_free_pb;
83101

84-
if (CHECK(CPU_COUNT(&cpu_seen) != nr_cpus, "seen_cpu_cnt",
85-
"expect %d, seen %d\n", nr_cpus, CPU_COUNT(&cpu_seen)))
102+
if (CHECK(CPU_COUNT(&cpu_seen) != nr_on_cpus, "seen_cpu_cnt",
103+
"expect %d, seen %d\n", nr_on_cpus, CPU_COUNT(&cpu_seen)))
86104
goto out_free_pb;
87105

88106
out_free_pb:
@@ -91,4 +109,5 @@ void test_perf_buffer(void)
91109
bpf_link__destroy(link);
92110
out_close:
93111
bpf_object__close(obj);
112+
free(online);
94113
}

0 commit comments

Comments
 (0)