2015-08-12 12:37:53 +03:00
# include <linux/ptrace.h>
2015-08-06 10:02:36 +03:00
# include <linux/version.h>
# include <uapi/linux/bpf.h>
2020-01-20 16:06:49 +03:00
# include <bpf/bpf_helpers.h>
2015-08-06 10:02:36 +03:00
2020-05-16 07:06:08 +03:00
struct {
__uint ( type , BPF_MAP_TYPE_PERF_EVENT_ARRAY ) ;
__uint ( key_size , sizeof ( int ) ) ;
__uint ( value_size , sizeof ( u32 ) ) ;
__uint ( max_entries , 64 ) ;
} counters SEC ( " .maps " ) ;
struct {
__uint ( type , BPF_MAP_TYPE_HASH ) ;
__type ( key , int ) ;
__type ( value , u64 ) ;
__uint ( max_entries , 64 ) ;
} values SEC ( " .maps " ) ;
struct {
__uint ( type , BPF_MAP_TYPE_HASH ) ;
__type ( key , int ) ;
__type ( value , struct bpf_perf_event_value ) ;
__uint ( max_entries , 64 ) ;
} values2 SEC ( " .maps " ) ;
2015-08-06 10:02:36 +03:00
2017-06-03 07:03:53 +03:00
SEC ( " kprobe/htab_map_get_next_key " )
2015-08-06 10:02:36 +03:00
int bpf_prog1 ( struct pt_regs * ctx )
{
u32 key = bpf_get_smp_processor_id ( ) ;
2017-06-03 07:03:53 +03:00
u64 count , * val ;
s64 error ;
count = bpf_perf_event_read ( & counters , key ) ;
error = ( s64 ) count ;
if ( error < = - 2 & & error > = - 22 )
return 0 ;
2015-08-06 10:02:36 +03:00
2017-06-03 07:03:53 +03:00
val = bpf_map_lookup_elem ( & values , & key ) ;
if ( val )
* val = count ;
else
bpf_map_update_elem ( & values , & key , & count , BPF_NOEXIST ) ;
2015-08-06 10:02:36 +03:00
return 0 ;
}
2017-10-05 19:19:21 +03:00
SEC ( " kprobe/htab_map_lookup_elem " )
int bpf_prog2 ( struct pt_regs * ctx )
{
u32 key = bpf_get_smp_processor_id ( ) ;
struct bpf_perf_event_value * val , buf ;
int error ;
error = bpf_perf_event_read_value ( & counters , key , & buf , sizeof ( buf ) ) ;
if ( error )
return 0 ;
val = bpf_map_lookup_elem ( & values2 , & key ) ;
if ( val )
* val = buf ;
else
bpf_map_update_elem ( & values2 , & key , & buf , BPF_NOEXIST ) ;
return 0 ;
}
2015-08-06 10:02:36 +03:00
char _license [ ] SEC ( " license " ) = " GPL " ;
u32 _version SEC ( " version " ) = LINUX_VERSION_CODE ;