Merge tag 'for-linus-2021-01-24' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / tools / perf / tests / shell / stat+shadow_stat.sh
1 #!/bin/sh
2 # perf stat metrics (shadow stat) test
3 # SPDX-License-Identifier: GPL-2.0
4
5 set -e
6
7 # skip if system-wide mode is forbidden
8 perf stat -a true > /dev/null 2>&1 || exit 2
9
10 test_global_aggr()
11 {
12         perf stat -a --no-big-num -e cycles,instructions sleep 1  2>&1 | \
13         grep -e cycles -e instructions | \
14         while read num evt hash ipc rest
15         do
16                 # skip not counted events
17                 if [ "$num" = "<not" ]; then
18                         continue
19                 fi
20
21                 # save cycles count
22                 if [ "$evt" = "cycles" ]; then
23                         cyc=$num
24                         continue
25                 fi
26
27                 # skip if no cycles
28                 if [ -z "$cyc" ]; then
29                         continue
30                 fi
31
32                 # use printf for rounding and a leading zero
33                 res=`printf "%.2f" $(echo "scale=6; $num / $cyc" | bc -q)`
34                 if [ "$ipc" != "$res" ]; then
35                         echo "IPC is different: $res != $ipc  ($num / $cyc)"
36                         exit 1
37                 fi
38         done
39 }
40
41 test_no_aggr()
42 {
43         perf stat -a -A --no-big-num -e cycles,instructions sleep 1  2>&1 | \
44         grep ^CPU | \
45         while read cpu num evt hash ipc rest
46         do
47                 # skip not counted events
48                 if [ "$num" = "<not" ]; then
49                         continue
50                 fi
51
52                 # save cycles count
53                 if [ "$evt" = "cycles" ]; then
54                         results="$results $cpu:$num"
55                         continue
56                 fi
57
58                 cyc=${results##* $cpu:}
59                 cyc=${cyc%% *}
60
61                 # skip if no cycles
62                 if [ -z "$cyc" ]; then
63                         continue
64                 fi
65
66                 # use printf for rounding and a leading zero
67                 res=`printf "%.2f" $(echo "scale=6; $num / $cyc" | bc -q)`
68                 if [ "$ipc" != "$res" ]; then
69                         echo "IPC is different for $cpu: $res != $ipc  ($num / $cyc)"
70                         exit 1
71                 fi
72         done
73 }
74
75 test_global_aggr
76 test_no_aggr
77
78 exit 0