2019-05-28 20:10:09 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2015-03-25 22:49:26 +03:00
/* Copyright (c) 2015 PLUMgrid, http://plumgrid.com
*/
# include <stdio.h>
# include <stdlib.h>
# include <signal.h>
# include <unistd.h>
# include <stdbool.h>
# include <string.h>
# include <time.h>
2017-05-02 15:31:50 +03:00
2018-05-15 08:35:02 +03:00
# include <bpf/bpf.h>
2020-05-16 07:06:05 +03:00
# include <bpf/libbpf.h>
2015-03-25 22:49:26 +03:00
struct pair {
long long val ;
__u64 ip ;
} ;
static __u64 time_get_ns ( void )
{
struct timespec ts ;
clock_gettime ( CLOCK_MONOTONIC , & ts ) ;
return ts . tv_sec * 1000000000ull + ts . tv_nsec ;
}
static void print_old_objects ( int fd )
{
long long val = time_get_ns ( ) ;
__u64 key , next_key ;
struct pair v ;
2021-08-21 03:19:49 +03:00
key = write ( 1 , " \ e[1;1H \ e[2J " , 11 ) ; /* clear screen */
2015-03-25 22:49:26 +03:00
key = - 1 ;
2020-05-16 07:06:05 +03:00
while ( bpf_map_get_next_key ( fd , & key , & next_key ) = = 0 ) {
bpf_map_lookup_elem ( fd , & next_key , & v ) ;
2015-03-25 22:49:26 +03:00
key = next_key ;
if ( val - v . val < 1000000000ll )
/* object was allocated more then 1 sec ago */
continue ;
printf ( " obj 0x%llx is %2lldsec old was allocated at ip %llx \n " ,
next_key , ( val - v . val ) / 1000000000ll , v . ip ) ;
}
}
int main ( int ac , char * * argv )
{
2020-05-16 07:06:05 +03:00
struct bpf_link * links [ 2 ] ;
struct bpf_program * prog ;
struct bpf_object * obj ;
2015-03-25 22:49:26 +03:00
char filename [ 256 ] ;
2022-12-18 09:14:52 +03:00
int map_fd , j = 0 ;
2015-03-25 22:49:26 +03:00
2023-08-18 12:01:13 +03:00
snprintf ( filename , sizeof ( filename ) , " %s.bpf.o " , argv [ 0 ] ) ;
2020-05-16 07:06:05 +03:00
obj = bpf_object__open_file ( filename , NULL ) ;
if ( libbpf_get_error ( obj ) ) {
fprintf ( stderr , " ERROR: opening BPF object file failed \n " ) ;
return 0 ;
}
/* load BPF program */
if ( bpf_object__load ( obj ) ) {
fprintf ( stderr , " ERROR: loading BPF object file failed \n " ) ;
goto cleanup ;
}
map_fd = bpf_object__find_map_fd_by_name ( obj , " my_map " ) ;
if ( map_fd < 0 ) {
fprintf ( stderr , " ERROR: finding a map in obj file failed \n " ) ;
goto cleanup ;
}
bpf_object__for_each_program ( prog , obj ) {
links [ j ] = bpf_program__attach ( prog ) ;
if ( libbpf_get_error ( links [ j ] ) ) {
fprintf ( stderr , " ERROR: bpf_program__attach failed \n " ) ;
links [ j ] = NULL ;
goto cleanup ;
}
j + + ;
2015-03-25 22:49:26 +03:00
}
2022-12-18 09:14:52 +03:00
while ( 1 ) {
2020-05-16 07:06:05 +03:00
print_old_objects ( map_fd ) ;
2015-03-25 22:49:26 +03:00
sleep ( 1 ) ;
}
2020-05-16 07:06:05 +03:00
cleanup :
for ( j - - ; j > = 0 ; j - - )
bpf_link__destroy ( links [ j ] ) ;
bpf_object__close ( obj ) ;
2015-03-25 22:49:26 +03:00
return 0 ;
}