linux/tools/testing/selftests/bpf/progs/test_ringbuf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (c) 2020 Facebook
   3
   4#include <linux/bpf.h>
   5#include <bpf/bpf_helpers.h>
   6
   7char _license[] SEC("license") = "GPL";
   8
   9struct sample {
  10        int pid;
  11        int seq;
  12        long value;
  13        char comm[16];
  14};
  15
  16struct {
  17        __uint(type, BPF_MAP_TYPE_RINGBUF);
  18} ringbuf SEC(".maps");
  19
  20/* inputs */
  21int pid = 0;
  22long value = 0;
  23long flags = 0;
  24
  25/* outputs */
  26long total = 0;
  27long discarded = 0;
  28long dropped = 0;
  29
  30long avail_data = 0;
  31long ring_size = 0;
  32long cons_pos = 0;
  33long prod_pos = 0;
  34
  35/* inner state */
  36long seq = 0;
  37
  38SEC("fentry/__x64_sys_getpgid")
  39int test_ringbuf(void *ctx)
  40{
  41        int cur_pid = bpf_get_current_pid_tgid() >> 32;
  42        struct sample *sample;
  43        int zero = 0;
  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