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