Message ID | 20181219180316.21831-1-cristian.marussi@arm.com |
---|---|
State | Superseded |
Delegated to: | Petr Vorel |
Headers | show |
Series | cgroup_regression_test.sh ported to newlib | expand |
Hi On 19/12/2018 18:03, Cristian Marussi wrote: > In the context of newlib porting, this patch takes care to: > + remove bashism > - giving 'kill' bash-builtin needs different sigspec strings > + remove absolute/relative command invocations > + remove most global vars > + introduce a common helper to search for cgroup mountpoints > in proc/mounts > > Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> > --- I think I'll rework this already on a v2 to add SPDX headers and finishing cleaning up the test_x_y.sh helpers anyway. Any initial feedback on v1 welcome anyway... Thanks Cristian > .../cgroup/cgroup_regression_test.sh | 283 ++++++++++-------- > 1 file changed, 159 insertions(+), 124 deletions(-) > > diff --git a/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh b/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh > index 6cfc63866..fe28ab5f0 100755 > --- a/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh > +++ b/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh > @@ -1,4 +1,4 @@ > -#! /bin/bash > +#! /bin/sh > > ################################################################################ > ## ## > @@ -22,71 +22,109 @@ > ## ## > ################################################################################ > > -cd $LTPROOT/testcases/bin > +TST_TESTFUNC=do_test > +TST_SETUP=do_setup > +TST_CLEANUP=do_cleanup > +TST_CNT=10 > +TST_NEEDS_ROOT=1 > +TST_NEEDS_CMDS="dmesg mountpoint mount umount cat kill find mkdir rmdir grep" > + > +. tst_test.sh > + > +# Helper to parse /proc/mounts to find the mountpoints (if any) > +# associated with the cgroup subsystem passed as param. > +# > +# It expects as single argument the cgroup subsytem for > +# which to search in /proc/mounts the mountpoint (if any). > +# > +# - returns true|false depending if any mountpoint has been found. > +# - echos back the mountpoint itself if any found > +get_cgroup_mountpoint() > +{ > + local mntpoint > + local line > + local ret=1 > + local subsystem=$1 > + > + # fail straight away with no args > + [ $# -eq 0 ] && return $ret > + > + line=$(grep cgroup /proc/mounts | grep -w $subsystem) > + ret=$? > + # extract mountpoint if any exist > + [ $ret = 0 ] && mntpoint=$(echo $line | awk '{ print $2 }') && echo $mntpoint > + > + return $ret > +} > + > +do_setup() > +{ > + cd $LTPROOT/testcases/bin > > -export TCID="cgroup_regression_test" > -export TST_TOTAL=10 > -export TST_COUNT=1 > + mkdir cgroup/ > > -failed=0 > + if tst_kvcmp -lt "2.6.29"; then > + tst_brk TCONF ignored "test must be run with kernel 2.6.29 or newer" > + fi > > -if tst_kvcmp -lt "2.6.29"; then > - tst_brkm TCONF ignored "test must be run with kernel 2.6.29 or newer" > - exit 32 > -fi > + if [ ! -f /proc/cgroups ]; then > + tst_brk TCONF ignored "Kernel does not support for control groups; skipping testcases"; > + fi > > -if [ ! -f /proc/cgroups ]; then > - tst_brkm TCONF ignored "Kernel does not support for control groups; skipping testcases"; > - exit 32 > -fi > + dmesg -c > /dev/null > + NR_BUG=`dmesg | grep -c "kernel BUG"` > + NR_NULL=`dmesg | grep -c "kernel NULL pointer dereference"` > + NR_WARNING=`dmesg | grep -c "^WARNING"` > + NR_LOCKDEP=`dmesg | grep -c "possible recursive locking detected"` > +} > > -if [ "x$(id -ru)" != x0 ]; then > - tst_brkm TCONF ignored "Test must be run as root" > - exit 32 > -fi > +do_cleanup() > +{ > + cd $LTPROOT/testcases/bin > > -dmesg -c > /dev/null > -nr_bug=`dmesg | grep -c "kernel BUG"` > -nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` > -nr_warning=`dmesg | grep -c "^WARNING"` > -nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` > + if mountpoint -q cgroup/ > + then > + find cgroup/ -maxdepth 1 -depth -exec rmdir {} + > + umount cgroup/ > + rmdir cgroup/ > + fi > +} > > # check_kernel_bug - check if some kind of kernel bug happened > check_kernel_bug() > { > - new_bug=`dmesg | grep -c "kernel BUG"` > - new_null=`dmesg | grep -c "kernel NULL pointer dereference"` > - new_warning=`dmesg | grep -c "^WARNING"` > - new_lockdep=`dmesg | grep -c "possible recursive locking detected"` > + local new_bug=`dmesg | grep -c "kernel BUG"` > + local new_null=`dmesg | grep -c "kernel NULL pointer dereference"` > + local new_warning=`dmesg | grep -c "^WARNING"` > + local new_lockdep=`dmesg | grep -c "possible recursive locking detected"` > > # no kernel bug is detected > - if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \ > - $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then > + if [ $new_bug -eq $NR_BUG -a $new_warning -eq $NR_WARNING -a \ > + $new_null -eq $NR_NULL -a $new_lockdep -eq $NR_LOCKDEP ]; then > return 1 > fi > > # some kernel bug is detected > - if [ $new_bug -gt $nr_bug ]; then > - tst_resm TFAIL "kernel BUG was detected!" > + if [ $new_bug -gt $NR_BUG ]; then > + tst_res TFAIL "kernel BUG was detected!" > fi > - if [ $new_warning -gt $nr_warning ]; then > - tst_resm TFAIL "kernel WARNING was detected!" > + if [ $new_warning -gt $NR_WARNING ]; then > + tst_res TFAIL "kernel WARNING was detected!" > fi > - if [ $new_null -gt $nr_null ]; then > - tst_resm TFAIL "kernel NULL pointer dereference!" > + if [ $new_null -gt $NR_NULL ]; then > + tst_res TFAIL "kernel NULL pointer dereference!" > fi > - if [ $new_lockdep -gt $nr_lockdep ]; then > - tst_resm TFAIL "kernel lockdep warning was detected!" > + if [ $new_lockdep -gt $NR_LOCKDEP ]; then > + tst_res TFAIL "kernel lockdep warning was detected!" > fi > > - nr_bug=$new_bug > - nr_null=$new_null > - nr_warning=$new_warning > - nr_lockdep=$new_lockdep > + NR_BUG=$new_bug > + NR_NULL=$new_null > + NR_WARNING=$new_warning > + NR_LOCKDEP=$new_lockdep > > echo "check_kernel_bug found something!" > dmesg > - failed=1 > return 0 > } > > @@ -102,24 +140,23 @@ check_kernel_bug() > #--------------------------------------------------------------------------- > test_1() > { > - ./fork_processes & > + fork_processes & > sleep 1 > > mount -t cgroup -o none,name=foo cgroup cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "failed to mount cgroup filesystem" > - failed=1 > - /bin/kill -SIGTERM $! > + tst_res TFAIL "failed to mount cgroup filesystem" > + kill -TERM $! > return > fi > cat cgroup/tasks > /dev/null > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > fi > > - /bin/kill -SIGTERM $! > + kill -TERM $! > wait $! > umount cgroup/ > } > @@ -132,11 +169,13 @@ test_1() > #--------------------------------------------------------------------------- > test_2() > { > + local val1 > + local val2 > + > mount -t cgroup -o none,name=foo cgroup cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "Failed to mount cgroup filesystem" > - failed=1 > - return 1 > + tst_res TFAIL "Failed to mount cgroup filesystem" > + return > fi > > echo 0 > cgroup/notify_on_release > @@ -148,16 +187,15 @@ test_2() > val2=`cat cgroup/1/notify_on_release` > > if [ $val1 -ne 0 -o $val2 -ne 1 ]; then > - tst_resm TFAIL "wrong notify_on_release value" > - failed=1 > + tst_res TFAIL "wrong notify_on_release value" > else > - tst_resm TPASS "notify_on_release is inherited" > + tst_res TPASS "notify_on_release is inherited" > fi > > rmdir cgroup/0 cgroup/1 > umount cgroup/ > > - return $failed > + return > } > > #--------------------------------------------------------------------------- > @@ -173,14 +211,14 @@ test_3() > local cpu_subsys_path > > if [ ! -e /proc/sched_debug ]; then > - tst_resm TCONF "CONFIG_SCHED_DEBUG is not enabled" > + tst_res TCONF "CONFIG_SCHED_DEBUG is not enabled" > return > fi > > if grep -q -w "cpu" /proc/cgroups ; then > - cpu_subsys_path=$(grep -w cpu /proc/mounts | awk '{ print $2 }') > + cpu_subsys_path=$(get_cgroup_mountpoint "cpu") > else > - tst_resm TCONF "CONFIG_CGROUP_SCHED is not enabled" > + tst_res TCONF "CONFIG_CGROUP_SCHED is not enabled" > return > fi > > @@ -188,8 +226,7 @@ test_3() > if [ -z "$cpu_subsys_path" ]; then > mount -t cgroup -o cpu xxx cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "Failed to mount cpu subsys" > - failed=1 > + tst_res TFAIL "Failed to mount cpu subsys" > return > fi > cpu_subsys_path=cgroup > @@ -201,13 +238,13 @@ test_3() > pid2=$! > > sleep 30 > - /bin/kill -SIGUSR1 $pid1 $pid2 > + kill -USR1 $pid1 $pid2 > wait $pid1 > wait $pid2 > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > fi > > rmdir $cpu_subsys_path/* 2> /dev/null > @@ -223,15 +260,17 @@ test_3() > #--------------------------------------------------------------------------- > test_4() > { > + local lines > + > if [ ! -e /proc/lockdep ]; then > - tst_resm TCONF "CONFIG_LOCKDEP is not enabled" > + tst_res TCONF "CONFIG_LOCKDEP is not enabled" > return > fi > > # MAX_LOCKDEP_SUBCLASSES is 8, so number of subsys should be > 8 > lines=`cat /proc/cgroups | wc -l` > if [ $lines -le 9 ]; then > - tst_resm TCONF "require more than 8 cgroup subsystems" > + tst_res TCONF "require more than 8 cgroup subsystems" > return > fi > > @@ -242,11 +281,10 @@ test_4() > > dmesg | grep -q "MAX_LOCKDEP_SUBCLASSES too low" > if [ $? -eq 0 ]; then > - tst_resm TFAIL "lockdep BUG was found" > - failed=1 > + tst_res TFAIL "lockdep BUG was found" > return > else > - tst_resm TPASS "no lockdep BUG was found" > + tst_res TPASS "no lockdep BUG was found" > fi > } > > @@ -264,14 +302,14 @@ test_5() > local failing > local mntpoint > > - lines=`cat /proc/cgroups | wc -l` > + local lines=`cat /proc/cgroups | wc -l` > if [ $lines -le 2 ]; then > - tst_resm TCONF "require at least 2 cgroup subsystems" > + tst_res TCONF "require at least 2 cgroup subsystems" > return > fi > > - subsys1=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` > - subsys2=`tail -n 2 /proc/cgroups | head -1 | awk '{ print $1 }'` > + local subsys1=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` > + local subsys2=`tail -n 2 /proc/cgroups | head -1 | awk '{ print $1 }'` > > # Accounting here for the fact that the chosen subsystems could > # have been already previously mounted at boot time: in such a > @@ -280,32 +318,30 @@ test_5() > # $failing params to be used in the following expected-to-fail > # mount action. Note that the subsysN name itself will be listed > # amongst mounts options. > - cat /proc/mounts | grep cgroup | grep -q $subsys1 && mounted=$subsys1 > - [ -z "$mounted" ] && cat /proc/mounts | grep cgroup | grep -q $subsys2 && mounted=$subsys2 > + get_cgroup_mountpoint $subsys1 >/dev/null && mounted=$subsys1 > + [ -z "$mounted" ] && get_cgroup_mountpoint $subsys2 >/dev/null && mounted=$subsys2 > if [ -z "$mounted" ]; then > mntpoint=cgroup > failing=$subsys1 > mount -t cgroup -o $subsys1,$subsys2 xxx $mntpoint/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "mount $subsys1 and $subsys2 failed" > - failed=1 > + tst_res TFAIL "mount $subsys1 and $subsys2 failed" > return > fi > else > # Use the pre-esistent mountpoint as $mntpoint and use a > # co-mount with $failing: this way the 2nd mount will > # also fail (as expected) in this 'mirrored' configuration. > - mntpoint=$(cat /proc/mounts | grep cgroup | grep $mounted | awk '{ print $2 }') > + mntpoint=$(get_cgroup_mountpoint $mounted) > failing=$subsys1,$subsys2 > fi > > # This 2nd mount has been properly configured to fail > mount -t cgroup -o $failing xxx $mntpoint/ 2> /dev/null > if [ $? -eq 0 ]; then > - tst_resm TFAIL "mount $failing should fail" > + tst_res TFAIL "mount $failing should fail" > # Do NOT unmount pre-existent mountpoints... > - [ -z "$mounted" ] && umount $mntpoint > - failed=1 > + [ -z "$mounted" ] && umount $mntpoint/ > return > fi > > @@ -321,15 +357,15 @@ test_5() > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > fi > > # clean up > - /bin/kill -SIGTERM $! > /dev/null > + kill -TERM $! > /dev/null > wait $! > rmdir $mntpoint/0 > # Do NOT unmount pre-existent mountpoints... > - [ -z "$mounted" ] && umount $mntpoint > + [ -z "$mounted" ] && umount $mntpoint/ > } > > #--------------------------------------------------------------------------- > @@ -342,25 +378,25 @@ test_6() > { > grep -q -w "ns" /proc/cgroups > if [ $? -ne 0 ]; then > - tst_resm TCONF "CONFIG_CGROUP_NS" > + tst_res TCONF "CONFIG_CGROUP_NS" > return > fi > > # run the test for 30 secs > ./test_6_1.sh & > - pid1=$! > + local pid1=$! > ./test_6_2 & > - pid2=$! > + local pid2=$! > > sleep 30 > - /bin/kill -SIGUSR1 $pid1 > - /bin/kill -SIGTERM $pid2 > + kill -USR1 $pid1 > + kill -TERM $pid2 > wait $pid1 > wait $pid2 > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > fi > > # clean up > @@ -379,12 +415,18 @@ test_6() > #--------------------------------------------------------------------------- > test_7_1() > { > - subsys_path=$(grep -w $subsys /proc/mounts | cut -d ' ' -f 2) > + local subsys=$1 > + # we should be careful to select a $subsys_path which is related to > + # cgroup only: if cgroup debugging is enabled a 'debug' $subsys > + # could be passed here as params and this will lead to ambiguity and > + # errors when grepping simply for 'debug' in /proc/mounts since we'll > + # find also /sys/kernel/debug. Helper takes care of this. > + local subsys_path=$(get_cgroup_mountpoint $subsys) > + > if [ -z "$subsys_path" ]; then > mount -t cgroup -o $subsys xxx cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "failed to mount $subsys" > - failed=1 > + tst_res TFAIL "failed to mount $subsys" > return > fi > subsys_path=cgroup > @@ -399,7 +441,7 @@ test_7_1() > > if [ "$subsys_path" = "cgroup" ]; then > mount -t cgroup -o remount xxx cgroup/ 2> /dev/null > - /bin/kill -SIGTERM $! > + kill -TERM $! > wait $! > umount cgroup/ > fi > @@ -407,10 +449,11 @@ test_7_1() > > test_7_2() > { > + local subsys=$1 > + > mount -t cgroup -o none,name=foo cgroup cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "failed to mount cgroup" > - failed=1 > + tst_res TFAIL "failed to mount cgroup" > return > fi > > @@ -421,7 +464,7 @@ test_7_2() > # remount with some subsystems removed > # since 2.6.28, this remount will fail > mount -t cgroup -o remount,$subsys xxx cgroup/ 2> /dev/null > - /bin/kill -SIGTERM $! > + kill -TERM $! > wait $! > umount cgroup/ > > @@ -441,19 +484,19 @@ test_7_2() > > test_7() > { > - lines=`cat /proc/cgroups | wc -l` > + local lines=`cat /proc/cgroups | wc -l` > if [ $lines -le 2 ]; then > - tst_resm TCONF "require at least 2 cgroup subsystems" > + tst_res TCONF "require at least 2 cgroup subsystems" > slt_result $SLT_Untested > return > fi > > - subsys=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` > + local subsys=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` > > # remount to add new subsystems to the hierarchy > - i=1 > + local i=1 > while [ $i -le 2 ] ; do > - test_7_$i > + test_7_$i $subsys > if [ $? -ne 0 ]; then > return > fi > @@ -465,7 +508,7 @@ test_7() > : $(( i += 1 )) > done > > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > } > > #--------------------------------------------------------------------------- > @@ -478,22 +521,20 @@ test_8() > { > mount -t cgroup -o none,name=foo cgroup cgroup/ > if [ $? -ne 0 ]; then > - tst_resm TFAIL "failed to mount cgroup filesystem" > - failed=1 > + tst_res TFAIL "failed to mount cgroup filesystem" > return > fi > > - ./getdelays -C cgroup/tasks > /dev/null 2>&1 > + getdelays -C cgroup/tasks > /dev/null 2>&1 > if [ $? -eq 0 ]; then > - tst_resm TFAIL "should have failed to get cgroupstat of tasks file" > + tst_res TFAIL "should have failed to get cgroupstat of tasks file" > umount cgroup/ > - failed=1 > return > fi > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel bug was found" > + tst_res TPASS "no kernel bug was found" > fi > > umount cgroup/ > @@ -510,12 +551,12 @@ test_8() > test_9() > { > ./test_9_1.sh & > - pid1=$! > + local pid1=$! > ./test_9_2.sh & > - pid2=$! > + local pid2=$! > > sleep 30 > - /bin/kill -SIGUSR1 $pid1 $pid2 > + kill -USR1 $pid1 $pid2 > wait $pid1 > wait $pid2 > > @@ -523,7 +564,7 @@ test_9() > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel warning was found" > + tst_res TPASS "no kernel warning was found" > fi > } > > @@ -537,12 +578,12 @@ test_9() > test_10() > { > ./test_10_1.sh & > - pid1=$! > + local pid1=$! > ./test_10_2.sh & > - pid2=$! > + local pid2=$! > > sleep 30 > - /bin/kill -SIGUSR1 $pid1 $pid2 > + kill -USR1 $pid1 $pid2 > wait $pid1 > wait $pid2 > > @@ -552,21 +593,15 @@ test_10() > > check_kernel_bug > if [ $? -eq 1 ]; then > - tst_resm TPASS "no kernel warning was found" > + tst_res TPASS "no kernel warning was found" > fi > } > > -# main > - > -mkdir cgroup/ > - > -for ((cur = 1; cur <= $TST_TOTAL; cur++)) > +do_test() > { > - export TST_COUNT=$cur > + local cur=$1 > > test_$cur > } > > -find cgroup/ -maxdepth 1 -depth -exec rmdir {} + > - > -exit $failed > +tst_run >
diff --git a/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh b/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh index 6cfc63866..fe28ab5f0 100755 --- a/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh +++ b/testcases/kernel/controllers/cgroup/cgroup_regression_test.sh @@ -1,4 +1,4 @@ -#! /bin/bash +#! /bin/sh ################################################################################ ## ## @@ -22,71 +22,109 @@ ## ## ################################################################################ -cd $LTPROOT/testcases/bin +TST_TESTFUNC=do_test +TST_SETUP=do_setup +TST_CLEANUP=do_cleanup +TST_CNT=10 +TST_NEEDS_ROOT=1 +TST_NEEDS_CMDS="dmesg mountpoint mount umount cat kill find mkdir rmdir grep" + +. tst_test.sh + +# Helper to parse /proc/mounts to find the mountpoints (if any) +# associated with the cgroup subsystem passed as param. +# +# It expects as single argument the cgroup subsytem for +# which to search in /proc/mounts the mountpoint (if any). +# +# - returns true|false depending if any mountpoint has been found. +# - echos back the mountpoint itself if any found +get_cgroup_mountpoint() +{ + local mntpoint + local line + local ret=1 + local subsystem=$1 + + # fail straight away with no args + [ $# -eq 0 ] && return $ret + + line=$(grep cgroup /proc/mounts | grep -w $subsystem) + ret=$? + # extract mountpoint if any exist + [ $ret = 0 ] && mntpoint=$(echo $line | awk '{ print $2 }') && echo $mntpoint + + return $ret +} + +do_setup() +{ + cd $LTPROOT/testcases/bin -export TCID="cgroup_regression_test" -export TST_TOTAL=10 -export TST_COUNT=1 + mkdir cgroup/ -failed=0 + if tst_kvcmp -lt "2.6.29"; then + tst_brk TCONF ignored "test must be run with kernel 2.6.29 or newer" + fi -if tst_kvcmp -lt "2.6.29"; then - tst_brkm TCONF ignored "test must be run with kernel 2.6.29 or newer" - exit 32 -fi + if [ ! -f /proc/cgroups ]; then + tst_brk TCONF ignored "Kernel does not support for control groups; skipping testcases"; + fi -if [ ! -f /proc/cgroups ]; then - tst_brkm TCONF ignored "Kernel does not support for control groups; skipping testcases"; - exit 32 -fi + dmesg -c > /dev/null + NR_BUG=`dmesg | grep -c "kernel BUG"` + NR_NULL=`dmesg | grep -c "kernel NULL pointer dereference"` + NR_WARNING=`dmesg | grep -c "^WARNING"` + NR_LOCKDEP=`dmesg | grep -c "possible recursive locking detected"` +} -if [ "x$(id -ru)" != x0 ]; then - tst_brkm TCONF ignored "Test must be run as root" - exit 32 -fi +do_cleanup() +{ + cd $LTPROOT/testcases/bin -dmesg -c > /dev/null -nr_bug=`dmesg | grep -c "kernel BUG"` -nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` -nr_warning=`dmesg | grep -c "^WARNING"` -nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` + if mountpoint -q cgroup/ + then + find cgroup/ -maxdepth 1 -depth -exec rmdir {} + + umount cgroup/ + rmdir cgroup/ + fi +} # check_kernel_bug - check if some kind of kernel bug happened check_kernel_bug() { - new_bug=`dmesg | grep -c "kernel BUG"` - new_null=`dmesg | grep -c "kernel NULL pointer dereference"` - new_warning=`dmesg | grep -c "^WARNING"` - new_lockdep=`dmesg | grep -c "possible recursive locking detected"` + local new_bug=`dmesg | grep -c "kernel BUG"` + local new_null=`dmesg | grep -c "kernel NULL pointer dereference"` + local new_warning=`dmesg | grep -c "^WARNING"` + local new_lockdep=`dmesg | grep -c "possible recursive locking detected"` # no kernel bug is detected - if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \ - $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then + if [ $new_bug -eq $NR_BUG -a $new_warning -eq $NR_WARNING -a \ + $new_null -eq $NR_NULL -a $new_lockdep -eq $NR_LOCKDEP ]; then return 1 fi # some kernel bug is detected - if [ $new_bug -gt $nr_bug ]; then - tst_resm TFAIL "kernel BUG was detected!" + if [ $new_bug -gt $NR_BUG ]; then + tst_res TFAIL "kernel BUG was detected!" fi - if [ $new_warning -gt $nr_warning ]; then - tst_resm TFAIL "kernel WARNING was detected!" + if [ $new_warning -gt $NR_WARNING ]; then + tst_res TFAIL "kernel WARNING was detected!" fi - if [ $new_null -gt $nr_null ]; then - tst_resm TFAIL "kernel NULL pointer dereference!" + if [ $new_null -gt $NR_NULL ]; then + tst_res TFAIL "kernel NULL pointer dereference!" fi - if [ $new_lockdep -gt $nr_lockdep ]; then - tst_resm TFAIL "kernel lockdep warning was detected!" + if [ $new_lockdep -gt $NR_LOCKDEP ]; then + tst_res TFAIL "kernel lockdep warning was detected!" fi - nr_bug=$new_bug - nr_null=$new_null - nr_warning=$new_warning - nr_lockdep=$new_lockdep + NR_BUG=$new_bug + NR_NULL=$new_null + NR_WARNING=$new_warning + NR_LOCKDEP=$new_lockdep echo "check_kernel_bug found something!" dmesg - failed=1 return 0 } @@ -102,24 +140,23 @@ check_kernel_bug() #--------------------------------------------------------------------------- test_1() { - ./fork_processes & + fork_processes & sleep 1 mount -t cgroup -o none,name=foo cgroup cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "failed to mount cgroup filesystem" - failed=1 - /bin/kill -SIGTERM $! + tst_res TFAIL "failed to mount cgroup filesystem" + kill -TERM $! return fi cat cgroup/tasks > /dev/null check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" fi - /bin/kill -SIGTERM $! + kill -TERM $! wait $! umount cgroup/ } @@ -132,11 +169,13 @@ test_1() #--------------------------------------------------------------------------- test_2() { + local val1 + local val2 + mount -t cgroup -o none,name=foo cgroup cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "Failed to mount cgroup filesystem" - failed=1 - return 1 + tst_res TFAIL "Failed to mount cgroup filesystem" + return fi echo 0 > cgroup/notify_on_release @@ -148,16 +187,15 @@ test_2() val2=`cat cgroup/1/notify_on_release` if [ $val1 -ne 0 -o $val2 -ne 1 ]; then - tst_resm TFAIL "wrong notify_on_release value" - failed=1 + tst_res TFAIL "wrong notify_on_release value" else - tst_resm TPASS "notify_on_release is inherited" + tst_res TPASS "notify_on_release is inherited" fi rmdir cgroup/0 cgroup/1 umount cgroup/ - return $failed + return } #--------------------------------------------------------------------------- @@ -173,14 +211,14 @@ test_3() local cpu_subsys_path if [ ! -e /proc/sched_debug ]; then - tst_resm TCONF "CONFIG_SCHED_DEBUG is not enabled" + tst_res TCONF "CONFIG_SCHED_DEBUG is not enabled" return fi if grep -q -w "cpu" /proc/cgroups ; then - cpu_subsys_path=$(grep -w cpu /proc/mounts | awk '{ print $2 }') + cpu_subsys_path=$(get_cgroup_mountpoint "cpu") else - tst_resm TCONF "CONFIG_CGROUP_SCHED is not enabled" + tst_res TCONF "CONFIG_CGROUP_SCHED is not enabled" return fi @@ -188,8 +226,7 @@ test_3() if [ -z "$cpu_subsys_path" ]; then mount -t cgroup -o cpu xxx cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "Failed to mount cpu subsys" - failed=1 + tst_res TFAIL "Failed to mount cpu subsys" return fi cpu_subsys_path=cgroup @@ -201,13 +238,13 @@ test_3() pid2=$! sleep 30 - /bin/kill -SIGUSR1 $pid1 $pid2 + kill -USR1 $pid1 $pid2 wait $pid1 wait $pid2 check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" fi rmdir $cpu_subsys_path/* 2> /dev/null @@ -223,15 +260,17 @@ test_3() #--------------------------------------------------------------------------- test_4() { + local lines + if [ ! -e /proc/lockdep ]; then - tst_resm TCONF "CONFIG_LOCKDEP is not enabled" + tst_res TCONF "CONFIG_LOCKDEP is not enabled" return fi # MAX_LOCKDEP_SUBCLASSES is 8, so number of subsys should be > 8 lines=`cat /proc/cgroups | wc -l` if [ $lines -le 9 ]; then - tst_resm TCONF "require more than 8 cgroup subsystems" + tst_res TCONF "require more than 8 cgroup subsystems" return fi @@ -242,11 +281,10 @@ test_4() dmesg | grep -q "MAX_LOCKDEP_SUBCLASSES too low" if [ $? -eq 0 ]; then - tst_resm TFAIL "lockdep BUG was found" - failed=1 + tst_res TFAIL "lockdep BUG was found" return else - tst_resm TPASS "no lockdep BUG was found" + tst_res TPASS "no lockdep BUG was found" fi } @@ -264,14 +302,14 @@ test_5() local failing local mntpoint - lines=`cat /proc/cgroups | wc -l` + local lines=`cat /proc/cgroups | wc -l` if [ $lines -le 2 ]; then - tst_resm TCONF "require at least 2 cgroup subsystems" + tst_res TCONF "require at least 2 cgroup subsystems" return fi - subsys1=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` - subsys2=`tail -n 2 /proc/cgroups | head -1 | awk '{ print $1 }'` + local subsys1=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` + local subsys2=`tail -n 2 /proc/cgroups | head -1 | awk '{ print $1 }'` # Accounting here for the fact that the chosen subsystems could # have been already previously mounted at boot time: in such a @@ -280,32 +318,30 @@ test_5() # $failing params to be used in the following expected-to-fail # mount action. Note that the subsysN name itself will be listed # amongst mounts options. - cat /proc/mounts | grep cgroup | grep -q $subsys1 && mounted=$subsys1 - [ -z "$mounted" ] && cat /proc/mounts | grep cgroup | grep -q $subsys2 && mounted=$subsys2 + get_cgroup_mountpoint $subsys1 >/dev/null && mounted=$subsys1 + [ -z "$mounted" ] && get_cgroup_mountpoint $subsys2 >/dev/null && mounted=$subsys2 if [ -z "$mounted" ]; then mntpoint=cgroup failing=$subsys1 mount -t cgroup -o $subsys1,$subsys2 xxx $mntpoint/ if [ $? -ne 0 ]; then - tst_resm TFAIL "mount $subsys1 and $subsys2 failed" - failed=1 + tst_res TFAIL "mount $subsys1 and $subsys2 failed" return fi else # Use the pre-esistent mountpoint as $mntpoint and use a # co-mount with $failing: this way the 2nd mount will # also fail (as expected) in this 'mirrored' configuration. - mntpoint=$(cat /proc/mounts | grep cgroup | grep $mounted | awk '{ print $2 }') + mntpoint=$(get_cgroup_mountpoint $mounted) failing=$subsys1,$subsys2 fi # This 2nd mount has been properly configured to fail mount -t cgroup -o $failing xxx $mntpoint/ 2> /dev/null if [ $? -eq 0 ]; then - tst_resm TFAIL "mount $failing should fail" + tst_res TFAIL "mount $failing should fail" # Do NOT unmount pre-existent mountpoints... - [ -z "$mounted" ] && umount $mntpoint - failed=1 + [ -z "$mounted" ] && umount $mntpoint/ return fi @@ -321,15 +357,15 @@ test_5() check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" fi # clean up - /bin/kill -SIGTERM $! > /dev/null + kill -TERM $! > /dev/null wait $! rmdir $mntpoint/0 # Do NOT unmount pre-existent mountpoints... - [ -z "$mounted" ] && umount $mntpoint + [ -z "$mounted" ] && umount $mntpoint/ } #--------------------------------------------------------------------------- @@ -342,25 +378,25 @@ test_6() { grep -q -w "ns" /proc/cgroups if [ $? -ne 0 ]; then - tst_resm TCONF "CONFIG_CGROUP_NS" + tst_res TCONF "CONFIG_CGROUP_NS" return fi # run the test for 30 secs ./test_6_1.sh & - pid1=$! + local pid1=$! ./test_6_2 & - pid2=$! + local pid2=$! sleep 30 - /bin/kill -SIGUSR1 $pid1 - /bin/kill -SIGTERM $pid2 + kill -USR1 $pid1 + kill -TERM $pid2 wait $pid1 wait $pid2 check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" fi # clean up @@ -379,12 +415,18 @@ test_6() #--------------------------------------------------------------------------- test_7_1() { - subsys_path=$(grep -w $subsys /proc/mounts | cut -d ' ' -f 2) + local subsys=$1 + # we should be careful to select a $subsys_path which is related to + # cgroup only: if cgroup debugging is enabled a 'debug' $subsys + # could be passed here as params and this will lead to ambiguity and + # errors when grepping simply for 'debug' in /proc/mounts since we'll + # find also /sys/kernel/debug. Helper takes care of this. + local subsys_path=$(get_cgroup_mountpoint $subsys) + if [ -z "$subsys_path" ]; then mount -t cgroup -o $subsys xxx cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "failed to mount $subsys" - failed=1 + tst_res TFAIL "failed to mount $subsys" return fi subsys_path=cgroup @@ -399,7 +441,7 @@ test_7_1() if [ "$subsys_path" = "cgroup" ]; then mount -t cgroup -o remount xxx cgroup/ 2> /dev/null - /bin/kill -SIGTERM $! + kill -TERM $! wait $! umount cgroup/ fi @@ -407,10 +449,11 @@ test_7_1() test_7_2() { + local subsys=$1 + mount -t cgroup -o none,name=foo cgroup cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "failed to mount cgroup" - failed=1 + tst_res TFAIL "failed to mount cgroup" return fi @@ -421,7 +464,7 @@ test_7_2() # remount with some subsystems removed # since 2.6.28, this remount will fail mount -t cgroup -o remount,$subsys xxx cgroup/ 2> /dev/null - /bin/kill -SIGTERM $! + kill -TERM $! wait $! umount cgroup/ @@ -441,19 +484,19 @@ test_7_2() test_7() { - lines=`cat /proc/cgroups | wc -l` + local lines=`cat /proc/cgroups | wc -l` if [ $lines -le 2 ]; then - tst_resm TCONF "require at least 2 cgroup subsystems" + tst_res TCONF "require at least 2 cgroup subsystems" slt_result $SLT_Untested return fi - subsys=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` + local subsys=`tail -n 1 /proc/cgroups | awk '{ print $1 }'` # remount to add new subsystems to the hierarchy - i=1 + local i=1 while [ $i -le 2 ] ; do - test_7_$i + test_7_$i $subsys if [ $? -ne 0 ]; then return fi @@ -465,7 +508,7 @@ test_7() : $(( i += 1 )) done - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" } #--------------------------------------------------------------------------- @@ -478,22 +521,20 @@ test_8() { mount -t cgroup -o none,name=foo cgroup cgroup/ if [ $? -ne 0 ]; then - tst_resm TFAIL "failed to mount cgroup filesystem" - failed=1 + tst_res TFAIL "failed to mount cgroup filesystem" return fi - ./getdelays -C cgroup/tasks > /dev/null 2>&1 + getdelays -C cgroup/tasks > /dev/null 2>&1 if [ $? -eq 0 ]; then - tst_resm TFAIL "should have failed to get cgroupstat of tasks file" + tst_res TFAIL "should have failed to get cgroupstat of tasks file" umount cgroup/ - failed=1 return fi check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel bug was found" + tst_res TPASS "no kernel bug was found" fi umount cgroup/ @@ -510,12 +551,12 @@ test_8() test_9() { ./test_9_1.sh & - pid1=$! + local pid1=$! ./test_9_2.sh & - pid2=$! + local pid2=$! sleep 30 - /bin/kill -SIGUSR1 $pid1 $pid2 + kill -USR1 $pid1 $pid2 wait $pid1 wait $pid2 @@ -523,7 +564,7 @@ test_9() check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel warning was found" + tst_res TPASS "no kernel warning was found" fi } @@ -537,12 +578,12 @@ test_9() test_10() { ./test_10_1.sh & - pid1=$! + local pid1=$! ./test_10_2.sh & - pid2=$! + local pid2=$! sleep 30 - /bin/kill -SIGUSR1 $pid1 $pid2 + kill -USR1 $pid1 $pid2 wait $pid1 wait $pid2 @@ -552,21 +593,15 @@ test_10() check_kernel_bug if [ $? -eq 1 ]; then - tst_resm TPASS "no kernel warning was found" + tst_res TPASS "no kernel warning was found" fi } -# main - -mkdir cgroup/ - -for ((cur = 1; cur <= $TST_TOTAL; cur++)) +do_test() { - export TST_COUNT=$cur + local cur=$1 test_$cur } -find cgroup/ -maxdepth 1 -depth -exec rmdir {} + - -exit $failed +tst_run
In the context of newlib porting, this patch takes care to: + remove bashism - giving 'kill' bash-builtin needs different sigspec strings + remove absolute/relative command invocations + remove most global vars + introduce a common helper to search for cgroup mountpoints in proc/mounts Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- .../cgroup/cgroup_regression_test.sh | 283 ++++++++++-------- 1 file changed, 159 insertions(+), 124 deletions(-)