blob: 2d16cf543795bed3bba69fecbe1bb06c3c786445 [file] [log] [blame]
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# Copyright © 2024 Red Hat Inc, Arnaldo Carvalho de Melo <[email protected]>
#
# Use pahole to pretty print a perf.data file
# Check if the perf binary is available, if it is from a distro, normally it
# will get the needed DWARF info using libddebuginfod, we'll check if the
# needed types are available, skipping the test and informing the reason.
echo -n "Pretty printing of files using DWARF type information: "
perf=$(which perf 2> /dev/null)
if [ -z "$perf" ] ; then
echo "skip: No 'perf' binary available"
exit 2
fi
perf_lacks_type_info() {
local type_keyword=$1
local type_name=$2
if ! pahole -C $type_name $perf | grep -q "^$type_keyword $type_name {"; then
echo "skip: $perf doesn't have '$type_keyword $type_name' type info"
return 1
fi
return 0
}
perf_data=$(mktemp /tmp/prettify_perf.data.sh.XXXXXX.perf.data)
perf_lacks_type_info struct perf_event_header || exit 2
perf_lacks_type_info enum perf_event_type || exit 2
perf_lacks_type_info enum perf_user_event_type || exit 2
$perf record --quiet -o $perf_data sleep 0.00001
number_of_filtered_perf_record_metadata() {
local metadata_record=$1
local count=$(pahole -F dwarf -V $perf --header=perf_file_header --seek_bytes '$header.data.offset' --size_bytes='$header.data.size' -C "perf_event_header(sizeof,type,type_enum=perf_event_type+perf_user_event_type,filter=type==PERF_RECORD_$metadata_record)" --prettify $perf_data | grep ".type = PERF_RECORD_$metadata_record," | wc -l)
echo "$count"
}
check_expected_number_of_filtered_perf_record_metadata() {
local metadata_record=$1
local expected_records=$2
local nr_records=$(number_of_filtered_perf_record_metadata $metadata_record)
if [ "$nr_records" != "$expected_records" ] ; then
echo "FAIL: expected $expected_records PERF_RECORD_$metadata_record metadata records, got $nr_records"
return 1;
fi
return 0
}
check_expected_number_of_filtered_perf_record_metadata COMM 2 || exit 1
check_expected_number_of_filtered_perf_record_metadata EXIT 1 || exit 1
check_expected_number_of_filtered_perf_record_metadata TIME_CONV 1 || exit 1
check_expected_number_of_filtered_perf_record_metadata THREAD_MAP 1 || exit 1
check_expected_number_of_filtered_perf_record_metadata CPU_MAP 1 || exit 1
check_expected_number_of_filtered_perf_record_metadata FINISHED_INIT 1 || exit 1
# XXX write more tests that look at the events contents, not just for the presence of a known number of them
echo "Ok"
rm -f $perf_data