18
18
#include <libbpf.h>
19
19
#include "bpf_load.h"
20
20
#include "perf-sys.h"
21
- #include "trace_helpers.h"
22
-
23
- static int pmu_fd ;
24
21
25
22
static __u64 time_get_ns (void )
26
23
{
@@ -31,12 +28,12 @@ static __u64 time_get_ns(void)
31
28
}
32
29
33
30
static __u64 start_time ;
31
+ static __u64 cnt ;
34
32
35
33
#define MAX_CNT 100000ll
36
34
37
- static int print_bpf_output (void * data , int size )
35
+ static void print_bpf_output (void * ctx , int cpu , void * data , __u32 size )
38
36
{
39
- static __u64 cnt ;
40
37
struct {
41
38
__u64 pid ;
42
39
__u64 cookie ;
@@ -45,38 +42,22 @@ static int print_bpf_output(void *data, int size)
45
42
if (e -> cookie != 0x12345678 ) {
46
43
printf ("BUG pid %llx cookie %llx sized %d\n" ,
47
44
e -> pid , e -> cookie , size );
48
- return LIBBPF_PERF_EVENT_ERROR ;
45
+ return ;
49
46
}
50
47
51
48
cnt ++ ;
52
49
53
50
if (cnt == MAX_CNT ) {
54
51
printf ("recv %lld events per sec\n" ,
55
52
MAX_CNT * 1000000000ll / (time_get_ns () - start_time ));
56
- return LIBBPF_PERF_EVENT_DONE ;
53
+ return ;
57
54
}
58
-
59
- return LIBBPF_PERF_EVENT_CONT ;
60
- }
61
-
62
- static void test_bpf_perf_event (void )
63
- {
64
- struct perf_event_attr attr = {
65
- .sample_type = PERF_SAMPLE_RAW ,
66
- .type = PERF_TYPE_SOFTWARE ,
67
- .config = PERF_COUNT_SW_BPF_OUTPUT ,
68
- };
69
- int key = 0 ;
70
-
71
- pmu_fd = sys_perf_event_open (& attr , -1 /*pid*/ , 0 /*cpu*/ , -1 /*group_fd*/ , 0 );
72
-
73
- assert (pmu_fd >= 0 );
74
- assert (bpf_map_update_elem (map_fd [0 ], & key , & pmu_fd , BPF_ANY ) == 0 );
75
- ioctl (pmu_fd , PERF_EVENT_IOC_ENABLE , 0 );
76
55
}
77
56
78
57
int main (int argc , char * * argv )
79
58
{
59
+ struct perf_buffer_opts pb_opts = {};
60
+ struct perf_buffer * pb ;
80
61
char filename [256 ];
81
62
FILE * f ;
82
63
int ret ;
@@ -88,16 +69,20 @@ int main(int argc, char **argv)
88
69
return 1 ;
89
70
}
90
71
91
- test_bpf_perf_event ();
92
-
93
- if (perf_event_mmap (pmu_fd ) < 0 )
72
+ pb_opts .sample_cb = print_bpf_output ;
73
+ pb = perf_buffer__new (map_fd [0 ], 8 , & pb_opts );
74
+ ret = libbpf_get_error (pb );
75
+ if (ret ) {
76
+ printf ("failed to setup perf_buffer: %d\n" , ret );
94
77
return 1 ;
78
+ }
95
79
96
80
f = popen ("taskset 1 dd if=/dev/zero of=/dev/null" , "r" );
97
81
(void ) f ;
98
82
99
83
start_time = time_get_ns ();
100
- ret = perf_event_poller (pmu_fd , print_bpf_output );
84
+ while ((ret = perf_buffer__poll (pb , 1000 )) >= 0 && cnt < MAX_CNT ) {
85
+ }
101
86
kill (0 , SIGINT );
102
87
return ret ;
103
88
}
0 commit comments