summaryrefslogtreecommitdiff
path: root/tools/perf/tests/shell/stat+json_output.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/tests/shell/stat+json_output.sh')
-rwxr-xr-xtools/perf/tests/shell/stat+json_output.sh106
1 files changed, 80 insertions, 26 deletions
diff --git a/tools/perf/tests/shell/stat+json_output.sh b/tools/perf/tests/shell/stat+json_output.sh
index 2c4212c641ed..85d1ad7186c6 100755
--- a/tools/perf/tests/shell/stat+json_output.sh
+++ b/tools/perf/tests/shell/stat+json_output.sh
@@ -8,31 +8,36 @@ set -e
skip_test=0
+shelldir=$(dirname "$0")
+# shellcheck source=lib/setup_python.sh
+. "${shelldir}"/lib/setup_python.sh
pythonchecker=$(dirname $0)/lib/perf_json_output_lint.py
-if [ "x$PYTHON" == "x" ]
-then
- if which python3 > /dev/null
- then
- PYTHON=python3
- elif which python > /dev/null
- then
- PYTHON=python
- else
- echo Skipping test, python not detected please set environment variable PYTHON.
- exit 2
- fi
-fi
+
+stat_output=$(mktemp /tmp/__perf_test.stat_output.json.XXXXX)
+
+cleanup() {
+ rm -f "${stat_output}"
+
+ trap - EXIT TERM INT
+}
+
+trap_cleanup() {
+ cleanup
+ exit 1
+}
+trap trap_cleanup EXIT TERM INT
# Return true if perf_event_paranoid is > $1 and not running as root.
function ParanoidAndNotRoot()
{
- [ $(id -u) != 0 ] && [ $(cat /proc/sys/kernel/perf_event_paranoid) -gt $1 ]
+ [ "$(id -u)" != 0 ] && [ "$(cat /proc/sys/kernel/perf_event_paranoid)" -gt $1 ]
}
check_no_args()
{
echo -n "Checking json output: no args "
- perf stat -j true 2>&1 | $PYTHON $pythonchecker --no-args
+ perf stat -j -o "${stat_output}" true
+ $PYTHON $pythonchecker --no-args --file "${stat_output}"
echo "[Success]"
}
@@ -44,27 +49,29 @@ check_system_wide()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j -a true 2>&1 | $PYTHON $pythonchecker --system-wide
+ perf stat -j -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --system-wide --file "${stat_output}"
echo "[Success]"
}
check_system_wide_no_aggr()
{
- echo -n "Checking json output: system wide "
+ echo -n "Checking json output: system wide no aggregation "
if ParanoidAndNotRoot 0
then
echo "[Skip] paranoia and not root"
return
fi
- echo -n "Checking json output: system wide no aggregation "
- perf stat -j -A -a --no-merge true 2>&1 | $PYTHON $pythonchecker --system-wide-no-aggr
+ perf stat -j -A -a --no-merge -o "${stat_output}" true
+ $PYTHON $pythonchecker --system-wide-no-aggr --file "${stat_output}"
echo "[Success]"
}
check_interval()
{
echo -n "Checking json output: interval "
- perf stat -j -I 1000 true 2>&1 | $PYTHON $pythonchecker --interval
+ perf stat -j -I 1000 -o "${stat_output}" true
+ $PYTHON $pythonchecker --interval --file "${stat_output}"
echo "[Success]"
}
@@ -72,7 +79,8 @@ check_interval()
check_event()
{
echo -n "Checking json output: event "
- perf stat -j -e cpu-clock true 2>&1 | $PYTHON $pythonchecker --event
+ perf stat -j -e cpu-clock -o "${stat_output}" true
+ $PYTHON $pythonchecker --event --file "${stat_output}"
echo "[Success]"
}
@@ -84,7 +92,8 @@ check_per_core()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-core -a true 2>&1 | $PYTHON $pythonchecker --per-core
+ perf stat -j --per-core -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-core --file "${stat_output}"
echo "[Success]"
}
@@ -96,7 +105,32 @@ check_per_thread()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-thread -a true 2>&1 | $PYTHON $pythonchecker --per-thread
+ perf stat -j --per-thread -p $$ -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-thread --file "${stat_output}"
+ echo "[Success]"
+}
+
+check_per_cache_instance()
+{
+ echo -n "Checking json output: per cache_instance "
+ if ParanoidAndNotRoot 0
+ then
+ echo "[Skip] paranoia and not root"
+ return
+ fi
+ perf stat -j --per-cache -a true 2>&1 | $PYTHON $pythonchecker --per-cache
+ echo "[Success]"
+}
+
+check_per_cluster()
+{
+ echo -n "Checking json output: per cluster "
+ if ParanoidAndNotRoot 0
+ then
+ echo "[Skip] paranoia and not root"
+ return
+ fi
+ perf stat -j --per-cluster -a true 2>&1 | $PYTHON $pythonchecker --per-cluster
echo "[Success]"
}
@@ -108,7 +142,8 @@ check_per_die()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-die -a true 2>&1 | $PYTHON $pythonchecker --per-die
+ perf stat -j --per-die -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-die --file "${stat_output}"
echo "[Success]"
}
@@ -120,7 +155,8 @@ check_per_node()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-node -a true 2>&1 | $PYTHON $pythonchecker --per-node
+ perf stat -j --per-node -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-node --file "${stat_output}"
echo "[Success]"
}
@@ -132,7 +168,21 @@ check_per_socket()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-socket -a true 2>&1 | $PYTHON $pythonchecker --per-socket
+ perf stat -j --per-socket -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-socket --file "${stat_output}"
+ echo "[Success]"
+}
+
+check_metric_only()
+{
+ echo -n "Checking json output: metric only "
+ if [ "$(uname -m)" = "s390x" ] && ! grep '^facilities' /proc/cpuinfo | grep -qw 67
+ then
+ echo "[Skip] CPU-measurement counter facility not installed"
+ return
+ fi
+ perf stat -j --metric-only -M page_faults_per_second -o "${stat_output}" true
+ $PYTHON $pythonchecker --metric-only --file "${stat_output}"
echo "[Success]"
}
@@ -170,13 +220,17 @@ check_interval
check_event
check_per_thread
check_per_node
+check_metric_only
if [ $skip_test -ne 1 ]
then
check_system_wide_no_aggr
check_per_core
+ check_per_cache_instance
+ check_per_cluster
check_per_die
check_per_socket
else
echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"
fi
+cleanup
exit 0