2015-08-12 09:37:53 +00:00
# include <linux/ptrace.h>
2015-08-06 07:02:36 +00:00
# include <linux/version.h>
# include <uapi/linux/bpf.h>
2020-01-20 14:06:49 +01:00
# include <bpf/bpf_helpers.h>
2015-08-06 07:02:36 +00:00
2017-06-02 21:03:53 -07:00
struct bpf_map_def SEC ( " maps " ) counters = {
2015-08-06 07:02:36 +00:00
. type = BPF_MAP_TYPE_PERF_EVENT_ARRAY ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( u32 ) ,
2017-06-02 21:03:53 -07:00
. max_entries = 64 ,
} ;
struct bpf_map_def SEC ( " maps " ) values = {
. type = BPF_MAP_TYPE_HASH ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( u64 ) ,
. max_entries = 64 ,
2015-08-06 07:02:36 +00:00
} ;
2017-10-05 09:19:21 -07:00
struct bpf_map_def SEC ( " maps " ) values2 = {
. type = BPF_MAP_TYPE_HASH ,
. key_size = sizeof ( int ) ,
. value_size = sizeof ( struct bpf_perf_event_value ) ,
. max_entries = 64 ,
} ;
2015-08-06 07:02:36 +00:00
2017-06-02 21:03:53 -07:00
SEC ( " kprobe/htab_map_get_next_key " )
2015-08-06 07:02:36 +00:00
int bpf_prog1 ( struct pt_regs * ctx )
{
u32 key = bpf_get_smp_processor_id ( ) ;
2017-06-02 21:03:53 -07: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 07:02:36 +00:00
2017-06-02 21:03:53 -07: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 07:02:36 +00:00
return 0 ;
}
2017-10-05 09:19:21 -07: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 07:02:36 +00:00
char _license [ ] SEC ( " license " ) = " GPL " ;
u32 _version SEC ( " version " ) = LINUX_VERSION_CODE ;