xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/rcutorture/bin/functions.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Shell functions for the rest of the scripts.
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# Copyright (C) IBM Corporation, 2013
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun# bootparam_hotplug_cpu bootparam-string
11*4882a593Smuzhiyun#
12*4882a593Smuzhiyun# Returns 1 if the specified boot-parameter string tells rcutorture to
13*4882a593Smuzhiyun# test CPU-hotplug operations.
14*4882a593Smuzhiyunbootparam_hotplug_cpu () {
15*4882a593Smuzhiyun	echo "$1" | grep -q "torture\.onoff_"
16*4882a593Smuzhiyun}
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun# checkarg --argname argtype $# arg mustmatch cannotmatch
19*4882a593Smuzhiyun#
20*4882a593Smuzhiyun# Checks the specified argument "arg" against the mustmatch and cannotmatch
21*4882a593Smuzhiyun# patterns.
22*4882a593Smuzhiyuncheckarg () {
23*4882a593Smuzhiyun	if test $3 -le 1
24*4882a593Smuzhiyun	then
25*4882a593Smuzhiyun		echo $1 needs argument $2 matching \"$5\"
26*4882a593Smuzhiyun		usage
27*4882a593Smuzhiyun	fi
28*4882a593Smuzhiyun	if echo "$4" | grep -q -e "$5"
29*4882a593Smuzhiyun	then
30*4882a593Smuzhiyun		:
31*4882a593Smuzhiyun	else
32*4882a593Smuzhiyun		echo $1 $2 \"$4\" must match \"$5\"
33*4882a593Smuzhiyun		usage
34*4882a593Smuzhiyun	fi
35*4882a593Smuzhiyun	if echo "$4" | grep -q -e "$6"
36*4882a593Smuzhiyun	then
37*4882a593Smuzhiyun		echo $1 $2 \"$4\" must not match \"$6\"
38*4882a593Smuzhiyun		usage
39*4882a593Smuzhiyun	fi
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun# configfrag_boot_params bootparam-string config-fragment-file
43*4882a593Smuzhiyun#
44*4882a593Smuzhiyun# Adds boot parameters from the .boot file, if any.
45*4882a593Smuzhiyunconfigfrag_boot_params () {
46*4882a593Smuzhiyun	if test -r "$2.boot"
47*4882a593Smuzhiyun	then
48*4882a593Smuzhiyun		echo $1 `grep -v '^#' "$2.boot" | tr '\012' ' '`
49*4882a593Smuzhiyun	else
50*4882a593Smuzhiyun		echo $1
51*4882a593Smuzhiyun	fi
52*4882a593Smuzhiyun}
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun# configfrag_boot_cpus bootparam-string config-fragment-file config-cpus
55*4882a593Smuzhiyun#
56*4882a593Smuzhiyun# Decreases number of CPUs based on any nr_cpus= boot parameters specified.
57*4882a593Smuzhiyunconfigfrag_boot_cpus () {
58*4882a593Smuzhiyun	local bootargs="`configfrag_boot_params "$1" "$2"`"
59*4882a593Smuzhiyun	local nr_cpus
60*4882a593Smuzhiyun	if echo "${bootargs}" | grep -q 'nr_cpus=[0-9]'
61*4882a593Smuzhiyun	then
62*4882a593Smuzhiyun		nr_cpus="`echo "${bootargs}" | sed -e 's/^.*nr_cpus=\([0-9]*\).*$/\1/'`"
63*4882a593Smuzhiyun		if test "$3" -gt "$nr_cpus"
64*4882a593Smuzhiyun		then
65*4882a593Smuzhiyun			echo $nr_cpus
66*4882a593Smuzhiyun		else
67*4882a593Smuzhiyun			echo $3
68*4882a593Smuzhiyun		fi
69*4882a593Smuzhiyun	else
70*4882a593Smuzhiyun		echo $3
71*4882a593Smuzhiyun	fi
72*4882a593Smuzhiyun}
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun# configfrag_boot_maxcpus bootparam-string config-fragment-file config-cpus
75*4882a593Smuzhiyun#
76*4882a593Smuzhiyun# Decreases number of CPUs based on any maxcpus= boot parameters specified.
77*4882a593Smuzhiyun# This allows tests where additional CPUs come online later during the
78*4882a593Smuzhiyun# test run.  However, the torture parameters will be set based on the
79*4882a593Smuzhiyun# number of CPUs initially present, so the scripting should schedule
80*4882a593Smuzhiyun# test runs based on the maxcpus= boot parameter controlling the initial
81*4882a593Smuzhiyun# number of CPUs instead of on the ultimate number of CPUs.
82*4882a593Smuzhiyunconfigfrag_boot_maxcpus () {
83*4882a593Smuzhiyun	local bootargs="`configfrag_boot_params "$1" "$2"`"
84*4882a593Smuzhiyun	local maxcpus
85*4882a593Smuzhiyun	if echo "${bootargs}" | grep -q 'maxcpus=[0-9]'
86*4882a593Smuzhiyun	then
87*4882a593Smuzhiyun		maxcpus="`echo "${bootargs}" | sed -e 's/^.*maxcpus=\([0-9]*\).*$/\1/'`"
88*4882a593Smuzhiyun		if test "$3" -gt "$maxcpus"
89*4882a593Smuzhiyun		then
90*4882a593Smuzhiyun			echo $maxcpus
91*4882a593Smuzhiyun		else
92*4882a593Smuzhiyun			echo $3
93*4882a593Smuzhiyun		fi
94*4882a593Smuzhiyun	else
95*4882a593Smuzhiyun		echo $3
96*4882a593Smuzhiyun	fi
97*4882a593Smuzhiyun}
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun# configfrag_hotplug_cpu config-fragment-file
100*4882a593Smuzhiyun#
101*4882a593Smuzhiyun# Returns 1 if the config fragment specifies hotplug CPU.
102*4882a593Smuzhiyunconfigfrag_hotplug_cpu () {
103*4882a593Smuzhiyun	if test ! -r "$1"
104*4882a593Smuzhiyun	then
105*4882a593Smuzhiyun		echo Unreadable config fragment "$1" 1>&2
106*4882a593Smuzhiyun		exit -1
107*4882a593Smuzhiyun	fi
108*4882a593Smuzhiyun	grep -q '^CONFIG_HOTPLUG_CPU=y$' "$1"
109*4882a593Smuzhiyun}
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun# identify_boot_image qemu-cmd
112*4882a593Smuzhiyun#
113*4882a593Smuzhiyun# Returns the relative path to the kernel build image.  This will be
114*4882a593Smuzhiyun# arch/<arch>/boot/bzImage or vmlinux if bzImage is not a target for the
115*4882a593Smuzhiyun# architecture, unless overridden with the TORTURE_BOOT_IMAGE environment
116*4882a593Smuzhiyun# variable.
117*4882a593Smuzhiyunidentify_boot_image () {
118*4882a593Smuzhiyun	if test -n "$TORTURE_BOOT_IMAGE"
119*4882a593Smuzhiyun	then
120*4882a593Smuzhiyun		echo $TORTURE_BOOT_IMAGE
121*4882a593Smuzhiyun	else
122*4882a593Smuzhiyun		case "$1" in
123*4882a593Smuzhiyun		qemu-system-x86_64|qemu-system-i386)
124*4882a593Smuzhiyun			echo arch/x86/boot/bzImage
125*4882a593Smuzhiyun			;;
126*4882a593Smuzhiyun		qemu-system-aarch64)
127*4882a593Smuzhiyun			echo arch/arm64/boot/Image
128*4882a593Smuzhiyun			;;
129*4882a593Smuzhiyun		*)
130*4882a593Smuzhiyun			echo vmlinux
131*4882a593Smuzhiyun			;;
132*4882a593Smuzhiyun		esac
133*4882a593Smuzhiyun	fi
134*4882a593Smuzhiyun}
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun# identify_qemu builddir
137*4882a593Smuzhiyun#
138*4882a593Smuzhiyun# Returns our best guess as to which qemu command is appropriate for
139*4882a593Smuzhiyun# the kernel at hand.  Override with the TORTURE_QEMU_CMD environment variable.
140*4882a593Smuzhiyunidentify_qemu () {
141*4882a593Smuzhiyun	local u="`file "$1"`"
142*4882a593Smuzhiyun	if test -n "$TORTURE_QEMU_CMD"
143*4882a593Smuzhiyun	then
144*4882a593Smuzhiyun		echo $TORTURE_QEMU_CMD
145*4882a593Smuzhiyun	elif echo $u | grep -q x86-64
146*4882a593Smuzhiyun	then
147*4882a593Smuzhiyun		echo qemu-system-x86_64
148*4882a593Smuzhiyun	elif echo $u | grep -q "Intel 80386"
149*4882a593Smuzhiyun	then
150*4882a593Smuzhiyun		echo qemu-system-i386
151*4882a593Smuzhiyun	elif echo $u | grep -q aarch64
152*4882a593Smuzhiyun	then
153*4882a593Smuzhiyun		echo qemu-system-aarch64
154*4882a593Smuzhiyun	elif uname -a | grep -q ppc64
155*4882a593Smuzhiyun	then
156*4882a593Smuzhiyun		echo qemu-system-ppc64
157*4882a593Smuzhiyun	else
158*4882a593Smuzhiyun		echo Cannot figure out what qemu command to use! 1>&2
159*4882a593Smuzhiyun		echo file $1 output: $u
160*4882a593Smuzhiyun		# Usually this will be one of /usr/bin/qemu-system-*
161*4882a593Smuzhiyun		# Use TORTURE_QEMU_CMD environment variable or appropriate
162*4882a593Smuzhiyun		# argument to top-level script.
163*4882a593Smuzhiyun		exit 1
164*4882a593Smuzhiyun	fi
165*4882a593Smuzhiyun}
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun# identify_qemu_append qemu-cmd
168*4882a593Smuzhiyun#
169*4882a593Smuzhiyun# Output arguments for the qemu "-append" string based on CPU type
170*4882a593Smuzhiyun# and the TORTURE_QEMU_INTERACTIVE environment variable.
171*4882a593Smuzhiyunidentify_qemu_append () {
172*4882a593Smuzhiyun	local console=ttyS0
173*4882a593Smuzhiyun	case "$1" in
174*4882a593Smuzhiyun	qemu-system-x86_64|qemu-system-i386)
175*4882a593Smuzhiyun		echo selinux=0 initcall_debug debug
176*4882a593Smuzhiyun		;;
177*4882a593Smuzhiyun	qemu-system-aarch64)
178*4882a593Smuzhiyun		console=ttyAMA0
179*4882a593Smuzhiyun		;;
180*4882a593Smuzhiyun	esac
181*4882a593Smuzhiyun	if test -n "$TORTURE_QEMU_INTERACTIVE"
182*4882a593Smuzhiyun	then
183*4882a593Smuzhiyun		echo root=/dev/sda
184*4882a593Smuzhiyun	else
185*4882a593Smuzhiyun		echo console=$console
186*4882a593Smuzhiyun	fi
187*4882a593Smuzhiyun}
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun# identify_qemu_args qemu-cmd serial-file
190*4882a593Smuzhiyun#
191*4882a593Smuzhiyun# Output arguments for qemu arguments based on the TORTURE_QEMU_MAC
192*4882a593Smuzhiyun# and TORTURE_QEMU_INTERACTIVE environment variables.
193*4882a593Smuzhiyunidentify_qemu_args () {
194*4882a593Smuzhiyun	local KVM_CPU=""
195*4882a593Smuzhiyun	case "$1" in
196*4882a593Smuzhiyun	qemu-system-x86_64)
197*4882a593Smuzhiyun		KVM_CPU=kvm64
198*4882a593Smuzhiyun		;;
199*4882a593Smuzhiyun	qemu-system-i386)
200*4882a593Smuzhiyun		KVM_CPU=kvm32
201*4882a593Smuzhiyun		;;
202*4882a593Smuzhiyun	esac
203*4882a593Smuzhiyun	case "$1" in
204*4882a593Smuzhiyun	qemu-system-x86_64|qemu-system-i386)
205*4882a593Smuzhiyun		echo -machine q35,accel=kvm
206*4882a593Smuzhiyun		echo -cpu ${KVM_CPU}
207*4882a593Smuzhiyun		;;
208*4882a593Smuzhiyun	qemu-system-aarch64)
209*4882a593Smuzhiyun		echo -machine virt,gic-version=host -cpu host
210*4882a593Smuzhiyun		;;
211*4882a593Smuzhiyun	qemu-system-ppc64)
212*4882a593Smuzhiyun		echo -enable-kvm -M pseries -nodefaults
213*4882a593Smuzhiyun		echo -device spapr-vscsi
214*4882a593Smuzhiyun		if test -n "$TORTURE_QEMU_INTERACTIVE" -a -n "$TORTURE_QEMU_MAC"
215*4882a593Smuzhiyun		then
216*4882a593Smuzhiyun			echo -device spapr-vlan,netdev=net0,mac=$TORTURE_QEMU_MAC
217*4882a593Smuzhiyun			echo -netdev bridge,br=br0,id=net0
218*4882a593Smuzhiyun		fi
219*4882a593Smuzhiyun		;;
220*4882a593Smuzhiyun	esac
221*4882a593Smuzhiyun	if test -n "$TORTURE_QEMU_INTERACTIVE"
222*4882a593Smuzhiyun	then
223*4882a593Smuzhiyun		echo -monitor stdio -serial pty -S
224*4882a593Smuzhiyun	else
225*4882a593Smuzhiyun		echo -serial file:$2
226*4882a593Smuzhiyun	fi
227*4882a593Smuzhiyun}
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun# identify_qemu_vcpus
230*4882a593Smuzhiyun#
231*4882a593Smuzhiyun# Returns the number of virtual CPUs available to the aggregate of the
232*4882a593Smuzhiyun# guest OSes.
233*4882a593Smuzhiyunidentify_qemu_vcpus () {
234*4882a593Smuzhiyun	lscpu | grep '^CPU(s):' | sed -e 's/CPU(s)://' -e 's/[ 	]*//g'
235*4882a593Smuzhiyun}
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun# print_bug
238*4882a593Smuzhiyun#
239*4882a593Smuzhiyun# Prints "BUG: " in red followed by remaining arguments
240*4882a593Smuzhiyunprint_bug () {
241*4882a593Smuzhiyun	printf '\033[031mBUG: \033[m'
242*4882a593Smuzhiyun	echo $*
243*4882a593Smuzhiyun}
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun# print_warning
246*4882a593Smuzhiyun#
247*4882a593Smuzhiyun# Prints "WARNING: " in yellow followed by remaining arguments
248*4882a593Smuzhiyunprint_warning () {
249*4882a593Smuzhiyun	printf '\033[033mWARNING: \033[m'
250*4882a593Smuzhiyun	echo $*
251*4882a593Smuzhiyun}
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun# specify_qemu_cpus qemu-cmd qemu-args #cpus
254*4882a593Smuzhiyun#
255*4882a593Smuzhiyun# Appends a string containing "-smp XXX" to qemu-args, unless the incoming
256*4882a593Smuzhiyun# qemu-args already contains "-smp".
257*4882a593Smuzhiyunspecify_qemu_cpus () {
258*4882a593Smuzhiyun	local nt;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun	if echo $2 | grep -q -e -smp
261*4882a593Smuzhiyun	then
262*4882a593Smuzhiyun		echo $2
263*4882a593Smuzhiyun	else
264*4882a593Smuzhiyun		case "$1" in
265*4882a593Smuzhiyun		qemu-system-x86_64|qemu-system-i386|qemu-system-aarch64)
266*4882a593Smuzhiyun			echo $2 -smp $3
267*4882a593Smuzhiyun			;;
268*4882a593Smuzhiyun		qemu-system-ppc64)
269*4882a593Smuzhiyun			nt="`lscpu | grep '^NUMA node0' | sed -e 's/^[^,]*,\([0-9]*\),.*$/\1/'`"
270*4882a593Smuzhiyun			echo $2 -smp cores=`expr \( $3 + $nt - 1 \) / $nt`,threads=$nt
271*4882a593Smuzhiyun			;;
272*4882a593Smuzhiyun		esac
273*4882a593Smuzhiyun	fi
274*4882a593Smuzhiyun}
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun# specify_qemu_net qemu-args
277*4882a593Smuzhiyun#
278*4882a593Smuzhiyun# Appends a string containing "-net none" to qemu-args, unless the incoming
279*4882a593Smuzhiyun# qemu-args already contains "-smp" or unless the TORTURE_QEMU_INTERACTIVE
280*4882a593Smuzhiyun# environment variable is set, in which case the string that is be added is
281*4882a593Smuzhiyun# instead "-net nic -net user".
282*4882a593Smuzhiyunspecify_qemu_net () {
283*4882a593Smuzhiyun	if echo $1 | grep -q -e -net
284*4882a593Smuzhiyun	then
285*4882a593Smuzhiyun		echo $1
286*4882a593Smuzhiyun	elif test -n "$TORTURE_QEMU_INTERACTIVE"
287*4882a593Smuzhiyun	then
288*4882a593Smuzhiyun		echo $1 -net nic -net user
289*4882a593Smuzhiyun	else
290*4882a593Smuzhiyun		echo $1 -net none
291*4882a593Smuzhiyun	fi
292*4882a593Smuzhiyun}
293