2017-04-17 17:39:06 +03:00
# include <linux/kernel.h>
2014-04-25 23:31:02 +04:00
# include <linux/types.h>
2013-09-05 00:18:16 +04:00
# include <stddef.h>
# include "tests.h"
# include "event.h"
# include "evlist.h"
# include "header.h"
2014-07-15 01:46:48 +04:00
# include "debug.h"
2022-10-26 23:24:27 +03:00
# include "util/sample.h"
2013-09-05 00:18:16 +04:00
2019-07-21 14:23:52 +03:00
static int process_event ( struct evlist * * pevlist , union perf_event * event )
2013-09-05 00:18:16 +04:00
{
struct perf_sample sample ;
if ( event - > header . type = = PERF_RECORD_HEADER_ATTR ) {
if ( perf_event__process_attr ( NULL , event , pevlist ) ) {
pr_debug ( " perf_event__process_attr failed \n " ) ;
return - 1 ;
}
return 0 ;
}
if ( event - > header . type > = PERF_RECORD_USER_TYPE_START )
return - 1 ;
if ( ! * pevlist )
return - 1 ;
2020-11-30 15:43:07 +03:00
if ( evlist__parse_sample ( * pevlist , event , & sample ) ) {
pr_debug ( " evlist__parse_sample failed \n " ) ;
2013-09-05 00:18:16 +04:00
return - 1 ;
}
return 0 ;
}
static int process_events ( union perf_event * * events , size_t count )
{
2019-07-21 14:23:52 +03:00
struct evlist * evlist = NULL ;
2013-09-05 00:18:16 +04:00
int err = 0 ;
size_t i ;
for ( i = 0 ; i < count & & ! err ; i + + )
err = process_event ( & evlist , events [ i ] ) ;
2019-07-21 14:23:56 +03:00
evlist__delete ( evlist ) ;
2013-09-05 00:18:16 +04:00
return err ;
}
struct test_attr_event {
2017-02-14 21:04:48 +03:00
struct perf_event_header header ;
struct perf_event_attr attr ;
2013-09-05 00:18:16 +04:00
u64 id ;
} ;
/**
* test__parse_no_sample_id_all - test parsing with no sample_id_all bit set .
*
* This function tests parsing data produced on kernel ' s that do not support the
* sample_id_all bit . Without the sample_id_all bit , non - sample events ( such as
* mmap events ) do not have an id sample appended , and consequently logic
* designed to determine the id will not work . That case happens when there is
* more than one selected event , so this test processes three events : 2
* attributes representing the selected events and one mmap event .
*
* Return : % 0 on success , % - 1 if the test fails .
*/
2021-11-04 09:41:51 +03:00
static int test__parse_no_sample_id_all ( struct test_suite * test __maybe_unused ,
2021-11-04 09:41:50 +03:00
int subtest __maybe_unused )
2013-09-05 00:18:16 +04:00
{
int err ;
struct test_attr_event event1 = {
2017-02-14 21:04:48 +03:00
. header = {
. type = PERF_RECORD_HEADER_ATTR ,
. size = sizeof ( struct test_attr_event ) ,
2013-09-05 00:18:16 +04:00
} ,
. id = 1 ,
} ;
struct test_attr_event event2 = {
2017-02-14 21:04:48 +03:00
. header = {
. type = PERF_RECORD_HEADER_ATTR ,
. size = sizeof ( struct test_attr_event ) ,
2013-09-05 00:18:16 +04:00
} ,
. id = 2 ,
} ;
2019-08-27 01:02:31 +03:00
struct perf_record_mmap event3 = {
2013-09-05 00:18:16 +04:00
. header = {
. type = PERF_RECORD_MMAP ,
2019-08-27 01:02:31 +03:00
. size = sizeof ( struct perf_record_mmap ) ,
2013-09-05 00:18:16 +04:00
} ,
} ;
union perf_event * events [ ] = {
( union perf_event * ) & event1 ,
( union perf_event * ) & event2 ,
( union perf_event * ) & event3 ,
} ;
err = process_events ( events , ARRAY_SIZE ( events ) ) ;
if ( err )
return - 1 ;
return 0 ;
}
2021-11-04 09:41:50 +03:00
DEFINE_SUITE ( " Parse with no sample_id_all bit set " , parse_no_sample_id_all ) ;