123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- #!/bin/sh
- # SPDX-License-Identifier: GPL-2.0-or-later
- # Copyright (c) 2019 Petr Vorel <pvorel@suse.cz>
- # Copyright (c) 2009 FUJITSU LIMITED
- # Author: Li Zefan <lizf@cn.fujitsu.com>
- TST_TESTFUNC=test
- TST_SETUP=do_setup
- TST_CLEANUP=do_cleanup
- TST_CNT=9
- TST_NEEDS_ROOT=1
- TST_NEEDS_TMPDIR=1
- TST_NEEDS_CMDS="awk dmesg find mountpoint rmdir"
- . cgroup_lib.sh
- do_setup()
- {
- mkdir cgroup/
- 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 [ ! -f /proc/cgroups ]; then
- tst_brk TCONF ignored "Kernel does not support for control groups; skipping testcases";
- 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"`
- }
- do_cleanup()
- {
- if mountpoint -q cgroup/; then
- find cgroup/ -maxdepth 1 -depth -exec rmdir {} +
- umount cgroup/
- rmdir cgroup
- fi
- }
- check_kernel_bug()
- {
- local id="$1"
- local ok_msg="no kernel bug was found"
- 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"`
- [ "$id" ] && ok_msg="$ok_msg for test $i"
- # 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
- tst_res TPASS $ok_msg
- return 0
- fi
- # some kernel bug is detected
- if [ $new_bug -gt $NR_BUG ]; then
- tst_res TFAIL "kernel BUG was detected!"
- fi
- if [ $new_warning -gt $NR_WARNING ]; then
- tst_res TFAIL "kernel WARNING was detected!"
- fi
- if [ $new_null -gt $NR_NULL ]; then
- tst_res TFAIL "kernel NULL pointer dereference!"
- fi
- 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
- tst_res TWARN "BUG FOUND!"
- dmesg
- return 1
- }
- #---------------------------------------------------------------------------
- # Bug: There was a race when keeping forking processes and at the same
- # time cat /cgroup/tasks (should be the very first time to read
- # /cgroup/tasks, otherwise this bug won't be triggered)
- # Kernel: 2.6.24, 2.6.25-rcX
- # Links: http://lkml.org/lkml/2007/10/17/224
- # http://lkml.org/lkml/2008/3/5/332
- # http://lkml.org/lkml/2008/4/16/493
- # Fix: commit 0e04388f0189fa1f6812a8e1cb6172136eada87e
- #---------------------------------------------------------------------------
- test1()
- {
- cgroup_regression_fork_processes &
- sleep 1
- mount -t cgroup -o none,name=foo cgroup cgroup/
- if [ $? -ne 0 ]; then
- tst_res TFAIL "failed to mount cgroup filesystem"
- kill -TERM $!
- return
- fi
- cat cgroup/tasks > /dev/null
- kill -TERM $!
- wait $! 2>/dev/null
- umount cgroup/
- check_kernel_bug
- }
- #---------------------------------------------------------------------------
- # Bug: a cgroup's notify_on_release flag did not inherit from its parent.
- # Kernel: 2.6.24-rcX
- # Links: http://lkml.org/lkml/2008/2/25/12
- # Fix: commit bc231d2a048010d5e0b49ac7fddbfa822fc41109
- #---------------------------------------------------------------------------
- test2()
- {
- local val1
- local val2
- mount -t cgroup -o none,name=foo cgroup cgroup/
- if [ $? -ne 0 ]; then
- tst_res TFAIL "Failed to mount cgroup filesystem"
- return
- fi
- echo 0 > cgroup/notify_on_release
- mkdir cgroup/0
- val1=`cat cgroup/0/notify_on_release`
- echo 1 > cgroup/notify_on_release
- mkdir cgroup/1
- val2=`cat cgroup/1/notify_on_release`
- if [ $val1 -ne 0 -o $val2 -ne 1 ]; then
- tst_res TFAIL "wrong notify_on_release value"
- else
- tst_res TPASS "notify_on_release is inherited"
- fi
- rmdir cgroup/0 cgroup/1
- umount cgroup/
- }
- #---------------------------------------------------------------------------
- # Bug: Accessing NULL cgrp->dentry when reading /proc/sched_debug
- # Kernel: 2.6.26-2.6.28
- # Links: http://lkml.org/lkml/2008/10/30/44
- # http://lkml.org/lkml/2008/12/12/107
- # http://lkml.org/lkml/2008/12/16/481
- # Fix: commit a47295e6bc42ad35f9c15ac66f598aa24debd4e2
- #---------------------------------------------------------------------------
- test3()
- {
- local cpu_subsys_path
- if [ ! -e /proc/sched_debug ]; then
- tst_res TCONF "CONFIG_SCHED_DEBUG is not enabled"
- return
- fi
- if ! grep -q -w "cpu" /proc/cgroups; then
- tst_res TCONF "CONFIG_CGROUP_SCHED is not enabled"
- return
- fi
- cpu_subsys_path=$(get_cgroup_mountpoint "cpu")
- # Run the test for 30 secs
- if [ -z "$cpu_subsys_path" ]; then
- mount -t cgroup -o cpu xxx cgroup/
- if [ $? -ne 0 ]; then
- tst_res TFAIL "Failed to mount cpu subsys"
- return
- fi
- cpu_subsys_path=cgroup
- fi
- cgroup_regression_3_1.sh $cpu_subsys_path &
- pid1=$!
- cgroup_regression_3_2.sh &
- pid2=$!
- sleep 30
- kill -USR1 $pid1 $pid2
- wait $pid1 2>/dev/null
- wait $pid2 2>/dev/null
- rmdir $cpu_subsys_path/0 2> /dev/null
- umount cgroup/ 2> /dev/null
- check_kernel_bug
- }
- #---------------------------------------------------------------------------
- # Bug: cgroup hierarchy lock's lockdep subclass may overflow
- # Kernel: 2.6.29-rcX
- # Link: http://lkml.org/lkml/2009/2/4/67
- # Fix:
- #---------------------------------------------------------------------------
- test4()
- {
- local lines
- if [ ! -e /proc/lockdep ]; then
- 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_res TCONF "require more than 8 cgroup subsystems"
- return
- fi
- mount -t cgroup -o none,name=foo cgroup cgroup/
- mkdir cgroup/0
- rmdir cgroup/0
- umount cgroup/
- if dmesg | grep -q "MAX_LOCKDEP_SUBCLASSES too low"; then
- tst_res TFAIL "lockdep BUG was found"
- return
- fi
- tst_res TPASS "no lockdep BUG was found"
- }
- #---------------------------------------------------------------------------
- # Bug: When running 2 concurrent mount/umount threads, kernel WARNING
- # may be triggered, but it's VFS' issue but not cgroup.
- # Kernel: 2.6.24 - 2.6.29-rcX
- # Links: http://lkml.org/lkml/2009/1/4/354
- # Fix: commit 1a88b5364b535edaa321d70a566e358390ff0872
- #---------------------------------------------------------------------------
- test5()
- {
- cgroup_regression_5_1.sh &
- local pid1=$!
- cgroup_regression_5_2.sh &
- local pid2=$!
- sleep 30
- kill -USR1 $pid1 $pid2
- wait $pid1 2>/dev/null
- wait $pid2 2>/dev/null
- mount -t cgroup none cgroup 2> /dev/null
- mkdir cgroup/0
- rmdir cgroup/0
- umount cgroup/ 2> /dev/null
- check_kernel_bug
- }
- #---------------------------------------------------------------------------
- # Bug: There was a race between cgroup_clone and umount
- # Kernel: 2.6.24 - 2.6.28, 2.6.29-rcX
- # Links: http://lkml.org/lkml/2008/12/24/124
- # Fix: commit 7b574b7b0124ed344911f5d581e9bc2d83bbeb19
- #---------------------------------------------------------------------------
- test6()
- {
- if tst_kvcmp -ge "3.0"; then
- tst_res TCONF "CONFIG_CGROUP_NS is NOT supported in Kernels >= 3.0"
- return
- fi
- if ! grep -q -w "ns" /proc/cgroups; then
- tst_res TCONF "CONFIG_CGROUP_NS is NOT enabled"
- return
- fi
- cgroup_regression_6_1.sh &
- local pid1=$!
- cgroup_regression_6_2 &
- local pid2=$!
- tst_res TINFO "run test for 30 sec"
- sleep 30
- kill -USR1 $pid1
- kill -TERM $pid2
- wait $pid1 2>/dev/null
- wait $pid2 2>/dev/null
- mount -t cgroup -o ns xxx cgroup/ > /dev/null 2>&1
- rmdir cgroup/[1-9]* > /dev/null 2>&1
- umount cgroup/
- check_kernel_bug
- }
- #---------------------------------------------------------------------------
- # Bug: There was a bug when remount cgroup fs with some dead subdirs in
- # it (rmdir()ed but still has some refcnts on it). It caused memory
- # leak, and may cause oops when cat /proc/sched_debug.
- # Kernel: 2.6.24 - 2.6.27, 2.6.28-rcX
- # Links: http://lkml.org/lkml/2008/12/10/369
- # Fix: commit 307257cf475aac25db30b669987f13d90c934e3a
- #---------------------------------------------------------------------------
- test_7_1()
- {
- 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_res TFAIL "failed to mount $subsys"
- return
- fi
- subsys_path=cgroup
- fi
- mkdir $subsys_path/0
- sleep 100 < $subsys_path/0 & # add refcnt to this dir
- rmdir $subsys_path/0
- # remount with new subsystems added
- # since 2.6.28, this remount will fail
- if [ "$subsys_path" = "cgroup" ]; then
- mount -t cgroup -o remount xxx cgroup/ 2> /dev/null
- kill -TERM $!
- wait $! 2>/dev/null
- umount cgroup/
- fi
- }
- test_7_2()
- {
- local subsys=$1
- mount -t cgroup -o none,name=foo cgroup cgroup/
- if [ $? -ne 0 ]; then
- tst_res TFAIL "failed to mount cgroup"
- return
- fi
- mkdir cgroup/0
- sleep 100 < cgroup/0 & # add refcnt to this dir
- rmdir cgroup/0
- # remount with some subsystems removed
- # since 2.6.28, this remount will fail
- mount -t cgroup -o remount,$subsys xxx cgroup/ 2> /dev/null
- kill -TERM $!
- wait $! 2>/dev/null
- umount cgroup/
- grep -q -w "cpu" /proc/cgroups
- if [ $? -ne 0 -o ! -e /proc/sched_debug ]; then
- tst_res TCONF "skip rest of testing due possible oops triggered by reading /proc/sched_debug"
- return
- fi
- tmp=0
- while [ $tmp -lt 50 ]; do
- echo 3 > /proc/sys/vm/drop_caches
- cat /proc/sched_debug > /dev/null
- tmp=$((tmp+1))
- done
- }
- test7()
- {
- local lines=`cat /proc/cgroups | wc -l`
- local subsys
- local i=1
- if [ $lines -le 2 ]; then
- tst_res TCONF "require at least 2 cgroup subsystems"
- slt_result $SLT_Untested
- return
- fi
- subsys=`tail -n 1 /proc/cgroups | awk '{ print $1 }'`
- # remount to add new subsystems to the hierarchy
- while [ $i -le 2 ]; do
- test_7_$i $subsys || return
- check_kernel_bug $i || return
- i=$((i+1))
- done
- }
- #---------------------------------------------------------------------------
- # Bug: oops when get cgroupstat of a cgroup control file
- # Kernel: 2.6.24 - 2.6.27, 2.6.28-rcX
- # Links: http://lkml.org/lkml/2008/11/19/53
- # Fix: commit 33d283bef23132c48195eafc21449f8ba88fce6b
- #---------------------------------------------------------------------------
- test8()
- {
- mount -t cgroup -o none,name=foo cgroup cgroup/
- if [ $? -ne 0 ]; then
- tst_res TFAIL "failed to mount cgroup filesystem"
- return
- fi
- if cgroup_regression_getdelays -C cgroup/tasks > /dev/null 2>&1; then
- tst_res TFAIL "should have failed to get cgroupstat of tasks file"
- fi
- umount cgroup/
- check_kernel_bug
- }
- #---------------------------------------------------------------------------
- # Bug: When running 2 concurrent mount/umount threads, lockdep warning
- # may be triggered, it's a false positive, and it's VFS' issue but
- # not cgroup.
- # Kernel: 2.6.24 - 2.6.29-rcX
- # Links: http://lkml.org/lkml/2009/1/4/352
- # Fix: commit ada723dcd681e2dffd7d73345cc8fda0eb0df9bd
- #---------------------------------------------------------------------------
- test9()
- {
- cgroup_regression_9_1.sh &
- local pid1=$!
- cgroup_regression_9_2.sh &
- local pid2=$!
- sleep 30
- kill -USR1 $pid1 $pid2
- wait $pid1 2>/dev/null
- wait $pid2 2>/dev/null
- umount cgroup/ 2> /dev/null
- check_kernel_bug
- }
- tst_run
|