2019-05-28 20:10:09 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2015-10-21 06:02:35 +03:00
# include <stdio.h>
# include <fcntl.h>
# include <poll.h>
# include <time.h>
# include <signal.h>
2020-01-20 16:06:49 +03:00
# include <bpf/libbpf.h>
2015-10-21 06:02:35 +03:00
static __u64 time_get_ns ( void )
{
struct timespec ts ;
clock_gettime ( CLOCK_MONOTONIC , & ts ) ;
return ts . tv_sec * 1000000000ull + ts . tv_nsec ;
}
static __u64 start_time ;
2019-07-24 00:34:44 +03:00
static __u64 cnt ;
2015-10-21 06:02:35 +03:00
# define MAX_CNT 100000ll
2019-07-24 00:34:44 +03:00
static void print_bpf_output ( void * ctx , int cpu , void * data , __u32 size )
2015-10-21 06:02:35 +03:00
{
struct {
__u64 pid ;
__u64 cookie ;
} * e = data ;
if ( e - > cookie ! = 0x12345678 ) {
printf ( " BUG pid %llx cookie %llx sized %d \n " ,
e - > pid , e - > cookie , size ) ;
2019-07-24 00:34:44 +03:00
return ;
2015-10-21 06:02:35 +03:00
}
cnt + + ;
if ( cnt = = MAX_CNT ) {
printf ( " recv %lld events per sec \n " ,
MAX_CNT * 1000000000ll / ( time_get_ns ( ) - start_time ) ) ;
2019-07-24 00:34:44 +03:00
return ;
2015-10-21 06:02:35 +03:00
}
}
int main ( int argc , char * * argv )
{
2020-08-23 11:53:33 +03:00
struct bpf_link * link = NULL ;
struct bpf_program * prog ;
2019-07-24 00:34:44 +03:00
struct perf_buffer * pb ;
2020-08-23 11:53:33 +03:00
struct bpf_object * obj ;
int map_fd , ret = 0 ;
2015-10-21 06:02:35 +03:00
char filename [ 256 ] ;
FILE * f ;
snprintf ( filename , sizeof ( filename ) , " %s_kern.o " , argv [ 0 ] ) ;
2020-08-23 11:53:33 +03:00
obj = bpf_object__open_file ( filename , NULL ) ;
if ( libbpf_get_error ( obj ) ) {
fprintf ( stderr , " ERROR: opening BPF object file failed \n " ) ;
return 0 ;
}
2015-10-21 06:02:35 +03:00
2020-08-23 11:53:33 +03:00
/* load BPF program */
if ( bpf_object__load ( obj ) ) {
fprintf ( stderr , " ERROR: loading BPF object file failed \n " ) ;
goto cleanup ;
}
map_fd = bpf_object__find_map_fd_by_name ( obj , " my_map " ) ;
if ( map_fd < 0 ) {
fprintf ( stderr , " ERROR: finding a map in obj file failed \n " ) ;
goto cleanup ;
}
prog = bpf_object__find_program_by_name ( obj , " bpf_prog1 " ) ;
if ( libbpf_get_error ( prog ) ) {
fprintf ( stderr , " ERROR: finding a prog in obj file failed \n " ) ;
goto cleanup ;
}
link = bpf_program__attach ( prog ) ;
if ( libbpf_get_error ( link ) ) {
fprintf ( stderr , " ERROR: bpf_program__attach failed \n " ) ;
link = NULL ;
goto cleanup ;
2015-10-21 06:02:35 +03:00
}
2021-12-02 02:28:23 +03:00
pb = perf_buffer__new ( map_fd , 8 , print_bpf_output , NULL , NULL , NULL ) ;
2019-07-24 00:34:44 +03:00
ret = libbpf_get_error ( pb ) ;
if ( ret ) {
printf ( " failed to setup perf_buffer: %d \n " , ret ) ;
2015-10-21 06:02:35 +03:00
return 1 ;
2019-07-24 00:34:44 +03:00
}
2015-10-21 06:02:35 +03:00
f = popen ( " taskset 1 dd if=/dev/zero of=/dev/null " , " r " ) ;
( void ) f ;
start_time = time_get_ns ( ) ;
2019-07-24 00:34:44 +03:00
while ( ( ret = perf_buffer__poll ( pb , 1000 ) ) > = 0 & & cnt < MAX_CNT ) {
}
2018-04-29 08:28:13 +03:00
kill ( 0 , SIGINT ) ;
2020-08-23 11:53:33 +03:00
cleanup :
bpf_link__destroy ( link ) ;
bpf_object__close ( obj ) ;
2018-04-29 08:28:13 +03:00
return ret ;
2015-10-21 06:02:35 +03:00
}