162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Return true if perf_event_paranoid is > $1 and not running as root. 562306a36Sopenharmony_cifunction ParanoidAndNotRoot() 662306a36Sopenharmony_ci{ 762306a36Sopenharmony_ci [ "$(id -u)" != 0 ] && [ "$(cat /proc/sys/kernel/perf_event_paranoid)" -gt $1 ] 862306a36Sopenharmony_ci} 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci# $1 name $2 extra_opt 1162306a36Sopenharmony_cicheck_no_args() 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci echo -n "Checking $1 output: no args " 1462306a36Sopenharmony_ci perf stat $2 true 1562306a36Sopenharmony_ci commachecker --no-args 1662306a36Sopenharmony_ci echo "[Success]" 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cicheck_system_wide() 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci echo -n "Checking $1 output: system wide " 2262306a36Sopenharmony_ci if ParanoidAndNotRoot 0 2362306a36Sopenharmony_ci then 2462306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 2562306a36Sopenharmony_ci return 2662306a36Sopenharmony_ci fi 2762306a36Sopenharmony_ci perf stat -a $2 true 2862306a36Sopenharmony_ci commachecker --system-wide 2962306a36Sopenharmony_ci echo "[Success]" 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cicheck_system_wide_no_aggr() 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci echo -n "Checking $1 output: system wide no aggregation " 3562306a36Sopenharmony_ci if ParanoidAndNotRoot 0 3662306a36Sopenharmony_ci then 3762306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 3862306a36Sopenharmony_ci return 3962306a36Sopenharmony_ci fi 4062306a36Sopenharmony_ci perf stat -A -a --no-merge $2 true 4162306a36Sopenharmony_ci commachecker --system-wide-no-aggr 4262306a36Sopenharmony_ci echo "[Success]" 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cicheck_interval() 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci echo -n "Checking $1 output: interval " 4862306a36Sopenharmony_ci perf stat -I 1000 $2 true 4962306a36Sopenharmony_ci commachecker --interval 5062306a36Sopenharmony_ci echo "[Success]" 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cicheck_event() 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci echo -n "Checking $1 output: event " 5662306a36Sopenharmony_ci perf stat -e cpu-clock $2 true 5762306a36Sopenharmony_ci commachecker --event 5862306a36Sopenharmony_ci echo "[Success]" 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cicheck_per_core() 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci echo -n "Checking $1 output: per core " 6462306a36Sopenharmony_ci if ParanoidAndNotRoot 0 6562306a36Sopenharmony_ci then 6662306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 6762306a36Sopenharmony_ci return 6862306a36Sopenharmony_ci fi 6962306a36Sopenharmony_ci perf stat --per-core -a $2 true 7062306a36Sopenharmony_ci commachecker --per-core 7162306a36Sopenharmony_ci echo "[Success]" 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cicheck_per_thread() 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci echo -n "Checking $1 output: per thread " 7762306a36Sopenharmony_ci if ParanoidAndNotRoot 0 7862306a36Sopenharmony_ci then 7962306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 8062306a36Sopenharmony_ci return 8162306a36Sopenharmony_ci fi 8262306a36Sopenharmony_ci perf stat --per-thread -a $2 true 8362306a36Sopenharmony_ci commachecker --per-thread 8462306a36Sopenharmony_ci echo "[Success]" 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cicheck_per_cache_instance() 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci echo -n "Checking $1 output: per cache instance " 9062306a36Sopenharmony_ci if ParanoidAndNotRoot 0 9162306a36Sopenharmony_ci then 9262306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 9362306a36Sopenharmony_ci return 9462306a36Sopenharmony_ci fi 9562306a36Sopenharmony_ci perf stat --per-cache -a $2 true 9662306a36Sopenharmony_ci commachecker --per-cache 9762306a36Sopenharmony_ci echo "[Success]" 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cicheck_per_die() 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci echo -n "Checking $1 output: per die " 10362306a36Sopenharmony_ci if ParanoidAndNotRoot 0 10462306a36Sopenharmony_ci then 10562306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 10662306a36Sopenharmony_ci return 10762306a36Sopenharmony_ci fi 10862306a36Sopenharmony_ci perf stat --per-die -a $2 true 10962306a36Sopenharmony_ci commachecker --per-die 11062306a36Sopenharmony_ci echo "[Success]" 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cicheck_per_node() 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci echo -n "Checking $1 output: per node " 11662306a36Sopenharmony_ci if ParanoidAndNotRoot 0 11762306a36Sopenharmony_ci then 11862306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 11962306a36Sopenharmony_ci return 12062306a36Sopenharmony_ci fi 12162306a36Sopenharmony_ci perf stat --per-node -a $2 true 12262306a36Sopenharmony_ci commachecker --per-node 12362306a36Sopenharmony_ci echo "[Success]" 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cicheck_per_socket() 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci echo -n "Checking $1 output: per socket " 12962306a36Sopenharmony_ci if ParanoidAndNotRoot 0 13062306a36Sopenharmony_ci then 13162306a36Sopenharmony_ci echo "[Skip] paranoid and not root" 13262306a36Sopenharmony_ci return 13362306a36Sopenharmony_ci fi 13462306a36Sopenharmony_ci perf stat --per-socket -a $2 true 13562306a36Sopenharmony_ci commachecker --per-socket 13662306a36Sopenharmony_ci echo "[Success]" 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci# The perf stat options for per-socket, per-core, per-die 14062306a36Sopenharmony_ci# and -A ( no_aggr mode ) uses the info fetched from this 14162306a36Sopenharmony_ci# directory: "/sys/devices/system/cpu/cpu*/topology". For 14262306a36Sopenharmony_ci# example, socket value is fetched from "physical_package_id" 14362306a36Sopenharmony_ci# file in topology directory. 14462306a36Sopenharmony_ci# Reference: cpu__get_topology_int in util/cpumap.c 14562306a36Sopenharmony_ci# If the platform doesn't expose topology information, values 14662306a36Sopenharmony_ci# will be set to -1. For example, incase of pSeries platform 14762306a36Sopenharmony_ci# of powerpc, value for "physical_package_id" is restricted 14862306a36Sopenharmony_ci# and set to -1. Check here validates the socket-id read from 14962306a36Sopenharmony_ci# topology file before proceeding further 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciFILE_LOC="/sys/devices/system/cpu/cpu*/topology/" 15262306a36Sopenharmony_ciFILE_NAME="physical_package_id" 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cifunction check_for_topology() 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci if ! ParanoidAndNotRoot 0 15762306a36Sopenharmony_ci then 15862306a36Sopenharmony_ci socket_file=`ls $FILE_LOC/$FILE_NAME | head -n 1` 15962306a36Sopenharmony_ci [ -z $socket_file ] && { 16062306a36Sopenharmony_ci echo 0 16162306a36Sopenharmony_ci return 16262306a36Sopenharmony_ci } 16362306a36Sopenharmony_ci socket_id=`cat $socket_file` 16462306a36Sopenharmony_ci [ $socket_id == -1 ] && { 16562306a36Sopenharmony_ci echo 1 16662306a36Sopenharmony_ci return 16762306a36Sopenharmony_ci } 16862306a36Sopenharmony_ci fi 16962306a36Sopenharmony_ci echo 0 17062306a36Sopenharmony_ci} 171