1c97099b0SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2c97099b0SAndrii Nakryiko // Copyright (c) 2020 Facebook
3c97099b0SAndrii Nakryiko 
4c97099b0SAndrii Nakryiko #include <linux/bpf.h>
5c97099b0SAndrii Nakryiko #include <stdint.h>
6c97099b0SAndrii Nakryiko #include <bpf/bpf_helpers.h>
7*e91d280cSNaveen N. Rao #include "bpf_misc.h"
8c97099b0SAndrii Nakryiko 
9c97099b0SAndrii Nakryiko char _license[] SEC("license") = "GPL";
10c97099b0SAndrii Nakryiko 
11c97099b0SAndrii Nakryiko struct {
12c97099b0SAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_RINGBUF);
13c97099b0SAndrii Nakryiko } ringbuf SEC(".maps");
14c97099b0SAndrii Nakryiko 
15c97099b0SAndrii Nakryiko const volatile int batch_cnt = 0;
16c97099b0SAndrii Nakryiko const volatile long use_output = 0;
17c97099b0SAndrii Nakryiko 
18c97099b0SAndrii Nakryiko long sample_val = 42;
19c97099b0SAndrii Nakryiko long dropped __attribute__((aligned(128))) = 0;
20c97099b0SAndrii Nakryiko 
21c97099b0SAndrii Nakryiko const volatile long wakeup_data_size = 0;
22c97099b0SAndrii Nakryiko 
get_flags()23c97099b0SAndrii Nakryiko static __always_inline long get_flags()
24c97099b0SAndrii Nakryiko {
25c97099b0SAndrii Nakryiko 	long sz;
26c97099b0SAndrii Nakryiko 
27c97099b0SAndrii Nakryiko 	if (!wakeup_data_size)
28c97099b0SAndrii Nakryiko 		return 0;
29c97099b0SAndrii Nakryiko 
30c97099b0SAndrii Nakryiko 	sz = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA);
31c97099b0SAndrii Nakryiko 	return sz >= wakeup_data_size ? BPF_RB_FORCE_WAKEUP : BPF_RB_NO_WAKEUP;
32c97099b0SAndrii Nakryiko }
33c97099b0SAndrii Nakryiko 
34*e91d280cSNaveen N. Rao SEC("fentry/" SYS_PREFIX "sys_getpgid")
bench_ringbuf(void * ctx)35c97099b0SAndrii Nakryiko int bench_ringbuf(void *ctx)
36c97099b0SAndrii Nakryiko {
37c97099b0SAndrii Nakryiko 	long *sample, flags;
38c97099b0SAndrii Nakryiko 	int i;
39c97099b0SAndrii Nakryiko 
40c97099b0SAndrii Nakryiko 	if (!use_output) {
41c97099b0SAndrii Nakryiko 		for (i = 0; i < batch_cnt; i++) {
42c97099b0SAndrii Nakryiko 			sample = bpf_ringbuf_reserve(&ringbuf,
43c97099b0SAndrii Nakryiko 					             sizeof(sample_val), 0);
44c97099b0SAndrii Nakryiko 			if (!sample) {
45c97099b0SAndrii Nakryiko 				__sync_add_and_fetch(&dropped, 1);
46c97099b0SAndrii Nakryiko 			} else {
47c97099b0SAndrii Nakryiko 				*sample = sample_val;
48c97099b0SAndrii Nakryiko 				flags = get_flags();
49c97099b0SAndrii Nakryiko 				bpf_ringbuf_submit(sample, flags);
50c97099b0SAndrii Nakryiko 			}
51c97099b0SAndrii Nakryiko 		}
52c97099b0SAndrii Nakryiko 	} else {
53c97099b0SAndrii Nakryiko 		for (i = 0; i < batch_cnt; i++) {
54c97099b0SAndrii Nakryiko 			flags = get_flags();
55c97099b0SAndrii Nakryiko 			if (bpf_ringbuf_output(&ringbuf, &sample_val,
56c97099b0SAndrii Nakryiko 					       sizeof(sample_val), flags))
57c97099b0SAndrii Nakryiko 				__sync_add_and_fetch(&dropped, 1);
58c97099b0SAndrii Nakryiko 		}
59c97099b0SAndrii Nakryiko 	}
60c97099b0SAndrii Nakryiko 	return 0;
61c97099b0SAndrii Nakryiko }
62