125763b3cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 239111695SAlexei Starovoitov #include <stdio.h> 339111695SAlexei Starovoitov #include <unistd.h> 439111695SAlexei Starovoitov #include <stdlib.h> 539111695SAlexei Starovoitov #include <stdbool.h> 639111695SAlexei Starovoitov #include <string.h> 739111695SAlexei Starovoitov #include <fcntl.h> 839111695SAlexei Starovoitov #include <poll.h> 939111695SAlexei Starovoitov #include <linux/perf_event.h> 1039111695SAlexei Starovoitov #include <linux/bpf.h> 1139111695SAlexei Starovoitov #include <errno.h> 1239111695SAlexei Starovoitov #include <assert.h> 1339111695SAlexei Starovoitov #include <sys/syscall.h> 1439111695SAlexei Starovoitov #include <sys/ioctl.h> 1539111695SAlexei Starovoitov #include <sys/mman.h> 1639111695SAlexei Starovoitov #include <time.h> 1739111695SAlexei Starovoitov #include <signal.h> 182bf3e2efSJakub Kicinski #include <libbpf.h> 1939111695SAlexei Starovoitov #include "bpf_load.h" 20205c8adaSJoe Stringer #include "perf-sys.h" 2139111695SAlexei Starovoitov 2239111695SAlexei Starovoitov static __u64 time_get_ns(void) 2339111695SAlexei Starovoitov { 2439111695SAlexei Starovoitov struct timespec ts; 2539111695SAlexei Starovoitov 2639111695SAlexei Starovoitov clock_gettime(CLOCK_MONOTONIC, &ts); 2739111695SAlexei Starovoitov return ts.tv_sec * 1000000000ull + ts.tv_nsec; 2839111695SAlexei Starovoitov } 2939111695SAlexei Starovoitov 3039111695SAlexei Starovoitov static __u64 start_time; 31*c17bec54SAndrii Nakryiko static __u64 cnt; 3239111695SAlexei Starovoitov 3339111695SAlexei Starovoitov #define MAX_CNT 100000ll 3439111695SAlexei Starovoitov 35*c17bec54SAndrii Nakryiko static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size) 3639111695SAlexei Starovoitov { 3739111695SAlexei Starovoitov struct { 3839111695SAlexei Starovoitov __u64 pid; 3939111695SAlexei Starovoitov __u64 cookie; 4039111695SAlexei Starovoitov } *e = data; 4139111695SAlexei Starovoitov 4239111695SAlexei Starovoitov if (e->cookie != 0x12345678) { 4339111695SAlexei Starovoitov printf("BUG pid %llx cookie %llx sized %d\n", 4439111695SAlexei Starovoitov e->pid, e->cookie, size); 45*c17bec54SAndrii Nakryiko return; 4639111695SAlexei Starovoitov } 4739111695SAlexei Starovoitov 4839111695SAlexei Starovoitov cnt++; 4939111695SAlexei Starovoitov 5039111695SAlexei Starovoitov if (cnt == MAX_CNT) { 5139111695SAlexei Starovoitov printf("recv %lld events per sec\n", 5239111695SAlexei Starovoitov MAX_CNT * 1000000000ll / (time_get_ns() - start_time)); 53*c17bec54SAndrii Nakryiko return; 5439111695SAlexei Starovoitov } 5539111695SAlexei Starovoitov } 5639111695SAlexei Starovoitov 5739111695SAlexei Starovoitov int main(int argc, char **argv) 5839111695SAlexei Starovoitov { 59*c17bec54SAndrii Nakryiko struct perf_buffer_opts pb_opts = {}; 60*c17bec54SAndrii Nakryiko struct perf_buffer *pb; 6139111695SAlexei Starovoitov char filename[256]; 6239111695SAlexei Starovoitov FILE *f; 6328dbf861SYonghong Song int ret; 6439111695SAlexei Starovoitov 6539111695SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 6639111695SAlexei Starovoitov 6739111695SAlexei Starovoitov if (load_bpf_file(filename)) { 6839111695SAlexei Starovoitov printf("%s", bpf_log_buf); 6939111695SAlexei Starovoitov return 1; 7039111695SAlexei Starovoitov } 7139111695SAlexei Starovoitov 72*c17bec54SAndrii Nakryiko pb_opts.sample_cb = print_bpf_output; 73*c17bec54SAndrii Nakryiko pb = perf_buffer__new(map_fd[0], 8, &pb_opts); 74*c17bec54SAndrii Nakryiko ret = libbpf_get_error(pb); 75*c17bec54SAndrii Nakryiko if (ret) { 76*c17bec54SAndrii Nakryiko printf("failed to setup perf_buffer: %d\n", ret); 7739111695SAlexei Starovoitov return 1; 78*c17bec54SAndrii Nakryiko } 7939111695SAlexei Starovoitov 8039111695SAlexei Starovoitov f = popen("taskset 1 dd if=/dev/zero of=/dev/null", "r"); 8139111695SAlexei Starovoitov (void) f; 8239111695SAlexei Starovoitov 8339111695SAlexei Starovoitov start_time = time_get_ns(); 84*c17bec54SAndrii Nakryiko while ((ret = perf_buffer__poll(pb, 1000)) >= 0 && cnt < MAX_CNT) { 85*c17bec54SAndrii Nakryiko } 8628dbf861SYonghong Song kill(0, SIGINT); 8728dbf861SYonghong Song return ret; 8839111695SAlexei Starovoitov } 89