Home | History | Annotate | Download | only in rcu
      1 #!/bin/sh
      2 # Copyright (c) 2014-2015 Oracle and/or its affiliates. All Rights Reserved.
      3 #
      4 # This program is free software; you can redistribute it and/or
      5 # modify it under the terms of the GNU General Public License as
      6 # published by the Free Software Foundation; either version 2 of
      7 # the License, or (at your option) any later version.
      8 #
      9 # This program is distributed in the hope that it would be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 # GNU General Public License for more details.
     13 #
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program; if not, write the Free Software Foundation,
     16 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     17 #
     18 # Author: Alexey Kodanev <alexey.kodanev (at] oracle.com>
     19 #
     20 # One of the possible ways to test RCU is to use rcutorture kernel module.
     21 # The test requires that kernel configured with CONFIG_RCU_TORTURE_TEST.
     22 # It runs rcutorture module using particular options and then inspects
     23 # dmesg output for module's test results.
     24 # For more information, please read Linux Documentation: RCU/torture.txt
     25 
     26 TCID="rcu_torture"
     27 TST_TOTAL=14
     28 TST_CLEANUP=cleanup
     29 
     30 . test.sh
     31 
     32 # default options
     33 test_time=60
     34 num_writers=5
     35 
     36 while getopts :ht:w: opt; do
     37 	case "$opt" in
     38 	h)
     39 		echo "Usage:"
     40 		echo "h        help"
     41 		echo "t x      time in seconds for each test-case"
     42 		echo "w x      number of writers"
     43 		exit 0
     44 	;;
     45 	t) test_time=$OPTARG ;;
     46 	w) num_writers=$OPTARG ;;
     47 	*)
     48 		tst_brkm TBROK "unknown option: $opt"
     49 	;;
     50 	esac
     51 done
     52 
     53 cleanup()
     54 {
     55 	tst_resm TINFO "cleanup"
     56 	rmmod rcutorture > /dev/null 2>&1
     57 }
     58 
     59 tst_require_root
     60 
     61 # check if module is present
     62 modprobe rcutorture > /dev/null 2>&1 || \
     63 	tst_brkm TCONF "Test requires rcutorture module"
     64 rmmod rcutorture > /dev/null 2>&1
     65 
     66 trap cleanup INT
     67 
     68 rcu_type="rcu rcu_bh srcu sched"
     69 
     70 if tst_kvcmp -lt "3.12"; then
     71 	rcu_type="$rcu_type rcu_sync rcu_expedited rcu_bh_sync rcu_bh_expedited \
     72 	          srcu_sync srcu_expedited sched_sync sched_expedited"
     73 
     74 	if tst_kvcmp -lt "3.11"; then
     75 		rcu_type="$rcu_type srcu_raw srcu_raw_sync"
     76 	fi
     77 fi
     78 
     79 TST_TOTAL=$(echo "$rcu_type" | wc -w)
     80 
     81 est_time=`echo "scale=2; $test_time * $TST_TOTAL / 60 " | bc`
     82 tst_resm TINFO "estimate time $est_time min"
     83 
     84 for type in $rcu_type; do
     85 
     86 	tst_resm TINFO "$type: running $test_time sec..."
     87 
     88 	modprobe rcutorture nfakewriters=$num_writers \
     89 	         stat_interval=60 test_no_idle_hz=1 shuffle_interval=3 \
     90 	         stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 \
     91 	         fqs_stutter=3 test_boost=1 test_boost_interval=7 \
     92 	         test_boost_duration=4 shutdown_secs=0 \
     93 	         stall_cpu=0 stall_cpu_holdoff=10 n_barrier_cbs=0 \
     94 	         onoff_interval=0 onoff_holdoff=0 torture_type=$type \
     95 	         > /dev/null 2>&1 || tst_brkm TBROK "failed to load module"
     96 
     97 	sleep $test_time
     98 
     99 	rmmod rcutorture > /dev/null 2>&1 || \
    100 		tst_brkm TBROK "failed to unload module"
    101 
    102 	# check module status in dmesg
    103 	result_str=`dmesg | sed -nE '$s/.*End of test: ([A-Z]+):.*/\1/p'`
    104 	if [ "$result_str" = "SUCCESS" ]; then
    105 		tst_resm TPASS "$type: completed"
    106 	else
    107 		tst_resm TFAIL "$type: $result_str, see dmesg"
    108 	fi
    109 done
    110 
    111 tst_exit
    112