We need a simple method to test Perf with Arm CoreSight drivers, this could be used for smoke testing when new patch is coming for perf or CoreSight drivers, and we also can use the test to confirm if the CoreSight has been enabled successfully on new platforms.
This patch introduces the shell script test_arm_coresight.sh which is under the 'pert test' framework. Simply to say, the testing rationale is source oriented testing, it traverses every source (now only refers to ETM device) and test its all possible sinks. To search the complete paths from one specific source to its sinks, this patch relies on the sysfs '/sys/bus/coresight/devices/devX/out:Y' for depth-first search (DFS) for iteration connected device nodes, if the output device is detected as one of ETR, ETF, or ETB types then it will test trace data recording and decoding for this PMU device.
The script runs three output testings for every trace data: - Test branch samples dumping with 'perf script' command; - Test branch samples reporting with 'perf report' command; - Use option '--itrace=i1000i' to insert synthesized instructions events and the script will check if perf can output the percentage value successfully based on the instruction samples.
If any device fails for the testing, the test will report failure and directly exit with error. This test will be only applied on the platform with PMU event 'cs_etm//', otherwise will skip the testing.
Below is detailed usage for it:
# cd $linux/tools/perf -> This is important so can use shell script # perf test list
[...]
61: Check Arm CoreSight trace data recording and branch samples 62: Check open filename arg using perf trace + vfs_getname 63: Zstd perf.data compression/decompression 64: Add vfs_getname probe to get syscall args filenames
# perf test 61
61: Check Arm CoreSight trace data recording and branch samples: Ok
Signed-off-by: Leo Yan leo.yan@linaro.org --- tools/perf/tests/shell/test_arm_coresight.sh | 120 +++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100755 tools/perf/tests/shell/test_arm_coresight.sh
diff --git a/tools/perf/tests/shell/test_arm_coresight.sh b/tools/perf/tests/shell/test_arm_coresight.sh new file mode 100755 index 000000000000..7b1fa17a4512 --- /dev/null +++ b/tools/perf/tests/shell/test_arm_coresight.sh @@ -0,0 +1,120 @@ +#!/bin/sh +# Check Arm CoreSight trace data recording and branch samples + +# Uses the 'perf record' to record trace data with Arm CoreSight sinks; +# then verify if there have any branch samples and instruction samples +# are generated by CoreSight with 'perf script' and 'perf report' +# commands. + +# Leo Yan leo.yan@linaro.org, 2019 + +perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) +file=$(mktemp /tmp/temporary_file.XXXXX) + +skip_if_no_cs_etm_event() { + perf list | grep -q 'cs_etm//' && return 0 + + # cs_etm event doesn't exist + return 2 +} + +skip_if_no_cs_etm_event || exit 2 + +record_touch_file() { + echo "Recording trace (only user mode) with path: CPU$2 => $1" + perf record -o ${perfdata} -e cs_etm/@$1/u --per-thread \ + -- taskset -c $2 touch $file +} + +perf_script_branch_samples() { + echo "Looking at perf.data file for dumping branch samples:" + + # Below is an example of the branch samples dumping: + # touch 6512 1 branches:u: ffffb220824c strcmp+0xc (/lib/aarch64-linux-gnu/ld-2.27.so) + # touch 6512 1 branches:u: ffffb22082e0 strcmp+0xa0 (/lib/aarch64-linux-gnu/ld-2.27.so) + # touch 6512 1 branches:u: ffffb2208320 strcmp+0xe0 (/lib/aarch64-linux-gnu/ld-2.27.so) + perf script -F,-time -i ${perfdata} | \ + egrep " +touch +[0-9]+ .* +branches:([u|k]:)? +" +} + +perf_report_branch_samples() { + echo "Looking at perf.data file for reporting branch samples:" + + # Below is an example of the branch samples reporting: + # 73.04% 73.04% touch libc-2.27.so [.] _dl_addr + # 7.71% 7.71% touch libc-2.27.so [.] getenv + # 2.59% 2.59% touch ld-2.27.so [.] strcmp + perf report --stdio -i ${perfdata} | \ + egrep " +[0-9]+.[0-9]+% +[0-9]+.[0-9]+% +touch " +} + +perf_report_instruction_samples() { + echo "Looking at perf.data file for instruction samples:" + + # Below is an example of the instruction samples reporting: + # 68.12% touch libc-2.27.so [.] _dl_addr + # 5.80% touch libc-2.27.so [.] getenv + # 4.35% touch ld-2.27.so [.] _dl_fixup + perf report --itrace=i1000i --stdio -i ${perfdata} | \ + egrep " +[0-9]+.[0-9]+% +touch" +} + +arm_cs_iterate_devices() { + for dev in $1/out:*; do + + # Skip testing if it's not a directory + ! [ -d $dev ] && continue; + + # Read out its symbol link file name + path=`readlink -f $dev` + + # Extract device name from path, e.g. + # path = '/sys/devices/platform/20010000.etf/tmc_etf0' + # `> device_name = 'tmc_etf0' + device_name=`echo $path | awk -F/ '{print $(NF)}'` + + echo $device_name | egrep -q "etr|etb|etf" + + # Only test if the output device is ETR/ETB/ETF + if [ $? -eq 0 ]; then + + pmu_dev="/sys/bus/event_source/devices/cs_etm/sinks/$device_name" + + # Exit if PMU device node doesn't exist + if ! [ -f $pmu_dev ]; then + echo "PMU device $pmu_dev doesn't exist" + exit 1 + fi + + record_touch_file $device_name $2 && + perf_script_branch_samples && + perf_report_branch_samples && + perf_report_instruction_samples + + err=$? + + # Exit when find failure + [ $err != 0 ] && exit $err + + rm -f ${perfdata} + rm -f ${file} + fi + + arm_cs_iterate_devices $dev $2 + done +} + +arm_cs_etm_test() { + # Iterate for every ETM device + for dev in /sys/bus/coresight/devices/etm*; do + + # Find the ETM device belonging to which CPU + cpu=`cat $dev/cpu` + + # Use depth-first search (DFS) to iterate outputs + arm_cs_iterate_devices $dev $cpu + done +} + +arm_cs_etm_test +exit 0
Hi all,
On Tue, May 28, 2019 at 07:11:39PM +0800, Leo Yan wrote:
We need a simple method to test Perf with Arm CoreSight drivers, this could be used for smoke testing when new patch is coming for perf or CoreSight drivers, and we also can use the test to confirm if the CoreSight has been enabled successfully on new platforms.
This patch introduces the shell script test_arm_coresight.sh which is under the 'pert test' framework. Simply to say, the testing rationale is source oriented testing, it traverses every source (now only refers to ETM device) and test its all possible sinks. To search the complete paths from one specific source to its sinks, this patch relies on the sysfs '/sys/bus/coresight/devices/devX/out:Y' for depth-first search (DFS) for iteration connected device nodes, if the output device is detected as one of ETR, ETF, or ETB types then it will test trace data recording and decoding for this PMU device.
The script runs three output testings for every trace data:
- Test branch samples dumping with 'perf script' command;
- Test branch samples reporting with 'perf report' command;
- Use option '--itrace=i1000i' to insert synthesized instructions events and the script will check if perf can output the percentage value successfully based on the instruction samples.
If any device fails for the testing, the test will report failure and directly exit with error. This test will be only applied on the platform with PMU event 'cs_etm//', otherwise will skip the testing.
Below is detailed usage for it:
# cd $linux/tools/perf -> This is important so can use shell script # perf test list
[...] 61: Check Arm CoreSight trace data recording and branch samples 62: Check open filename arg using perf trace + vfs_getname 63: Zstd perf.data compression/decompression 64: Add vfs_getname probe to get syscall args filenames
# perf test 61
61: Check Arm CoreSight trace data recording and branch samples: Ok
Signed-off-by: Leo Yan leo.yan@linaro.org
Since Suzuki has sent out device connection via sysfs patches [1], thus I applied this patch on top of dependent patches (Suzuki's device connection via sysfs patches + APCI binding patches).
Uploaded the whole things on git server [2] in case you want to know the whole context and test this patch. Any suggestion or comment is appreciate :)
Thanks, Leo Yan
[1] https://archive.armlinux.org.uk/lurker/message/20190530.164454.064a07af.en.h... [2] https://git.linaro.org/people/leo.yan/linux-coresight.git/log/?h=coresight_p...