2020-05-29 00:54:22 -07:00
// SPDX-License-Identifier: GPL-2.0
// Copyright (c) 2020 Facebook
# include <linux/bpf.h>
# include <bpf/bpf_helpers.h>
char _license [ ] SEC ( " license " ) = " GPL " ;
struct sample {
int pid ;
int seq ;
long value ;
char comm [ 16 ] ;
} ;
struct ringbuf_map {
__uint ( type , BPF_MAP_TYPE_RINGBUF ) ;
2022-05-08 17:41:48 -07:00
/* libbpf will adjust to valid page size */
__uint ( max_entries , 1000 ) ;
2020-05-29 00:54:22 -07:00
} ringbuf1 SEC ( " .maps " ) ,
ringbuf2 SEC ( " .maps " ) ;
struct {
__uint ( type , BPF_MAP_TYPE_ARRAY_OF_MAPS ) ;
__uint ( max_entries , 4 ) ;
__type ( key , int ) ;
__array ( values , struct ringbuf_map ) ;
} ringbuf_arr SEC ( " .maps " ) = {
. values = {
[ 0 ] = & ringbuf1 ,
[ 2 ] = & ringbuf2 ,
} ,
} ;
2021-04-08 09:13:10 +03:00
struct {
__uint ( type , BPF_MAP_TYPE_HASH_OF_MAPS ) ;
__uint ( max_entries , 1 ) ;
__type ( key , int ) ;
__array ( values , struct ringbuf_map ) ;
} ringbuf_hash SEC ( " .maps " ) = {
. values = {
[ 0 ] = & ringbuf1 ,
} ,
} ;
2020-05-29 00:54:22 -07:00
/* inputs */
int pid = 0 ;
int target_ring = 0 ;
long value = 0 ;
/* outputs */
long total = 0 ;
long dropped = 0 ;
long skipped = 0 ;
SEC ( " tp/syscalls/sys_enter_getpgid " )
int test_ringbuf ( void * ctx )
{
int cur_pid = bpf_get_current_pid_tgid ( ) > > 32 ;
struct sample * sample ;
void * rb ;
int zero = 0 ;
if ( cur_pid ! = pid )
return 0 ;
rb = bpf_map_lookup_elem ( & ringbuf_arr , & target_ring ) ;
if ( ! rb ) {
skipped + = 1 ;
return 1 ;
}
sample = bpf_ringbuf_reserve ( rb , sizeof ( * sample ) , 0 ) ;
if ( ! sample ) {
dropped + = 1 ;
return 1 ;
}
sample - > pid = pid ;
bpf_get_current_comm ( sample - > comm , sizeof ( sample - > comm ) ) ;
sample - > value = value ;
sample - > seq = total ;
total + = 1 ;
bpf_ringbuf_submit ( sample , 0 ) ;
return 0 ;
}