2019-03-01 19:42:16 -08:00
// SPDX-License-Identifier: GPL-2.0
# include <test_progs.h>
void test_stacktrace_map ( void )
{
int control_map_fd , stackid_hmap_fd , stackmap_fd , stack_amap_fd ;
2021-12-13 19:59:28 -08:00
const char * prog_name = " oncpu " ;
2019-07-01 16:59:03 -07:00
int err , prog_fd , stack_trace_len ;
2022-09-01 22:22:53 +00:00
const char * file = " ./test_stacktrace_map.bpf.o " ;
2019-03-01 19:42:16 -08:00
__u32 key , val , duration = 0 ;
2019-07-01 16:59:03 -07:00
struct bpf_program * prog ;
2019-03-01 19:42:16 -08:00
struct bpf_object * obj ;
2019-07-01 16:59:03 -07:00
struct bpf_link * link ;
2019-03-01 19:42:16 -08:00
2021-11-03 15:08:44 -07:00
err = bpf_prog_test_load ( file , BPF_PROG_TYPE_TRACEPOINT , & obj , & prog_fd ) ;
2019-03-01 19:42:16 -08:00
if ( CHECK ( err , " prog_load " , " err %d errno %d \n " , err , errno ) )
return ;
2021-12-13 19:59:28 -08:00
prog = bpf_object__find_program_by_name ( obj , prog_name ) ;
2019-07-01 16:59:03 -07:00
if ( CHECK ( ! prog , " find_prog " , " prog '%s' not found \n " , prog_name ) )
2019-03-01 19:42:16 -08:00
goto close_prog ;
2019-07-01 16:59:03 -07:00
link = bpf_program__attach_tracepoint ( prog , " sched " , " sched_switch " ) ;
2021-05-24 20:59:32 -07:00
if ( ! ASSERT_OK_PTR ( link , " attach_tp " ) )
2019-03-01 19:42:16 -08:00
goto close_prog ;
/* find map fds */
control_map_fd = bpf_find_map ( __func__ , obj , " control_map " ) ;
2019-08-21 16:44:25 -07:00
if ( CHECK_FAIL ( control_map_fd < 0 ) )
2019-03-01 19:42:16 -08:00
goto disable_pmu ;
stackid_hmap_fd = bpf_find_map ( __func__ , obj , " stackid_hmap " ) ;
2019-08-21 16:44:25 -07:00
if ( CHECK_FAIL ( stackid_hmap_fd < 0 ) )
2019-03-01 19:42:16 -08:00
goto disable_pmu ;
stackmap_fd = bpf_find_map ( __func__ , obj , " stackmap " ) ;
2019-08-21 16:44:25 -07:00
if ( CHECK_FAIL ( stackmap_fd < 0 ) )
2019-03-01 19:42:16 -08:00
goto disable_pmu ;
stack_amap_fd = bpf_find_map ( __func__ , obj , " stack_amap " ) ;
2019-08-21 16:44:25 -07:00
if ( CHECK_FAIL ( stack_amap_fd < 0 ) )
2019-03-01 19:42:16 -08:00
goto disable_pmu ;
/* give some time for bpf program run */
sleep ( 1 ) ;
/* disable stack trace collection */
key = 0 ;
val = 1 ;
bpf_map_update_elem ( control_map_fd , & key , & val , 0 ) ;
/* for every element in stackid_hmap, we can find a corresponding one
* in stackmap , and vise versa .
*/
err = compare_map_keys ( stackid_hmap_fd , stackmap_fd ) ;
if ( CHECK ( err , " compare_map_keys stackid_hmap vs. stackmap " ,
" err %d errno %d \n " , err , errno ) )
2019-08-21 16:44:25 -07:00
goto disable_pmu ;
2019-03-01 19:42:16 -08:00
err = compare_map_keys ( stackmap_fd , stackid_hmap_fd ) ;
if ( CHECK ( err , " compare_map_keys stackmap vs. stackid_hmap " ,
" err %d errno %d \n " , err , errno ) )
2019-08-21 16:44:25 -07:00
goto disable_pmu ;
2019-03-01 19:42:16 -08:00
stack_trace_len = PERF_MAX_STACK_DEPTH * sizeof ( __u64 ) ;
err = compare_stack_ips ( stackmap_fd , stack_amap_fd , stack_trace_len ) ;
if ( CHECK ( err , " compare_stack_ips stackmap vs. stack_amap " ,
" err %d errno %d \n " , err , errno ) )
2019-08-21 16:44:25 -07:00
goto disable_pmu ;
2019-03-01 19:42:16 -08:00
disable_pmu :
2019-07-01 16:59:03 -07:00
bpf_link__destroy ( link ) ;
2019-03-01 19:42:16 -08:00
close_prog :
bpf_object__close ( obj ) ;
}