1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2020 Facebook |
3 | |
4 | #include <linux/bpf.h> |
5 | #include <bpf/bpf_helpers.h> |
6 | #include "bpf_misc.h" |
7 | |
8 | char _license[] SEC("license" ) = "GPL" ; |
9 | |
10 | struct sample { |
11 | int pid; |
12 | int seq; |
13 | long value; |
14 | char comm[16]; |
15 | }; |
16 | |
17 | struct { |
18 | __uint(type, BPF_MAP_TYPE_RINGBUF); |
19 | } ringbuf SEC(".maps" ); |
20 | |
21 | /* inputs */ |
22 | int pid = 0; |
23 | long value = 0; |
24 | long flags = 0; |
25 | |
26 | /* outputs */ |
27 | long total = 0; |
28 | long discarded = 0; |
29 | long dropped = 0; |
30 | |
31 | long avail_data = 0; |
32 | long ring_size = 0; |
33 | long cons_pos = 0; |
34 | long prod_pos = 0; |
35 | |
36 | /* inner state */ |
37 | long seq = 0; |
38 | |
39 | SEC("fentry/" SYS_PREFIX "sys_getpgid" ) |
40 | int test_ringbuf(void *ctx) |
41 | { |
42 | int cur_pid = bpf_get_current_pid_tgid() >> 32; |
43 | struct sample *sample; |
44 | |
45 | if (cur_pid != pid) |
46 | return 0; |
47 | |
48 | sample = bpf_ringbuf_reserve(&ringbuf, sizeof(*sample), 0); |
49 | if (!sample) { |
50 | __sync_fetch_and_add(&dropped, 1); |
51 | return 0; |
52 | } |
53 | |
54 | sample->pid = pid; |
55 | bpf_get_current_comm(sample->comm, sizeof(sample->comm)); |
56 | sample->value = value; |
57 | |
58 | sample->seq = seq++; |
59 | __sync_fetch_and_add(&total, 1); |
60 | |
61 | if (sample->seq & 1) { |
62 | /* copy from reserved sample to a new one... */ |
63 | bpf_ringbuf_output(&ringbuf, sample, sizeof(*sample), flags); |
64 | /* ...and then discard reserved sample */ |
65 | bpf_ringbuf_discard(sample, flags); |
66 | __sync_fetch_and_add(&discarded, 1); |
67 | } else { |
68 | bpf_ringbuf_submit(sample, flags); |
69 | } |
70 | |
71 | avail_data = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA); |
72 | ring_size = bpf_ringbuf_query(&ringbuf, BPF_RB_RING_SIZE); |
73 | cons_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_CONS_POS); |
74 | prod_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_PROD_POS); |
75 | |
76 | return 0; |
77 | } |
78 | |