4
4
#include <sched.h>
5
5
#include <sys/socket.h>
6
6
#include <test_progs.h>
7
+ #include "libbpf_internal.h"
7
8
8
9
static void on_sample (void * ctx , int cpu , void * data , __u32 size )
9
10
{
@@ -19,7 +20,7 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size)
19
20
20
21
void test_perf_buffer (void )
21
22
{
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 ;
23
24
const char * prog_name = "kprobe/sys_nanosleep" ;
24
25
const char * file = "./test_perf_buffer.o" ;
25
26
struct perf_buffer_opts pb_opts = {};
@@ -29,15 +30,27 @@ void test_perf_buffer(void)
29
30
struct bpf_object * obj ;
30
31
struct perf_buffer * pb ;
31
32
struct bpf_link * link ;
33
+ bool * online ;
32
34
33
35
nr_cpus = libbpf_num_possible_cpus ();
34
36
if (CHECK (nr_cpus < 0 , "nr_cpus" , "err %d\n" , nr_cpus ))
35
37
return ;
36
38
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
+
37
48
/* load program */
38
49
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
+ }
41
54
42
55
prog = bpf_object__find_program_by_title (obj , prog_name );
43
56
if (CHECK (!prog , "find_probe" , "prog '%s' not found\n" , prog_name ))
@@ -64,6 +77,11 @@ void test_perf_buffer(void)
64
77
/* trigger kprobe on every CPU */
65
78
CPU_ZERO (& cpu_seen );
66
79
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
+
67
85
CPU_ZERO (& cpu_set );
68
86
CPU_SET (i , & cpu_set );
69
87
@@ -81,8 +99,8 @@ void test_perf_buffer(void)
81
99
if (CHECK (err < 0 , "perf_buffer__poll" , "err %d\n" , err ))
82
100
goto out_free_pb ;
83
101
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 )))
86
104
goto out_free_pb ;
87
105
88
106
out_free_pb :
@@ -91,4 +109,5 @@ void test_perf_buffer(void)
91
109
bpf_link__destroy (link );
92
110
out_close :
93
111
bpf_object__close (obj );
112
+ free (online );
94
113
}
0 commit comments