Home | History | Annotate | Download | only in cpuset
      1 #!/bin/sh
      2 #
      3 # Copyright (c) 2015 Fujitsu Ltd.
      4 # Author: Zeng Linggang <zenglg.jy (at] cn.fujitsu.com>
      5 #
      6 # This program is free software; you can redistribute it and/or modify
      7 # it under the terms of the GNU General Public License as published by
      8 # the Free Software Foundation; either version 2 of the License, or
      9 # (at your option) any later version.
     10 #
     11 # This program is distributed in the hope that it will be useful,
     12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 # GNU General Public License for more details.
     15 #
     16 # You should have received a copy of the GNU General Public License
     17 # along with this program; if not, write to the Free Software
     18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     19 #
     20 # This is a regression test for commit:
     21 # http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/
     22 # ?id=bb2bc55
     23 #
     24 
     25 TCID=cpuset_regression_test
     26 TST_TOTAL=1
     27 . test.sh
     28 
     29 setup()
     30 {
     31 	tst_require_root
     32 
     33 	tst_kvercmp 3 18 0
     34 	if [ $? -eq 0 ]; then
     35 		tst_brkm TCONF "Test must be run with kernel 3.18.0 or newer"
     36 	fi
     37 
     38 	local cpu_num=$(getconf _NPROCESSORS_ONLN)
     39 	if [ $cpu_num -lt 2 ]; then
     40 		tst_brkm TCONF "We need 2 cpus at least to have test"
     41 	fi
     42 
     43 	tst_tmpdir
     44 
     45 	TST_CLEANUP=cleanup
     46 
     47 	# We need to mount cpuset if it is not found.
     48 	mount_flag=0
     49 	grep -w cpuset /proc/mounts > tmpfile
     50 	if [ $? -eq 0 ]; then
     51 		root_cpuset_dir=$(cat tmpfile | awk '{print $2}')
     52 	else
     53 		root_cpuset_dir="cpuset_test"
     54 
     55 		ROD_SILENT mkdir -p ${root_cpuset_dir}
     56 
     57 		ROD_SILENT mount -t cpuset cpuset ${root_cpuset_dir}
     58 
     59 		mount_flag=1
     60 	fi
     61 
     62 	if [ -f ${root_cpuset_dir}/cpuset.cpu_exclusive ]; then
     63 		cpu_exclusive=cpuset.cpu_exclusive
     64 		cpus=cpuset.cpus
     65 	elif [ -f ${root_cpuset_dir}/cpu_exclusive ]; then
     66 		cpu_exclusive=cpu_exclusive
     67 		cpus=cpus
     68 	else
     69 		tst_brkm TBROK "Both cpuset.cpu_exclusive and cpu_exclusive" \
     70 			       "do not exist."
     71 	fi
     72 
     73 	cpu_exclusive_value=$(cat ${root_cpuset_dir}/${cpu_exclusive})
     74 	if [ "${cpu_exclusive_value}" != "1" ];then
     75 		echo 1 > ${root_cpuset_dir}/${cpu_exclusive}
     76 		if [ $? -ne 0 ]; then
     77 			tst_brkm TBROK "'echo 1 >" \
     78 				       "${root_cpuset_dir}/${cpu_exclusive}'" \
     79 				       "failed"
     80 		fi
     81 	fi
     82 }
     83 
     84 cleanup()
     85 {
     86 	if [ -d "${root_cpuset_dir}/testdir" ]; then
     87 		rmdir ${root_cpuset_dir}/testdir
     88 	fi
     89 
     90 	if [ -n ${cpu_exclusive_value} -a ${cpu_exclusive_value} -ne 1 ]; then
     91 		# Need to flush, or may be output:
     92 		# "write error: Device or resource busy"
     93 		sync
     94 
     95 		echo ${cpu_exclusive_value} > \
     96 		     ${root_cpuset_dir}/${cpu_exclusive}
     97 	fi
     98 
     99 	if [ "${mount_flag}" == "1" ]; then
    100 		umount ${root_cpuset_dir}
    101 		if [ $? -ne 0 ]; then
    102 			tst_resm TWARN "'umount ${root_cpuset_dir}' failed"
    103 		fi
    104 
    105 		if [ -d "${root_cpuset_dir}" ]; then
    106 			rmdir ${root_cpuset_dir}
    107 		fi
    108 	fi
    109 
    110 	tst_rmdir
    111 }
    112 
    113 cpuset_test()
    114 {
    115 	ROD_SILENT mkdir ${root_cpuset_dir}/testdir
    116 
    117 	# Creat an exclusive cpuset.
    118 	echo 1 > ${root_cpuset_dir}/testdir/${cpu_exclusive}
    119 	if [ $? -ne 0 ]; then
    120 		tst_brkm TFAIL "'echo 1 >" \
    121 			       "${root_cpuset_dir}/testdir/${cpu_exclusive}'" \
    122 			       "failed"
    123 	fi
    124 
    125 	local cpu_exclusive_tmp=$(cat \
    126 				  ${root_cpuset_dir}/testdir/${cpu_exclusive})
    127 	if [ "${cpu_exclusive_tmp}" != "1" ]; then
    128 		tst_brkm TFAIL "${cpu_exclusive} is '${cpu_exclusive_tmp}'," \
    129 			       "expected '1'"
    130 	fi
    131 
    132 	# ${cpus} is empty at the begin, that maybe make the system *crash*.
    133 	echo 0-1 > ${root_cpuset_dir}/testdir/${cpus}
    134 	if [ $? -ne 0 ]; then
    135 		tst_brkm TFAIL "'echo 0-1 >" \
    136 			       "${root_cpuset_dir}/testdir/${cpus}' failed"
    137 	fi
    138 
    139 	local cpus_value=$(cat ${root_cpuset_dir}/testdir/${cpus})
    140 	if [ "${cpus_value}" != "0-1" ]; then
    141 		tst_brkm TFAIL "${cpus} is '${cpus_value}', expected '0-1'"
    142 	fi
    143 
    144 	tst_resm TPASS "Bug is not reproduced"
    145 }
    146 
    147 setup
    148 
    149 cpuset_test
    150 
    151 tst_exit
    152