Commit | Line | Data |
---|---|---|
25763b3c | 1 | // SPDX-License-Identifier: GPL-2.0-only |
39111695 AS |
2 | #include <stdio.h> |
3 | #include <unistd.h> | |
4 | #include <stdlib.h> | |
5 | #include <stdbool.h> | |
6 | #include <string.h> | |
7 | #include <fcntl.h> | |
8 | #include <poll.h> | |
39111695 AS |
9 | #include <linux/perf_event.h> |
10 | #include <linux/bpf.h> | |
11 | #include <errno.h> | |
12 | #include <assert.h> | |
13 | #include <sys/syscall.h> | |
14 | #include <sys/ioctl.h> | |
15 | #include <sys/mman.h> | |
16 | #include <time.h> | |
17 | #include <signal.h> | |
2bf3e2ef | 18 | #include <libbpf.h> |
39111695 | 19 | #include "bpf_load.h" |
205c8ada | 20 | #include "perf-sys.h" |
39111695 | 21 | |
39111695 AS |
22 | static __u64 time_get_ns(void) |
23 | { | |
24 | struct timespec ts; | |
25 | ||
26 | clock_gettime(CLOCK_MONOTONIC, &ts); | |
27 | return ts.tv_sec * 1000000000ull + ts.tv_nsec; | |
28 | } | |
29 | ||
30 | static __u64 start_time; | |
c17bec54 | 31 | static __u64 cnt; |
39111695 AS |
32 | |
33 | #define MAX_CNT 100000ll | |
34 | ||
c17bec54 | 35 | static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size) |
39111695 | 36 | { |
39111695 AS |
37 | struct { |
38 | __u64 pid; | |
39 | __u64 cookie; | |
40 | } *e = data; | |
41 | ||
42 | if (e->cookie != 0x12345678) { | |
43 | printf("BUG pid %llx cookie %llx sized %d\n", | |
44 | e->pid, e->cookie, size); | |
c17bec54 | 45 | return; |
39111695 AS |
46 | } |
47 | ||
48 | cnt++; | |
49 | ||
50 | if (cnt == MAX_CNT) { | |
51 | printf("recv %lld events per sec\n", | |
52 | MAX_CNT * 1000000000ll / (time_get_ns() - start_time)); | |
c17bec54 | 53 | return; |
39111695 | 54 | } |
39111695 AS |
55 | } |
56 | ||
57 | int main(int argc, char **argv) | |
58 | { | |
c17bec54 AN |
59 | struct perf_buffer_opts pb_opts = {}; |
60 | struct perf_buffer *pb; | |
39111695 AS |
61 | char filename[256]; |
62 | FILE *f; | |
28dbf861 | 63 | int ret; |
39111695 AS |
64 | |
65 | snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); | |
66 | ||
67 | if (load_bpf_file(filename)) { | |
68 | printf("%s", bpf_log_buf); | |
69 | return 1; | |
70 | } | |
71 | ||
c17bec54 AN |
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); | |
39111695 | 77 | return 1; |
c17bec54 | 78 | } |
39111695 AS |
79 | |
80 | f = popen("taskset 1 dd if=/dev/zero of=/dev/null", "r"); | |
81 | (void) f; | |
82 | ||
83 | start_time = time_get_ns(); | |
c17bec54 AN |
84 | while ((ret = perf_buffer__poll(pb, 1000)) >= 0 && cnt < MAX_CNT) { |
85 | } | |
28dbf861 YS |
86 | kill(0, SIGINT); |
87 | return ret; | |
39111695 | 88 | } |