1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/bpf.h> 4 #include <bpf/bpf_helpers.h> 5 #include "bpf_misc.h" 6 7 char _license[] SEC("license") = "GPL"; 8 9 struct { 10 __uint(type, BPF_MAP_TYPE_RINGBUF); 11 } ringbuf SEC(".maps"); 12 13 /* inputs */ 14 int pid = 0; 15 16 /* outputs */ 17 long passed = 0; 18 long discarded = 0; 19 20 SEC("fentry/" SYS_PREFIX "sys_getpgid") 21 int test_ringbuf_write(void *ctx) 22 { 23 int *foo, cur_pid = bpf_get_current_pid_tgid() >> 32; 24 void *sample1, *sample2; 25 26 if (cur_pid != pid) 27 return 0; 28 29 sample1 = bpf_ringbuf_reserve(&ringbuf, 0x3000, 0); 30 if (!sample1) 31 return 0; 32 /* first one can pass */ 33 sample2 = bpf_ringbuf_reserve(&ringbuf, 0x3000, 0); 34 if (!sample2) { 35 bpf_ringbuf_discard(sample1, 0); 36 __sync_fetch_and_add(&discarded, 1); 37 return 0; 38 } 39 /* second one must not */ 40 __sync_fetch_and_add(&passed, 1); 41 foo = sample2 + 4084; 42 *foo = 256; 43 bpf_ringbuf_discard(sample1, 0); 44 bpf_ringbuf_discard(sample2, 0); 45 return 0; 46 } 47