2019-05-28 10:10:09 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2015-10-20 20:02:35 -07:00
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
# include <stdbool.h>
# include <string.h>
# include <fcntl.h>
# include <poll.h>
# include <linux/perf_event.h>
# include <linux/bpf.h>
# include <errno.h>
# include <assert.h>
# include <sys/syscall.h>
# include <sys/ioctl.h>
# include <sys/mman.h>
# include <time.h>
# include <signal.h>
2020-01-20 14:06:49 +01:00
# include <bpf/libbpf.h>
2015-10-20 20:02:35 -07:00
# include "bpf_load.h"
2016-12-08 18:46:19 -08:00
# include "perf-sys.h"
2015-10-20 20:02:35 -07: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-23 14:34:44 -07:00
static __u64 cnt ;
2015-10-20 20:02:35 -07:00
# define MAX_CNT 100000ll
2019-07-23 14:34:44 -07:00
static void print_bpf_output ( void * ctx , int cpu , void * data , __u32 size )
2015-10-20 20:02:35 -07: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-23 14:34:44 -07:00
return ;
2015-10-20 20:02:35 -07:00
}
cnt + + ;
if ( cnt = = MAX_CNT ) {
printf ( " recv %lld events per sec \n " ,
MAX_CNT * 1000000000ll / ( time_get_ns ( ) - start_time ) ) ;
2019-07-23 14:34:44 -07:00
return ;
2015-10-20 20:02:35 -07:00
}
}
int main ( int argc , char * * argv )
{
2019-07-23 14:34:44 -07:00
struct perf_buffer_opts pb_opts = { } ;
struct perf_buffer * pb ;
2015-10-20 20:02:35 -07:00
char filename [ 256 ] ;
FILE * f ;
2018-04-28 22:28:13 -07:00
int ret ;
2015-10-20 20:02:35 -07:00
snprintf ( filename , sizeof ( filename ) , " %s_kern.o " , argv [ 0 ] ) ;
if ( load_bpf_file ( filename ) ) {
printf ( " %s " , bpf_log_buf ) ;
return 1 ;
}
2019-07-23 14:34:44 -07:00
pb_opts . sample_cb = print_bpf_output ;
pb = perf_buffer__new ( map_fd [ 0 ] , 8 , & pb_opts ) ;
ret = libbpf_get_error ( pb ) ;
if ( ret ) {
printf ( " failed to setup perf_buffer: %d \n " , ret ) ;
2015-10-20 20:02:35 -07:00
return 1 ;
2019-07-23 14:34:44 -07:00
}
2015-10-20 20:02:35 -07:00
f = popen ( " taskset 1 dd if=/dev/zero of=/dev/null " , " r " ) ;
( void ) f ;
start_time = time_get_ns ( ) ;
2019-07-23 14:34:44 -07:00
while ( ( ret = perf_buffer__poll ( pb , 1000 ) ) > = 0 & & cnt < MAX_CNT ) {
}
2018-04-28 22:28:13 -07:00
kill ( 0 , SIGINT ) ;
return ret ;
2015-10-20 20:02:35 -07:00
}