Re: [PATCH v5] perf test: Introduce script for Arm CoreSight testing

2020-09-07 Thread Leo Yan
Hi Mathieu,

On Fri, Sep 04, 2020 at 03:33:32PM -0600, Mathieu Poirier wrote:

[...]

> > 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 ..8696bb5df45a
> > --- /dev/null
> > +++ b/tools/perf/tests/shell/test_arm_coresight.sh
> > @@ -0,0 +1,175 @@
> > +#!/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.
> > +
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Leo Yan , 2020
> > +
> > +perfdata=$(mktemp /tmp/__perf_test.perf.data.X)
> > +file=$(mktemp /tmp/temporary_file.X)
> > +
> > +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"
> > +   rm -f $file
> > +   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:  b220824c 
> > strcmp+0xc (/lib/aarch64-linux-gnu/ld-2.27.so)
> > +   #   touch  6512  1 branches:u:  b22082e0 
> > strcmp+0xa0 (/lib/aarch64-linux-gnu/ld-2.27.so)
> > +   #   touch  6512  1 branches:u:  b2208320 
> > strcmp+0xe0 (/lib/aarch64-linux-gnu/ld-2.27.so)
> > +   perf script -F,-time -i ${perfdata} | \
> > +   egrep " +$1 +[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%  touchlibc-2.27.so  [.] _dl_addr
> > +   #7.71% 7.71%  touchlibc-2.27.so  [.] getenv
> > +   #2.59% 2.59%  touchld-2.27.so[.] strcmp
> > +   perf report --stdio -i ${perfdata} | \
> > +   egrep " +[0-9]+\.[0-9]+% +[0-9]+\.[0-9]+% +$1 "
> > +}
> > +
> > +perf_report_instruction_samples() {
> > +   echo "Looking at perf.data file for instruction samples:"
> > +
> > +   # Below is an example of the instruction samples reporting:
> > +   #   68.12%  touchlibc-2.27.so   [.] _dl_addr
> > +   #5.80%  touchlibc-2.27.so   [.] getenv
> > +   #4.35%  touchld-2.27.so [.] _dl_fixup
> > +   perf report --itrace=i1000i --stdio -i ${perfdata} | \
> > +   egrep " +[0-9]+\.[0-9]+% +$1"
> > +}
> > +
> > +arm_cs_iterate_devices() {
> > +   for dev in $1/connections/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/2001.etf/tmc_etf0'
> > +   # `> device_name = 'tmc_etf0'
> > +   device_name=`echo $path | awk -F/ '{print $(NF)}'`
> > +
> > +
> > +   # If the node of "enable_sink" is existed under the device 
> > path, this
> > +   # means the device is a sink device.  Need to exclude 'tpiu' 
> > since it
> > +   # cannot support perf PMU.
> > +   echo $device_name | egrep -q -v "tpiu"
> > +   if [ $? -eq 0 -a -e "$path/enable_sink" ]; then
> > +
> > +   
> > pmu_dev="/sys/bus/event_source/devices/cs_etm/sinks/$device_name"
> > +
> > +   # Exit if the sink device is supported by PMU or not
> > +   if ! [ -f $pmu_dev ]; then
> > +   echo "PMU doesn't support $pmu_dev"
> > +   exit 1
> > +   fi
> > +
> > +   record_touch_file $device_name $2 &&
> > +   perf_script_branch_samples touch &&
> > +   perf_report_branch_samples touch &&
> > +   perf_report_instruction_samples touch
> 
> Did you want to have an extra tab after the first line?  I think it makes the
> code harder to read, but that's a personal opinion. 

Thanks for the reviewing!  Have removed the extra tab in patch v6.

> > +
> > +   err=$?
> > +
> > +   # Exit when find failure
> > +   [ $err != 0 ] && exit $err
> 
> If a problem occurs ${perfdata} and ${file} are not removed.  The same is true
> in several instances below.

Have fixed to remove ${perfdata} and 

Re: [PATCH v5] perf test: Introduce script for Arm CoreSight testing

2020-09-04 Thread Mathieu Poirier
Hi Leo,

On Tue, Aug 18, 2020 at 01:49:27PM +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.  This script provides three testing
> scenarios:
> 
> Test scenario 1: traverse all possible paths between source and sink
> 
> For traversing possible paths, 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 a sink device (the script will exclude TPIU device which can
> not be supported for perf PMU), then it will test trace data recording
> and decoding for it.
> 
> 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.
> 
> Test scenario 2: system-wide test
> 
> For system-wide testing, it passes option '-a' to perf tool to enable
> tracing on all CPUs, so it's hard to say which program will be traced.
> But perf tool itself contributes much overload in this case, so it will
> parse trace data and check if process 'perf' can be detected or not.
> 
> Test scenario 3: snapshot mode test.
> 
> For snapshot mode testing, it uses 'dd' command to launch a long running
> program, so this can give chance to send signal -USR2; it will check the
> captured trace data contains 'dd' related thread info or not.
> 
> If any test fails, it will report failure and directly exit with error.
> This test will be only applied on a 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
> [...]
> 65: probe libc's inet_pton & backtrace it with ping
> 66: Check Arm CoreSight trace data recording and branch samples
> 67: Check open filename arg using perf trace + vfs_getname
> 68: Zstd perf.data compression/decompression
> 69: Add vfs_getname probe to get syscall args filenames
> 70: Use vfs_getname probe to get syscall args filenames
> 
>   # perf test 66
> 66: Check Arm CoreSight trace data recording and branch samples: Ok
> 
> Signed-off-by: Leo Yan 
> ---
> 
> Changes in v5:
> - Fixed testing name to system-wide testing (Suzuki);
> - Used 'enable_sink' existence to check if the device is a sink (Suzuki);
> - Excluded TPIU from sink devices;
> - Fixed Misleading output (Suzuki);
> - Removed '--per-thread' option from snapshot testing (Suzuki).
> 
>  tools/perf/tests/shell/test_arm_coresight.sh | 175 +++
>  1 file changed, 175 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 ..8696bb5df45a
> --- /dev/null
> +++ b/tools/perf/tests/shell/test_arm_coresight.sh
> @@ -0,0 +1,175 @@
> +#!/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.
> +
> +# SPDX-License-Identifier: GPL-2.0
> +# Leo Yan , 2020
> +
> +perfdata=$(mktemp /tmp/__perf_test.perf.data.X)
> +file=$(mktemp /tmp/temporary_file.X)
> +
> +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"
> + rm -f $file
> + 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:  b220824c 
> strcmp+0xc (/lib/aarch64-linux-gnu/ld-2.27.so)
> + #   touch  6512  1 branches:u:  b22082e0 
> 

Re: [PATCH v5] perf test: Introduce script for Arm CoreSight testing

2020-09-01 Thread Leo Yan
Hi Mathieu,

On Tue, Aug 18, 2020 at 01:49:27PM +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.

Could you review this patch?

Thanks!
Leo

> This patch introduces the shell script test_arm_coresight.sh which is
> under the 'pert test' framework.  This script provides three testing
> scenarios:
> 
> Test scenario 1: traverse all possible paths between source and sink
> 
> For traversing possible paths, 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 a sink device (the script will exclude TPIU device which can
> not be supported for perf PMU), then it will test trace data recording
> and decoding for it.
> 
> 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.
> 
> Test scenario 2: system-wide test
> 
> For system-wide testing, it passes option '-a' to perf tool to enable
> tracing on all CPUs, so it's hard to say which program will be traced.
> But perf tool itself contributes much overload in this case, so it will
> parse trace data and check if process 'perf' can be detected or not.
> 
> Test scenario 3: snapshot mode test.
> 
> For snapshot mode testing, it uses 'dd' command to launch a long running
> program, so this can give chance to send signal -USR2; it will check the
> captured trace data contains 'dd' related thread info or not.
> 
> If any test fails, it will report failure and directly exit with error.
> This test will be only applied on a 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
> [...]
> 65: probe libc's inet_pton & backtrace it with ping
> 66: Check Arm CoreSight trace data recording and branch samples
> 67: Check open filename arg using perf trace + vfs_getname
> 68: Zstd perf.data compression/decompression
> 69: Add vfs_getname probe to get syscall args filenames
> 70: Use vfs_getname probe to get syscall args filenames
> 
>   # perf test 66
> 66: Check Arm CoreSight trace data recording and branch samples: Ok
> 
> Signed-off-by: Leo Yan 
> ---
> 
> Changes in v5:
> - Fixed testing name to system-wide testing (Suzuki);
> - Used 'enable_sink' existence to check if the device is a sink (Suzuki);
> - Excluded TPIU from sink devices;
> - Fixed Misleading output (Suzuki);
> - Removed '--per-thread' option from snapshot testing (Suzuki).
> 
>  tools/perf/tests/shell/test_arm_coresight.sh | 175 +++
>  1 file changed, 175 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 ..8696bb5df45a
> --- /dev/null
> +++ b/tools/perf/tests/shell/test_arm_coresight.sh
> @@ -0,0 +1,175 @@
> +#!/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.
> +
> +# SPDX-License-Identifier: GPL-2.0
> +# Leo Yan , 2020
> +
> +perfdata=$(mktemp /tmp/__perf_test.perf.data.X)
> +file=$(mktemp /tmp/temporary_file.X)
> +
> +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"
> + rm -f $file
> + 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:  b220824c 
> strcmp+0xc (/lib/aarch64-linux-gnu/ld-2.27.so)
> + #   touch  6512  1  

[PATCH v5] perf test: Introduce script for Arm CoreSight testing

2020-08-17 Thread Leo Yan
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.  This script provides three testing
scenarios:

Test scenario 1: traverse all possible paths between source and sink

For traversing possible paths, 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 a sink device (the script will exclude TPIU device which can
not be supported for perf PMU), then it will test trace data recording
and decoding for it.

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.

Test scenario 2: system-wide test

For system-wide testing, it passes option '-a' to perf tool to enable
tracing on all CPUs, so it's hard to say which program will be traced.
But perf tool itself contributes much overload in this case, so it will
parse trace data and check if process 'perf' can be detected or not.

Test scenario 3: snapshot mode test.

For snapshot mode testing, it uses 'dd' command to launch a long running
program, so this can give chance to send signal -USR2; it will check the
captured trace data contains 'dd' related thread info or not.

If any test fails, it will report failure and directly exit with error.
This test will be only applied on a 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
[...]
65: probe libc's inet_pton & backtrace it with ping
66: Check Arm CoreSight trace data recording and branch samples
67: Check open filename arg using perf trace + vfs_getname
68: Zstd perf.data compression/decompression
69: Add vfs_getname probe to get syscall args filenames
70: Use vfs_getname probe to get syscall args filenames

  # perf test 66
66: Check Arm CoreSight trace data recording and branch samples: Ok

Signed-off-by: Leo Yan 
---

Changes in v5:
- Fixed testing name to system-wide testing (Suzuki);
- Used 'enable_sink' existence to check if the device is a sink (Suzuki);
- Excluded TPIU from sink devices;
- Fixed Misleading output (Suzuki);
- Removed '--per-thread' option from snapshot testing (Suzuki).

 tools/perf/tests/shell/test_arm_coresight.sh | 175 +++
 1 file changed, 175 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 ..8696bb5df45a
--- /dev/null
+++ b/tools/perf/tests/shell/test_arm_coresight.sh
@@ -0,0 +1,175 @@
+#!/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.
+
+# SPDX-License-Identifier: GPL-2.0
+# Leo Yan , 2020
+
+perfdata=$(mktemp /tmp/__perf_test.perf.data.X)
+file=$(mktemp /tmp/temporary_file.X)
+
+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"
+   rm -f $file
+   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:  b220824c 
strcmp+0xc (/lib/aarch64-linux-gnu/ld-2.27.so)
+   #   touch  6512  1 branches:u:  b22082e0 
strcmp+0xa0 (/lib/aarch64-linux-gnu/ld-2.27.so)
+   #   touch  6512  1 branches:u:  b2208320 
strcmp+0xe0 (/lib/aarch64-linux-gnu/ld-2.27.so)
+   perf script -F,-time -i ${perfdata} | \
+   egrep " +$1 +[0-9]+ .* +branches:([u|k]:)? +"
+}
+