@ -14,6 +14,7 @@
# include "util/symbol.h"
# include "util/thread_map.h"
# include "util/pmu.h"
# include "event-parse.h"
# include "../../include/linux/hw_breakpoint.h"
# include <sys/mman.h>
@ -1207,6 +1208,87 @@ static int perf_evsel__roundtrip_name_test(void)
return ret ;
}
static int perf_evsel__test_field ( struct perf_evsel * evsel , const char * name ,
int size , bool should_be_signed )
{
struct format_field * field = perf_evsel__field ( evsel , name ) ;
int is_signed ;
int ret = 0 ;
if ( field = = NULL ) {
pr_debug ( " %s: \" %s \" field not found! \n " , evsel - > name , name ) ;
return - 1 ;
}
is_signed = ! ! ( field - > flags | FIELD_IS_SIGNED ) ;
if ( should_be_signed & & ! is_signed ) {
pr_debug ( " %s: \" %s \" signedness(%d) is wrong, should be %d \n " ,
evsel - > name , name , is_signed , should_be_signed ) ;
ret = - 1 ;
}
if ( field - > size ! = size ) {
pr_debug ( " %s: \" %s \" size (%d) should be %d! \n " ,
evsel - > name , name , field - > size , size ) ;
ret = - 1 ;
}
return 0 ;
}
static int perf_evsel__tp_sched_test ( void )
{
struct perf_evsel * evsel = perf_evsel__newtp ( " sched " , " sched_switch " , 0 ) ;
int ret = 0 ;
if ( evsel = = NULL ) {
pr_debug ( " perf_evsel__new \n " ) ;
return - 1 ;
}
if ( perf_evsel__test_field ( evsel , " prev_comm " , 16 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " prev_pid " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " prev_prio " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " prev_state " , 8 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " next_comm " , 16 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " next_pid " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " next_prio " , 4 , true ) )
ret = - 1 ;
perf_evsel__delete ( evsel ) ;
evsel = perf_evsel__newtp ( " sched " , " sched_wakeup " , 0 ) ;
if ( perf_evsel__test_field ( evsel , " comm " , 16 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " pid " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " prio " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " success " , 4 , true ) )
ret = - 1 ;
if ( perf_evsel__test_field ( evsel , " target_cpu " , 4 , true ) )
ret = - 1 ;
return 0 ;
}
static struct test {
const char * desc ;
int ( * func ) ( void ) ;
@ -1253,6 +1335,10 @@ static struct test {
. desc = " roundtrip evsel->name check " ,
. func = perf_evsel__roundtrip_name_test ,
} ,
{
. desc = " Check parsing of sched tracepoints fields " ,
. func = perf_evsel__tp_sched_test ,
} ,
{
. func = NULL ,
} ,