xref: /linux/tools/testing/selftests/rseq/run_param_test.sh (revision 7f0023215262221ca08d56be2203e8a4770be033)
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
171