1f08c3bdfSopenharmony_ci#!/bin/sh
2f08c3bdfSopenharmony_ci# usage: . cpuset_funcs.sh
3f08c3bdfSopenharmony_ci# functions for cpuset test
4f08c3bdfSopenharmony_ci
5f08c3bdfSopenharmony_ci################################################################################
6f08c3bdfSopenharmony_ci##                                                                            ##
7f08c3bdfSopenharmony_ci## Copyright (c) 2009 FUJITSU LIMITED                                         ##
8f08c3bdfSopenharmony_ci##                                                                            ##
9f08c3bdfSopenharmony_ci## This program is free software;  you can redistribute it and#or modify      ##
10f08c3bdfSopenharmony_ci## it under the terms of the GNU General Public License as published by       ##
11f08c3bdfSopenharmony_ci## the Free Software Foundation; either version 2 of the License, or          ##
12f08c3bdfSopenharmony_ci## (at your option) any later version.                                        ##
13f08c3bdfSopenharmony_ci##                                                                            ##
14f08c3bdfSopenharmony_ci## This program is distributed in the hope that it will be useful, but        ##
15f08c3bdfSopenharmony_ci## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
16f08c3bdfSopenharmony_ci## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
17f08c3bdfSopenharmony_ci## for more details.                                                          ##
18f08c3bdfSopenharmony_ci##                                                                            ##
19f08c3bdfSopenharmony_ci## You should have received a copy of the GNU General Public License          ##
20f08c3bdfSopenharmony_ci## along with this program;  if not, write to the Free Software               ##
21f08c3bdfSopenharmony_ci## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
22f08c3bdfSopenharmony_ci##                                                                            ##
23f08c3bdfSopenharmony_ci## Author: Miao Xie <miaox@cn.fujitsu.com>                                    ##
24f08c3bdfSopenharmony_ci##                                                                            ##
25f08c3bdfSopenharmony_ci################################################################################
26f08c3bdfSopenharmony_ci
27f08c3bdfSopenharmony_ci. test.sh
28f08c3bdfSopenharmony_ci
29f08c3bdfSopenharmony_cicpu_string="`cat /sys/devices/system/cpu/online`"
30f08c3bdfSopenharmony_ciNR_CPUS=`tst_ncpus`
31f08c3bdfSopenharmony_ci
32f08c3bdfSopenharmony_ciif [ -f "/sys/devices/system/node/has_high_memory" ]; then
33f08c3bdfSopenharmony_ci	mem_string="`cat /sys/devices/system/node/has_high_memory`"
34f08c3bdfSopenharmony_cielse
35f08c3bdfSopenharmony_ci	mem_string="`cat /sys/devices/system/node/has_normal_memory`"
36f08c3bdfSopenharmony_cifi
37f08c3bdfSopenharmony_ciN_NODES="`echo $mem_string | tr ',' ' '`"
38f08c3bdfSopenharmony_cicount=0
39f08c3bdfSopenharmony_cifinal_node=0
40f08c3bdfSopenharmony_cifor item in $N_NODES; do
41f08c3bdfSopenharmony_ci	delta=1
42f08c3bdfSopenharmony_ci	if [ "${item#*-*}" != "$item" ]; then
43f08c3bdfSopenharmony_ci		delta=$((${item#*-*} - ${item%*-*} + 1))
44f08c3bdfSopenharmony_ci	fi
45f08c3bdfSopenharmony_ci	final_node=${item#*-*}
46f08c3bdfSopenharmony_ci	count=$((count + $delta))
47f08c3bdfSopenharmony_cidone
48f08c3bdfSopenharmony_cifinal_node=$((final_node + 1))
49f08c3bdfSopenharmony_ciN_NODES=$count
50f08c3bdfSopenharmony_ci
51f08c3bdfSopenharmony_cifinal_cpu=0
52f08c3bdfSopenharmony_ciN_CPUS="`echo $cpu_string | tr ',' ' '`"
53f08c3bdfSopenharmony_cifor item in $N_CPUS; do
54f08c3bdfSopenharmony_ci	final_cpu=${item#*-*}
55f08c3bdfSopenharmony_cidone
56f08c3bdfSopenharmony_cifinal_cpu=$((final_cpu + 1))
57f08c3bdfSopenharmony_ci
58f08c3bdfSopenharmony_ciCPUSET="/dev/cpuset"
59f08c3bdfSopenharmony_ciCPUSET_TMP="/tmp/cpuset_tmp"
60f08c3bdfSopenharmony_ciCLONE_CHILDREN="/dev/cpuset/cgroup.clone_children"
61f08c3bdfSopenharmony_ciCHILDREN_VALUE="0"
62f08c3bdfSopenharmony_ciHOTPLUG_CPU="1"
63f08c3bdfSopenharmony_ciSCHED_LB="/dev/cpuset/cpuset.sched_load_balance"
64f08c3bdfSopenharmony_ciSCHED_LB_VALUE="0"
65f08c3bdfSopenharmony_ci
66f08c3bdfSopenharmony_cicpuset_log()
67f08c3bdfSopenharmony_ci{
68f08c3bdfSopenharmony_ci	tst_resm TINFO "$*"
69f08c3bdfSopenharmony_ci}
70f08c3bdfSopenharmony_ci
71f08c3bdfSopenharmony_ci# cpuset_log_error <error_file>
72f08c3bdfSopenharmony_cicpuset_log_error()
73f08c3bdfSopenharmony_ci{
74f08c3bdfSopenharmony_ci	local error_message=
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_ci	while read error_message
77f08c3bdfSopenharmony_ci	do
78f08c3bdfSopenharmony_ci		cpuset_log "$error_message"
79f08c3bdfSopenharmony_ci	done < "$1"
80f08c3bdfSopenharmony_ci}
81f08c3bdfSopenharmony_ci
82f08c3bdfSopenharmony_cincpus_check()
83f08c3bdfSopenharmony_ci{
84f08c3bdfSopenharmony_ci	if [ $NR_CPUS -lt $1 ]; then
85f08c3bdfSopenharmony_ci		tst_brkm TCONF "The total of CPUs is less than $1"
86f08c3bdfSopenharmony_ci	fi
87f08c3bdfSopenharmony_ci	# check online cpus whether match 0-num
88f08c3bdfSopenharmony_ci	if [ $final_cpu -eq $NR_CPUS ]; then
89f08c3bdfSopenharmony_ci		tst_resm TINFO "CPUs are numbered continuously starting at 0 ($cpu_string)"
90f08c3bdfSopenharmony_ci	else
91f08c3bdfSopenharmony_ci		tst_brkm TCONF "CPUs are not numbered continuously starting at 0 ($cpu_string)"
92f08c3bdfSopenharmony_ci	fi
93f08c3bdfSopenharmony_ci}
94f08c3bdfSopenharmony_ci
95f08c3bdfSopenharmony_cinnodes_check()
96f08c3bdfSopenharmony_ci{
97f08c3bdfSopenharmony_ci	if [ $N_NODES -lt $1 ]; then
98f08c3bdfSopenharmony_ci		tst_brkm TCONF "The total of nodes is less than $1"
99f08c3bdfSopenharmony_ci	fi
100f08c3bdfSopenharmony_ci	# check online nodes whether match 0-num
101f08c3bdfSopenharmony_ci	if [ $final_node -eq $N_NODES ]; then
102f08c3bdfSopenharmony_ci		tst_resm TINFO "Nodes are numbered continuously starting at 0 ($mem_string)"
103f08c3bdfSopenharmony_ci	else
104f08c3bdfSopenharmony_ci		tst_brkm TCONF "Nodes are not numbered continuously starting at 0 ($mem_string)"
105f08c3bdfSopenharmony_ci	fi
106f08c3bdfSopenharmony_ci}
107f08c3bdfSopenharmony_ci
108f08c3bdfSopenharmony_ciuser_check()
109f08c3bdfSopenharmony_ci{
110f08c3bdfSopenharmony_ci	if [ $(id -u) != 0 ]; then
111f08c3bdfSopenharmony_ci		tst_brkm TCONF "Test must be run as root"
112f08c3bdfSopenharmony_ci	fi
113f08c3bdfSopenharmony_ci}
114f08c3bdfSopenharmony_ci
115f08c3bdfSopenharmony_cicpuset_check()
116f08c3bdfSopenharmony_ci{
117f08c3bdfSopenharmony_ci        if [ -f /proc/cgroups ]; then
118f08c3bdfSopenharmony_ci		CPUSET_CONTROLLER=`grep -w cpuset /proc/cgroups | cut -f1`
119f08c3bdfSopenharmony_ci		CPUSET_CONTROLLER_VALUE=`grep -w cpuset /proc/cgroups | cut -f4`
120f08c3bdfSopenharmony_ci
121f08c3bdfSopenharmony_ci		if [ "$CPUSET_CONTROLLER" = "cpuset" ] && [ "$CPUSET_CONTROLLER_VALUE" = "1" ]
122f08c3bdfSopenharmony_ci		then
123f08c3bdfSopenharmony_ci			return 0
124f08c3bdfSopenharmony_ci		fi
125f08c3bdfSopenharmony_ci	fi
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_ci	tst_brkm TCONF "Cpuset is not supported"
128f08c3bdfSopenharmony_ci}
129f08c3bdfSopenharmony_ci
130f08c3bdfSopenharmony_cimachine_check()
131f08c3bdfSopenharmony_ci{
132f08c3bdfSopenharmony_ci	if tst_virt_hyperv; then
133f08c3bdfSopenharmony_ci		tst_brkm TCONF "Microsoft Hyper-V detected, no support for CPU hotplug"
134f08c3bdfSopenharmony_ci	fi
135f08c3bdfSopenharmony_ci}
136f08c3bdfSopenharmony_ci
137f08c3bdfSopenharmony_ci# optional parameters (pass both or none of them):
138f08c3bdfSopenharmony_ci# $1 - required number of cpus (default 2)
139f08c3bdfSopenharmony_ci# $2 - required number of memory nodes (default 2)
140f08c3bdfSopenharmony_cicheck()
141f08c3bdfSopenharmony_ci{
142f08c3bdfSopenharmony_ci	user_check
143f08c3bdfSopenharmony_ci
144f08c3bdfSopenharmony_ci	cpuset_check
145f08c3bdfSopenharmony_ci
146f08c3bdfSopenharmony_ci	ncpus_check ${1:-2}
147f08c3bdfSopenharmony_ci
148f08c3bdfSopenharmony_ci	nnodes_check ${2:-2}
149f08c3bdfSopenharmony_ci
150f08c3bdfSopenharmony_ci	machine_check
151f08c3bdfSopenharmony_ci}
152f08c3bdfSopenharmony_ci
153f08c3bdfSopenharmony_ci# Create /dev/cpuset & mount the cgroup file system with cpuset
154f08c3bdfSopenharmony_ci# clean any group created eralier (if any)
155f08c3bdfSopenharmony_cisetup()
156f08c3bdfSopenharmony_ci{
157f08c3bdfSopenharmony_ci	if [ -e "$CPUSET" ]
158f08c3bdfSopenharmony_ci	then
159f08c3bdfSopenharmony_ci		tst_resm TWARN "$CPUSET already exist.. overwriting"
160f08c3bdfSopenharmony_ci		cleanup || tst_brkm TFAIL "Can't cleanup... Exiting"
161f08c3bdfSopenharmony_ci	fi
162f08c3bdfSopenharmony_ci
163f08c3bdfSopenharmony_ci	mkdir -p "$CPUSET_TMP"
164f08c3bdfSopenharmony_ci	mkdir "$CPUSET"
165f08c3bdfSopenharmony_ci	mount -t cgroup -o cpuset cpuset "$CPUSET" 2> /dev/null
166f08c3bdfSopenharmony_ci	if [ $? -ne 0 ]; then
167f08c3bdfSopenharmony_ci		cleanup
168f08c3bdfSopenharmony_ci		tst_brkm TFAIL "Could not mount cgroup filesystem with"\
169f08c3bdfSopenharmony_ci					" cpuset on $CPUSET..Exiting test"
170f08c3bdfSopenharmony_ci	fi
171f08c3bdfSopenharmony_ci
172f08c3bdfSopenharmony_ci	CHILDREN_VALUE="`cat $CLONE_CHILDREN`"
173f08c3bdfSopenharmony_ci	SCHED_LB_VALUE="`cat $SCHED_LB`"
174f08c3bdfSopenharmony_ci}
175f08c3bdfSopenharmony_ci
176f08c3bdfSopenharmony_ci# Write the cleanup function
177f08c3bdfSopenharmony_cicleanup()
178f08c3bdfSopenharmony_ci{
179f08c3bdfSopenharmony_ci	grep "$CPUSET" /proc/mounts >/dev/null 2>&1 || {
180f08c3bdfSopenharmony_ci		rm -rf "$CPUSET" >/dev/null 2>&1
181f08c3bdfSopenharmony_ci		return 0
182f08c3bdfSopenharmony_ci	}
183f08c3bdfSopenharmony_ci
184f08c3bdfSopenharmony_ci	echo $CHILDREN_VALUE > $CLONE_CHILDREN
185f08c3bdfSopenharmony_ci	echo $SCHED_LB_VALUE > $SCHED_LB
186f08c3bdfSopenharmony_ci
187f08c3bdfSopenharmony_ci	find "$CPUSET" -type d | sort | sed -n '2,$p' | tac | while read -r subdir
188f08c3bdfSopenharmony_ci	do
189f08c3bdfSopenharmony_ci		while read pid
190f08c3bdfSopenharmony_ci		do
191f08c3bdfSopenharmony_ci			/bin/kill -9 $pid > /dev/null 2>&1
192f08c3bdfSopenharmony_ci			if [ $? -ne 0 ]; then
193f08c3bdfSopenharmony_ci				tst_brkm TFAIL "Couldn't kill task - "\
194f08c3bdfSopenharmony_ci							"$pid in the cpuset"
195f08c3bdfSopenharmony_ci			fi
196f08c3bdfSopenharmony_ci		done < "$subdir/tasks"
197f08c3bdfSopenharmony_ci		rmdir "$subdir"
198f08c3bdfSopenharmony_ci		if [ $? -ne 0 ]; then
199f08c3bdfSopenharmony_ci			tst_brkm TFAIL "Couldn't remove subdir - "
200f08c3bdfSopenharmony_ci						"$subdir in the cpuset"
201f08c3bdfSopenharmony_ci		fi
202f08c3bdfSopenharmony_ci	done
203f08c3bdfSopenharmony_ci
204f08c3bdfSopenharmony_ci	umount "$CPUSET"
205f08c3bdfSopenharmony_ci	if [ $? -ne 0 ]; then
206f08c3bdfSopenharmony_ci		tst_brkm TFAIL "Couldn't umount cgroup filesystem with"\
207f08c3bdfSopenharmony_ci					" cpuset on $CPUSET..Exiting test"
208f08c3bdfSopenharmony_ci	fi
209f08c3bdfSopenharmony_ci	rmdir "$CPUSET" > /dev/null 2>&1
210f08c3bdfSopenharmony_ci	rm -rf "$CPUSET_TMP" > /dev/null 2>&1
211f08c3bdfSopenharmony_ci}
212f08c3bdfSopenharmony_ci
213f08c3bdfSopenharmony_ci# set the cpuset's parameter
214f08c3bdfSopenharmony_ci# cpuset_set <cpusetpath> <cpus> <mems> <load_balance>
215f08c3bdfSopenharmony_cicpuset_set()
216f08c3bdfSopenharmony_ci{
217f08c3bdfSopenharmony_ci	local path="$1"
218f08c3bdfSopenharmony_ci	mkdir -p "$path"
219f08c3bdfSopenharmony_ci	if [ $? -ne 0 ]; then
220f08c3bdfSopenharmony_ci		return 1
221f08c3bdfSopenharmony_ci	fi
222f08c3bdfSopenharmony_ci
223f08c3bdfSopenharmony_ci	local cpus="$2"
224f08c3bdfSopenharmony_ci	local mems="$3"
225f08c3bdfSopenharmony_ci	local load_balance="$4"
226f08c3bdfSopenharmony_ci
227f08c3bdfSopenharmony_ci	if [ "$path" != "$CPUSET" ]; then
228f08c3bdfSopenharmony_ci		if [ "$cpus" != "-" ]; then
229f08c3bdfSopenharmony_ci			/bin/echo $cpus > $path/cpuset.cpus
230f08c3bdfSopenharmony_ci			if [ $? -ne 0 ]; then
231f08c3bdfSopenharmony_ci				return 1
232f08c3bdfSopenharmony_ci			fi
233f08c3bdfSopenharmony_ci		fi
234f08c3bdfSopenharmony_ci
235f08c3bdfSopenharmony_ci		/bin/echo $mems > $path/cpuset.mems
236f08c3bdfSopenharmony_ci		if [ $? -ne 0 ]; then
237f08c3bdfSopenharmony_ci			return 1
238f08c3bdfSopenharmony_ci		fi
239f08c3bdfSopenharmony_ci	fi
240f08c3bdfSopenharmony_ci
241f08c3bdfSopenharmony_ci	/bin/echo $load_balance > $path/cpuset.sched_load_balance
242f08c3bdfSopenharmony_ci	if [ $? -ne 0 ]; then
243f08c3bdfSopenharmony_ci		return 1
244f08c3bdfSopenharmony_ci	fi
245f08c3bdfSopenharmony_ci}
246f08c3bdfSopenharmony_ci
247f08c3bdfSopenharmony_ci# cpu_hotplug cpu_id offline/online
248f08c3bdfSopenharmony_cicpu_hotplug()
249f08c3bdfSopenharmony_ci{
250f08c3bdfSopenharmony_ci	if [ "$2" = "online" ]; then
251f08c3bdfSopenharmony_ci		/bin/echo 1 > "/sys/devices/system/cpu/cpu$1/online"
252f08c3bdfSopenharmony_ci		if [ $? -ne 0 ]; then
253f08c3bdfSopenharmony_ci			return 1
254f08c3bdfSopenharmony_ci		fi
255f08c3bdfSopenharmony_ci	elif [ "$2" = "offline" ]; then
256f08c3bdfSopenharmony_ci		/bin/echo 0 > "/sys/devices/system/cpu/cpu$1/online"
257f08c3bdfSopenharmony_ci		if [ $? -ne 0 ]; then
258f08c3bdfSopenharmony_ci			return 1
259f08c3bdfSopenharmony_ci		fi
260f08c3bdfSopenharmony_ci	fi
261f08c3bdfSopenharmony_ci}
262f08c3bdfSopenharmony_ci
263f08c3bdfSopenharmony_ci# setup_test_environment <online | offline>
264f08c3bdfSopenharmony_ci#   online  - online a CPU in testing, so we must offline a CPU first
265f08c3bdfSopenharmony_ci#   offline - offline a CPU in testing, we needn't do anything
266f08c3bdfSopenharmony_cisetup_test_environment()
267f08c3bdfSopenharmony_ci{
268f08c3bdfSopenharmony_ci	if [ "$1" = "online" ]; then
269f08c3bdfSopenharmony_ci		cpu_hotplug $HOTPLUG_CPU offline
270f08c3bdfSopenharmony_ci		if [ $? -ne 0 ]; then
271f08c3bdfSopenharmony_ci			return 1
272f08c3bdfSopenharmony_ci		fi
273f08c3bdfSopenharmony_ci	fi
274f08c3bdfSopenharmony_ci}
275f08c3bdfSopenharmony_ci
276f08c3bdfSopenharmony_cicpu_hotplug_cleanup()
277f08c3bdfSopenharmony_ci{
278f08c3bdfSopenharmony_ci	local cpus_array="$(seq -s' ' 1 $((NR_CPUS-1)))"
279f08c3bdfSopenharmony_ci	local cpuid=
280f08c3bdfSopenharmony_ci	for cpuid in $cpus_array
281f08c3bdfSopenharmony_ci	do
282f08c3bdfSopenharmony_ci		local file="/sys/devices/system/cpu/cpu$cpuid/online"
283f08c3bdfSopenharmony_ci		local offline="$(cat $file)"
284f08c3bdfSopenharmony_ci		if [ $offline -eq 0 ]; then
285f08c3bdfSopenharmony_ci			cpu_hotplug $cpuid "online"
286f08c3bdfSopenharmony_ci		fi
287f08c3bdfSopenharmony_ci	done
288f08c3bdfSopenharmony_ci}
289f08c3bdfSopenharmony_ci
290