162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright (c) 2020 Facebook
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/bpf.h>
562306a36Sopenharmony_ci#include <stdint.h>
662306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
762306a36Sopenharmony_ci#include "bpf_misc.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct {
1262306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_RINGBUF);
1362306a36Sopenharmony_ci} ringbuf SEC(".maps");
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciconst volatile int batch_cnt = 0;
1662306a36Sopenharmony_ciconst volatile long use_output = 0;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cilong sample_val = 42;
1962306a36Sopenharmony_cilong dropped __attribute__((aligned(128))) = 0;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciconst volatile long wakeup_data_size = 0;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic __always_inline long get_flags()
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	long sz;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	if (!wakeup_data_size)
2862306a36Sopenharmony_ci		return 0;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	sz = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA);
3162306a36Sopenharmony_ci	return sz >= wakeup_data_size ? BPF_RB_FORCE_WAKEUP : BPF_RB_NO_WAKEUP;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciSEC("fentry/" SYS_PREFIX "sys_getpgid")
3562306a36Sopenharmony_ciint bench_ringbuf(void *ctx)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	long *sample, flags;
3862306a36Sopenharmony_ci	int i;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	if (!use_output) {
4162306a36Sopenharmony_ci		for (i = 0; i < batch_cnt; i++) {
4262306a36Sopenharmony_ci			sample = bpf_ringbuf_reserve(&ringbuf,
4362306a36Sopenharmony_ci					             sizeof(sample_val), 0);
4462306a36Sopenharmony_ci			if (!sample) {
4562306a36Sopenharmony_ci				__sync_add_and_fetch(&dropped, 1);
4662306a36Sopenharmony_ci			} else {
4762306a36Sopenharmony_ci				*sample = sample_val;
4862306a36Sopenharmony_ci				flags = get_flags();
4962306a36Sopenharmony_ci				bpf_ringbuf_submit(sample, flags);
5062306a36Sopenharmony_ci			}
5162306a36Sopenharmony_ci		}
5262306a36Sopenharmony_ci	} else {
5362306a36Sopenharmony_ci		for (i = 0; i < batch_cnt; i++) {
5462306a36Sopenharmony_ci			flags = get_flags();
5562306a36Sopenharmony_ci			if (bpf_ringbuf_output(&ringbuf, &sample_val,
5662306a36Sopenharmony_ci					       sizeof(sample_val), flags))
5762306a36Sopenharmony_ci				__sync_add_and_fetch(&dropped, 1);
5862306a36Sopenharmony_ci		}
5962306a36Sopenharmony_ci	}
6062306a36Sopenharmony_ci	return 0;
6162306a36Sopenharmony_ci}
62