Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237#!/bin/bash# perf stat JSON output linter# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)# Checks various perf stat JSON output commands for the# correct number of fields.
set -e
skip_test=0
shelldir=$(dirname "$0")# shellcheck source=lib/setup_python.sh. "${shelldir}"/lib/setup_python.shpythonchecker=$(dirname $0)/lib/perf_json_output_lint.py
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 ]}
check_no_args(){ echo -n "Checking json output: no args " perf stat -j -o "${stat_output}" true $PYTHON $pythonchecker --no-args --file "${stat_output}" echo "[Success]"}
check_system_wide(){ echo -n "Checking json output: system wide " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi 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 no aggregation " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi 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 -o "${stat_output}" true $PYTHON $pythonchecker --interval --file "${stat_output}" echo "[Success]"}
check_event(){ echo -n "Checking json output: event " perf stat -j -e cpu-clock -o "${stat_output}" true $PYTHON $pythonchecker --event --file "${stat_output}" echo "[Success]"}
check_per_core(){ echo -n "Checking json output: per core " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi perf stat -j --per-core -a -o "${stat_output}" true $PYTHON $pythonchecker --per-core --file "${stat_output}" echo "[Success]"}
check_per_thread(){ echo -n "Checking json output: per thread " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi 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]"}
check_per_die(){ echo -n "Checking json output: per die " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi perf stat -j --per-die -a -o "${stat_output}" true $PYTHON $pythonchecker --per-die --file "${stat_output}" echo "[Success]"}
check_per_node(){ echo -n "Checking json output: per node " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi perf stat -j --per-node -a -o "${stat_output}" true $PYTHON $pythonchecker --per-node --file "${stat_output}" echo "[Success]"}
check_per_socket(){ echo -n "Checking json output: per socket " if ParanoidAndNotRoot 0 then echo "[Skip] paranoia and not root" return fi 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]"}
# The perf stat options for per-socket, per-core, per-die# and -A ( no_aggr mode ) uses the info fetched from this# directory: "/sys/devices/system/cpu/cpu*/topology". For# example, socket value is fetched from "physical_package_id"# file in topology directory.# Reference: cpu__get_topology_int in util/cpumap.c# If the platform doesn't expose topology information, values# will be set to -1. For example, incase of pSeries platform# of powerpc, value for "physical_package_id" is restricted# and set to -1. Check here validates the socket-id read from# topology file before proceeding further
FILE_LOC="/sys/devices/system/cpu/cpu*/topology/"FILE_NAME="physical_package_id"
check_for_topology(){ if ! ParanoidAndNotRoot 0 then socket_file=`ls $FILE_LOC/$FILE_NAME | head -n 1` [ -z $socket_file ] && return 0 socket_id=`cat $socket_file` [ $socket_id == -1 ] && skip_test=1 return 0 fi}
check_for_topologycheck_no_argscheck_system_widecheck_intervalcheck_eventcheck_per_threadcheck_per_nodecheck_metric_onlyif [ $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_socketelse echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"ficleanupexit 0