18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci// Copyright (c) 2020 Facebook
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include <linux/bpf.h>
58c2ecf20Sopenharmony_ci#include <stdint.h>
68c2ecf20Sopenharmony_ci#include <bpf/bpf_helpers.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cichar _license[] SEC("license") = "GPL";
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistruct {
118c2ecf20Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_RINGBUF);
128c2ecf20Sopenharmony_ci} ringbuf SEC(".maps");
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciconst volatile int batch_cnt = 0;
158c2ecf20Sopenharmony_ciconst volatile long use_output = 0;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cilong sample_val = 42;
188c2ecf20Sopenharmony_cilong dropped __attribute__((aligned(128))) = 0;
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciconst volatile long wakeup_data_size = 0;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistatic __always_inline long get_flags()
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	long sz;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	if (!wakeup_data_size)
278c2ecf20Sopenharmony_ci		return 0;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	sz = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA);
308c2ecf20Sopenharmony_ci	return sz >= wakeup_data_size ? BPF_RB_FORCE_WAKEUP : BPF_RB_NO_WAKEUP;
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ciSEC("fentry/__x64_sys_getpgid")
348c2ecf20Sopenharmony_ciint bench_ringbuf(void *ctx)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	long *sample, flags;
378c2ecf20Sopenharmony_ci	int i;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	if (!use_output) {
408c2ecf20Sopenharmony_ci		for (i = 0; i < batch_cnt; i++) {
418c2ecf20Sopenharmony_ci			sample = bpf_ringbuf_reserve(&ringbuf,
428c2ecf20Sopenharmony_ci					             sizeof(sample_val), 0);
438c2ecf20Sopenharmony_ci			if (!sample) {
448c2ecf20Sopenharmony_ci				__sync_add_and_fetch(&dropped, 1);
458c2ecf20Sopenharmony_ci			} else {
468c2ecf20Sopenharmony_ci				*sample = sample_val;
478c2ecf20Sopenharmony_ci				flags = get_flags();
488c2ecf20Sopenharmony_ci				bpf_ringbuf_submit(sample, flags);
498c2ecf20Sopenharmony_ci			}
508c2ecf20Sopenharmony_ci		}
518c2ecf20Sopenharmony_ci	} else {
528c2ecf20Sopenharmony_ci		for (i = 0; i < batch_cnt; i++) {
538c2ecf20Sopenharmony_ci			flags = get_flags();
548c2ecf20Sopenharmony_ci			if (bpf_ringbuf_output(&ringbuf, &sample_val,
558c2ecf20Sopenharmony_ci					       sizeof(sample_val), flags))
568c2ecf20Sopenharmony_ci				__sync_add_and_fetch(&dropped, 1);
578c2ecf20Sopenharmony_ci		}
588c2ecf20Sopenharmony_ci	}
598c2ecf20Sopenharmony_ci	return 0;
608c2ecf20Sopenharmony_ci}
61