1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# Return true if perf_event_paranoid is > $1 and not running as root.
5function ParanoidAndNotRoot()
6{
7	 [ "$(id -u)" != 0 ] && [ "$(cat /proc/sys/kernel/perf_event_paranoid)" -gt $1 ]
8}
9
10# $1 name $2 extra_opt
11check_no_args()
12{
13        echo -n "Checking $1 output: no args "
14        perf stat $2 true
15        commachecker --no-args
16        echo "[Success]"
17}
18
19check_system_wide()
20{
21	echo -n "Checking $1 output: system wide "
22	if ParanoidAndNotRoot 0
23	then
24		echo "[Skip] paranoid and not root"
25		return
26	fi
27	perf stat -a $2 true
28	commachecker --system-wide
29	echo "[Success]"
30}
31
32check_system_wide_no_aggr()
33{
34	echo -n "Checking $1 output: system wide no aggregation "
35	if ParanoidAndNotRoot 0
36	then
37		echo "[Skip] paranoid and not root"
38		return
39	fi
40	perf stat -A -a --no-merge $2 true
41	commachecker --system-wide-no-aggr
42	echo "[Success]"
43}
44
45check_interval()
46{
47	echo -n "Checking $1 output: interval "
48	perf stat -I 1000 $2 true
49	commachecker --interval
50	echo "[Success]"
51}
52
53check_event()
54{
55	echo -n "Checking $1 output: event "
56	perf stat -e cpu-clock $2 true
57	commachecker --event
58	echo "[Success]"
59}
60
61check_per_core()
62{
63	echo -n "Checking $1 output: per core "
64	if ParanoidAndNotRoot 0
65	then
66		echo "[Skip] paranoid and not root"
67		return
68	fi
69	perf stat --per-core -a $2 true
70	commachecker --per-core
71	echo "[Success]"
72}
73
74check_per_thread()
75{
76	echo -n "Checking $1 output: per thread "
77	if ParanoidAndNotRoot 0
78	then
79		echo "[Skip] paranoid and not root"
80		return
81	fi
82	perf stat --per-thread -p $$ $2 true
83	commachecker --per-thread
84	echo "[Success]"
85}
86
87check_per_cache_instance()
88{
89	echo -n "Checking $1 output: per cache instance "
90	if ParanoidAndNotRoot 0
91	then
92		echo "[Skip] paranoid and not root"
93		return
94	fi
95	perf stat --per-cache -a $2 true
96	commachecker --per-cache
97	echo "[Success]"
98}
99
100check_per_cluster()
101{
102	echo -n "Checking $1 output: per cluster "
103	if ParanoidAndNotRoot 0
104	then
105		echo "[Skip] paranoid and not root"
106		return
107	fi
108	perf stat --per-cluster -a $2 true
109	echo "[Success]"
110}
111
112check_per_die()
113{
114	echo -n "Checking $1 output: per die "
115	if ParanoidAndNotRoot 0
116	then
117		echo "[Skip] paranoid and not root"
118		return
119	fi
120	perf stat --per-die -a $2 true
121	commachecker --per-die
122	echo "[Success]"
123}
124
125check_per_node()
126{
127	echo -n "Checking $1 output: per node "
128	if ParanoidAndNotRoot 0
129	then
130		echo "[Skip] paranoid and not root"
131		return
132	fi
133	perf stat --per-node -a $2 true
134	commachecker --per-node
135	echo "[Success]"
136}
137
138check_per_socket()
139{
140	echo -n "Checking $1 output: per socket "
141	if ParanoidAndNotRoot 0
142	then
143		echo "[Skip] paranoid and not root"
144		return
145	fi
146	perf stat --per-socket -a $2 true
147	commachecker --per-socket
148	echo "[Success]"
149}
150
151check_metric_only()
152{
153	echo -n "Checking $1 output: metric only "
154	perf stat --metric-only $2 -e instructions,cycles true
155	commachecker --metric-only
156	echo "[Success]"
157}
158
159# The perf stat options for per-socket, per-core, per-die
160# and -A ( no_aggr mode ) uses the info fetched from this
161# directory: "/sys/devices/system/cpu/cpu*/topology". For
162# example, socket value is fetched from "physical_package_id"
163# file in topology directory.
164# Reference: cpu__get_topology_int in util/cpumap.c
165# If the platform doesn't expose topology information, values
166# will be set to -1. For example, incase of pSeries platform
167# of powerpc, value for  "physical_package_id" is restricted
168# and set to -1. Check here validates the socket-id read from
169# topology file before proceeding further
170
171FILE_LOC="/sys/devices/system/cpu/cpu*/topology/"
172FILE_NAME="physical_package_id"
173
174function check_for_topology()
175{
176	if ! ParanoidAndNotRoot 0
177	then
178		socket_file=`ls $FILE_LOC/$FILE_NAME | head -n 1`
179		[ -z $socket_file ] && {
180			echo 0
181			return
182		}
183		socket_id=`cat $socket_file`
184		[ $socket_id == -1 ] && {
185			echo 1
186			return
187		}
188	fi
189	echo 0
190}
191