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