brintos

brintos / linux-shallow public Read only

0
0
Text · 1.6 KiB · 501cefa Raw
78 lines · c
1// SPDX-License-Identifier: GPL-2.02// Copyright (c) 2020 Facebook3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8char _license[] SEC("license") = "GPL";9 10struct sample {11	int pid;12	int seq;13	long value;14	char comm[16];15};16 17struct {18	__uint(type, BPF_MAP_TYPE_RINGBUF);19} ringbuf SEC(".maps");20 21/* inputs */22int pid = 0;23long value = 0;24long flags = 0;25 26/* outputs */27long total = 0;28long discarded = 0;29long dropped = 0;30 31long avail_data = 0;32long ring_size = 0;33long cons_pos = 0;34long prod_pos = 0;35 36/* inner state */37long seq = 0;38 39SEC("fentry/" SYS_PREFIX "sys_getpgid")40int 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