1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2020 Facebook
5 #include <bpf/bpf_helpers.h>
7 char _license
[] SEC("license") = "GPL";
17 __uint(type
, BPF_MAP_TYPE_RINGBUF
);
18 __uint(max_entries
, 1 << 12);
19 } ringbuf
SEC(".maps");
39 SEC("tp/syscalls/sys_enter_getpgid")
40 int test_ringbuf(void *ctx
)
42 int cur_pid
= bpf_get_current_pid_tgid() >> 32;
43 struct sample
*sample
;
49 sample
= bpf_ringbuf_reserve(&ringbuf
, sizeof(*sample
), 0);
51 __sync_fetch_and_add(&dropped
, 1);
56 bpf_get_current_comm(sample
->comm
, sizeof(sample
->comm
));
57 sample
->value
= value
;
60 __sync_fetch_and_add(&total
, 1);
62 if (sample
->seq
& 1) {
63 /* copy from reserved sample to a new one... */
64 bpf_ringbuf_output(&ringbuf
, sample
, sizeof(*sample
), flags
);
65 /* ...and then discard reserved sample */
66 bpf_ringbuf_discard(sample
, flags
);
67 __sync_fetch_and_add(&discarded
, 1);
69 bpf_ringbuf_submit(sample
, flags
);
72 avail_data
= bpf_ringbuf_query(&ringbuf
, BPF_RB_AVAIL_DATA
);
73 ring_size
= bpf_ringbuf_query(&ringbuf
, BPF_RB_RING_SIZE
);
74 cons_pos
= bpf_ringbuf_query(&ringbuf
, BPF_RB_CONS_POS
);
75 prod_pos
= bpf_ringbuf_query(&ringbuf
, BPF_RB_PROD_POS
);