17
17
#include <linux/if_link.h>
18
18
19
19
#include "perf-sys.h"
20
- #include "trace_helpers.h"
21
20
22
21
#define MAX_CPUS 128
23
- static int pmu_fds [MAX_CPUS ], if_idx ;
24
- static struct perf_event_mmap_page * headers [MAX_CPUS ];
22
+ static int if_idx ;
25
23
static char * if_name ;
26
24
static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST ;
27
25
static __u32 prog_id ;
26
+ static struct perf_buffer * pb = NULL ;
28
27
29
28
static int do_attach (int idx , int fd , const char * name )
30
29
{
@@ -73,7 +72,7 @@ static int do_detach(int idx, const char *name)
73
72
74
73
#define SAMPLE_SIZE 64
75
74
76
- static int print_bpf_output (void * data , int size )
75
+ static void print_bpf_output (void * ctx , int cpu , void * data , __u32 size )
77
76
{
78
77
struct {
79
78
__u16 cookie ;
@@ -83,45 +82,20 @@ static int print_bpf_output(void *data, int size)
83
82
int i ;
84
83
85
84
if (e -> cookie != 0xdead ) {
86
- printf ("BUG cookie %x sized %d\n" ,
87
- e -> cookie , size );
88
- return LIBBPF_PERF_EVENT_ERROR ;
85
+ printf ("BUG cookie %x sized %d\n" , e -> cookie , size );
86
+ return ;
89
87
}
90
88
91
89
printf ("Pkt len: %-5d bytes. Ethernet hdr: " , e -> pkt_len );
92
90
for (i = 0 ; i < 14 && i < e -> pkt_len ; i ++ )
93
91
printf ("%02x " , e -> pkt_data [i ]);
94
92
printf ("\n" );
95
-
96
- return LIBBPF_PERF_EVENT_CONT ;
97
- }
98
-
99
- static void test_bpf_perf_event (int map_fd , int num )
100
- {
101
- struct perf_event_attr attr = {
102
- .sample_type = PERF_SAMPLE_RAW ,
103
- .type = PERF_TYPE_SOFTWARE ,
104
- .config = PERF_COUNT_SW_BPF_OUTPUT ,
105
- .wakeup_events = 1 , /* get an fd notification for every event */
106
- };
107
- int i ;
108
-
109
- for (i = 0 ; i < num ; i ++ ) {
110
- int key = i ;
111
-
112
- pmu_fds [i ] = sys_perf_event_open (& attr , -1 /*pid*/ , i /*cpu*/ ,
113
- -1 /*group_fd*/ , 0 );
114
-
115
- assert (pmu_fds [i ] >= 0 );
116
- assert (bpf_map_update_elem (map_fd , & key ,
117
- & pmu_fds [i ], BPF_ANY ) == 0 );
118
- ioctl (pmu_fds [i ], PERF_EVENT_IOC_ENABLE , 0 );
119
- }
120
93
}
121
94
122
95
static void sig_handler (int signo )
123
96
{
124
97
do_detach (if_idx , if_name );
98
+ perf_buffer__free (pb );
125
99
exit (0 );
126
100
}
127
101
@@ -140,13 +114,13 @@ int main(int argc, char **argv)
140
114
struct bpf_prog_load_attr prog_load_attr = {
141
115
.prog_type = BPF_PROG_TYPE_XDP ,
142
116
};
117
+ struct perf_buffer_opts pb_opts = {};
143
118
const char * optstr = "F" ;
144
119
int prog_fd , map_fd , opt ;
145
120
struct bpf_object * obj ;
146
121
struct bpf_map * map ;
147
122
char filename [256 ];
148
- int ret , err , i ;
149
- int numcpus ;
123
+ int ret , err ;
150
124
151
125
while ((opt = getopt (argc , argv , optstr )) != -1 ) {
152
126
switch (opt ) {
@@ -169,10 +143,6 @@ int main(int argc, char **argv)
169
143
return 1 ;
170
144
}
171
145
172
- numcpus = get_nprocs ();
173
- if (numcpus > MAX_CPUS )
174
- numcpus = MAX_CPUS ;
175
-
176
146
snprintf (filename , sizeof (filename ), "%s_kern.o" , argv [0 ]);
177
147
prog_load_attr .file = filename ;
178
148
@@ -211,14 +181,17 @@ int main(int argc, char **argv)
211
181
return 1 ;
212
182
}
213
183
214
- test_bpf_perf_event (map_fd , numcpus );
184
+ pb_opts .sample_cb = print_bpf_output ;
185
+ pb = perf_buffer__new (map_fd , 8 , & pb_opts );
186
+ err = libbpf_get_error (pb );
187
+ if (err ) {
188
+ perror ("perf_buffer setup failed" );
189
+ return 1 ;
190
+ }
215
191
216
- for (i = 0 ; i < numcpus ; i ++ )
217
- if (perf_event_mmap_header (pmu_fds [i ], & headers [i ]) < 0 )
218
- return 1 ;
192
+ while ((ret = perf_buffer__poll (pb , 1000 )) >= 0 ) {
193
+ }
219
194
220
- ret = perf_event_poller_multi (pmu_fds , headers , numcpus ,
221
- print_bpf_output );
222
195
kill (0 , SIGINT );
223
196
return ret ;
224
197
}
0 commit comments