projects/linux·blob master · refs

170 lines · 3.1 KiB

1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0+ or MIT
3
4NR_CPUS=`grep '^processor' /proc/cpuinfo | wc -l`
5
6EXTRA_ARGS=${@}
7
8OLDIFS="$IFS"
9IFS=$'\n'
10TEST_LIST=(
11 "-T s"
12 "-T l"
13 "-T b"
14 "-T b -M"
15 "-T m"
16 "-T m -M"
17 "-T i"
18 "-T r"
19)
20
21TEST_NAME=(
22 "spinlock"
23 "list"
24 "buffer"
25 "buffer with barrier"
26 "memcpy"
27 "memcpy with barrier"
28 "increment"
29 "membarrier"
30)
31IFS="$OLDIFS"
32
33REPS=1000
34SLOW_REPS=100
35NR_THREADS=$((6*${NR_CPUS}))
36
37# Prevent GLIBC from registering RSEQ so the selftest can run in legacy and
38# performance optimized mode.
39GLIBC_TUNABLES="${GLIBC_TUNABLES:-}:glibc.pthread.rseq=0"
40export GLIBC_TUNABLES
41
42function do_tests()
43{
44 local i=0
45 while [ "$i" -lt "${#TEST_LIST[@]}" ]; do
46 echo "Running test ${TEST_NAME[$i]}"
47 ./param_test ${TEST_LIST[$i]} -r ${REPS} -t ${NR_THREADS} ${@} ${EXTRA_ARGS} || exit 1
48 echo "Running compare-twice test ${TEST_NAME[$i]}"
49 ./param_test_compare_twice ${TEST_LIST[$i]} -r ${REPS} -t ${NR_THREADS} ${@} ${EXTRA_ARGS} || exit 1
50
51 echo "Running mm_cid test ${TEST_NAME[$i]}"
52 ./param_test_mm_cid ${TEST_LIST[$i]} -r ${REPS} -t ${NR_THREADS} ${@} ${EXTRA_ARGS} || exit 1
53 echo "Running mm_cid compare-twice test ${TEST_NAME[$i]}"
54 ./param_test_mm_cid_compare_twice ${TEST_LIST[$i]} -r ${REPS} -t ${NR_THREADS} ${@} ${EXTRA_ARGS} || exit 1
55 let "i++"
56 done
57}
58
59echo "Default parameters"
60do_tests
61
62echo "Loop injection: 10000 loops"
63
64OLDIFS="$IFS"
65IFS=$'\n'
66INJECT_LIST=(
67 "1"
68 "2"
69 "3"
70 "4"
71 "5"
72 "6"
73 "7"
74 "8"
75 "9"
76)
77IFS="$OLDIFS"
78
79NR_LOOPS=10000
80
81i=0
82while [ "$i" -lt "${#INJECT_LIST[@]}" ]; do
83 echo "Injecting at <${INJECT_LIST[$i]}>"
84 do_tests -${INJECT_LIST[i]} ${NR_LOOPS}
85 let "i++"
86done
87NR_LOOPS=
88
89function inject_blocking()
90{
91 OLDIFS="$IFS"
92 IFS=$'\n'
93 INJECT_LIST=(
94 "7"
95 "8"
96 "9"
97 )
98 IFS="$OLDIFS"
99
100 NR_LOOPS=-1
101
102 i=0
103 while [ "$i" -lt "${#INJECT_LIST[@]}" ]; do
104 echo "Injecting at <${INJECT_LIST[$i]}>"
105 do_tests -${INJECT_LIST[i]} -1 ${@}
106 let "i++"
107 done
108 NR_LOOPS=
109}
110
111echo "Testing in legacy RSEQ mode"
112echo "Yield injection (25%)"
113inject_blocking -m 4 -y -L
114
115echo "Yield injection (50%)"
116inject_blocking -m 2 -y -L
117
118echo "Yield injection (100%)"
119inject_blocking -m 1 -y -L
120
121echo "Kill injection (25%)"
122inject_blocking -m 4 -k -L
123
124echo "Kill injection (50%)"
125inject_blocking -m 2 -k -L
126
127echo "Kill injection (100%)"
128inject_blocking -m 1 -k -L
129
130echo "Sleep injection (1ms, 25%)"
131inject_blocking -m 4 -s 1 -L
132
133echo "Sleep injection (1ms, 50%)"
134inject_blocking -m 2 -s 1 -L
135
136echo "Sleep injection (1ms, 100%)"
137inject_blocking -m 1 -s 1 -L
138
139./check_optimized || {
140 echo "Skipping optimized RSEQ mode test. Not supported";
141 exit 0
142}
143
144echo "Testing in optimized RSEQ mode"
145echo "Yield injection (25%)"
146inject_blocking -m 4 -y
147
148echo "Yield injection (50%)"
149inject_blocking -m 2 -y
150
151echo "Yield injection (100%)"
152inject_blocking -m 1 -y
153
154echo "Kill injection (25%)"
155inject_blocking -m 4 -k
156
157echo "Kill injection (50%)"
158inject_blocking -m 2 -k
159
160echo "Kill injection (100%)"
161inject_blocking -m 1 -k
162
163echo "Sleep injection (1ms, 25%)"
164inject_blocking -m 4 -s 1
165
166echo "Sleep injection (1ms, 50%)"
167inject_blocking -m 2 -s 1
168
169echo "Sleep injection (1ms, 100%)"
170inject_blocking -m 1 -s 1