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        __uint(max_entries, 1 << 12);
  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("tp/syscalls/sys_enter_getpgid")
  40int test_ringbuf(void *ctx)
  41{
  42        int cur_pid = bpf_get_current_pid_tgid() >> 32;
  43        struct sample *sample;
  44        int zero = 0;
  45
  46        if (cur_pid != pid)
  47                return 0;
  48
  49        sample = bpf_ringbuf_reserve(&ringbuf, sizeof(*sample), 0);
  50        if (!sample) {
  51                __sync_fetch_and_add(&dropped, 1);
  52                return 1;
  53        }
  54
  55        sample->pid = pid;
  56        bpf_get_current_comm(sample->comm, sizeof(sample->comm));
  57        sample->value = value;
  58
  59        sample->seq = seq++;
  60        __sync_fetch_and_add(&total, 1);
  61
  62        if (sample->seq & 1) {
  63                /* copy from reserved sample to a new one... */
  64                bpf_ringbuf_output(&ringbuf, sample, sizeof(*sample), flags);
  65                /* ...and then discard reserved sample */
  66                bpf_ringbuf_discard(sample, flags);
  67                __sync_fetch_and_add(&discarded, 1);
  68        } else {
  69                bpf_ringbuf_submit(sample, flags);
  70        }
  71
  72        avail_data = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA);
  73        ring_size = bpf_ringbuf_query(&ringbuf, BPF_RB_RING_SIZE);
  74        cons_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_CONS_POS);
  75        prod_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_PROD_POS);
  76
  77        return 0;
  78}
  79