Message ID | 1639983142-2247-2-git-send-email-xuyang2018.jy@fujitsu.com |
---|---|
State | Accepted |
Headers | show |
Series | [v5,1/4] swapping01: skip test if zram-swap is being used | expand |
Hi Xu, > If zram-generator package is installed and works, then we can not remove zram module > because zram swap is being used. This case needs a clean zram environment, change this > test by using hot_add/hot_remove interface[1]. So even zram device is being used, we > still can add zram device and remove them in cleanup. > The two interface was introduced since kernel commit 6566d1a32("zram: add dynamic > device add/remove functionality")[2] in 2015.6. If kernel supports these two interface, nit: instead of date (a bit non standard written) I'd just mention the kernel release, i.e. v4.2-rc1. > we use hot_add/hot_remove to slove this problem, if not, just check whether zram is > being used or built in, then skip it on old kernel. > Also, zram01,02 case are adjuested to adapt the situation that CONFIG_ZRAM=y and can > run zram01,02 simultaneously on new kernel. > [1]https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html#add-remove-zram-devices > [2]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6566d1a32bf7 > - modprobe zram num_devices=$dev_num || \ > - tst_brk TBROK "failed to insert zram module" > +# On kernel that supports /sys/class/zram-control interface but doesn't load zram, > +# we dont' need to use hot_add/hot_remove interface. If system has loaded zram > +# or buitin, we need to use hot_add/hot_remove interface. > +# On old kernel that doesn't support /sys/class/zram-control interface, we just > +# check whether zram module is being used or it is built in kernel(we can't create > +# number of devices required). If so, skip it. > + if [ ! -d "/sys/class/zram-control" ]; then > + modprobe zram num_devices=$dev_num > + if [ ! -d "/sys/class/zram-control" ]; then > + if grep -q '^zram' /proc/modules; then > + rmmod zram > /dev/null 2>&1 || \ > + tst_brk TCONF "zram module is being used" nit: I'd be more clear already in the output. > + else > + tst_brk TCONF "test needs CONFIG_ZRAM=m" Also here I'd somehow mention the old kernel. > + fi > + modprobe zram num_devices=$dev_num > + fi > + module_load=1 > + dev_end=$(($dev_num - 1)) > + tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created" > + return > + fi > - dev_num_created=$(ls /dev/zram* | wc -w) > + dev_start=$(ls /dev/zram* | wc -w) > + dev_end=$(($dev_start + $dev_num - 1)) > + sys_control=1 > - if [ "$dev_num_created" -ne "$dev_num" ]; then > - tst_brk TFAIL "unexpected num of devices: $dev_num_created" > - fi > + for i in $(seq $dev_start $dev_end); do > + cat /sys/class/zram-control/hot_add > /dev/null > + done > - tst_res TPASS "all zram devices successfully created" > + tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created" > } IMHO this should work and be a bit more readable (put extra TINFO to help understand the problem on failure or what has been tested): tst_res TINFO "create '$dev_num' zram device(s)" # zram module loaded, new kernel if [ -d "/sys/class/zram-control" ]; then tst_res TINFO "zram module already loaded, kernel supports zram-control interface" dev_start=$(ls /dev/zram* | wc -w) dev_end=$(($dev_start + $dev_num - 1)) sys_control=1 for i in $(seq $dev_start $dev_end); do cat /sys/class/zram-control/hot_add > /dev/null done tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created" return fi modprobe zram num_devices=$dev_num # detect old kernel or built-in if [ ! -d "/sys/class/zram-control" ]; then if grep -q '^zram' /proc/modules; then rmmod zram > /dev/null 2>&1 || \ tst_brk TCONF "zram module is being used on old kernel without zram-control interface" else tst_brk TCONF "test needs CONFIG_ZRAM=m on old kernel without zram-control interface" fi modprobe zram num_devices=$dev_num fi module_load=1 dev_end=$(($dev_num - 1)) tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created" } Kind regards, Petr
Hi Petr > Hi Xu, > >> If zram-generator package is installed and works, then we can not remove zram module >> because zram swap is being used. This case needs a clean zram environment, change this >> test by using hot_add/hot_remove interface[1]. So even zram device is being used, we >> still can add zram device and remove them in cleanup. > >> The two interface was introduced since kernel commit 6566d1a32("zram: add dynamic >> device add/remove functionality")[2] in 2015.6. If kernel supports these two interface, > nit: instead of date (a bit non standard written) I'd just mention the kernel > release, i.e. v4.2-rc1. Will do. > >> we use hot_add/hot_remove to slove this problem, if not, just check whether zram is >> being used or built in, then skip it on old kernel. > >> Also, zram01,02 case are adjuested to adapt the situation that CONFIG_ZRAM=y and can >> run zram01,02 simultaneously on new kernel. > >> [1]https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html#add-remove-zram-devices >> [2]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6566d1a32bf7 > >> - modprobe zram num_devices=$dev_num || \ >> - tst_brk TBROK "failed to insert zram module" >> +# On kernel that supports /sys/class/zram-control interface but doesn't load zram, >> +# we dont' need to use hot_add/hot_remove interface. If system has loaded zram >> +# or buitin, we need to use hot_add/hot_remove interface. >> +# On old kernel that doesn't support /sys/class/zram-control interface, we just >> +# check whether zram module is being used or it is built in kernel(we can't create >> +# number of devices required). If so, skip it. >> + if [ ! -d "/sys/class/zram-control" ]; then >> + modprobe zram num_devices=$dev_num >> + if [ ! -d "/sys/class/zram-control" ]; then >> + if grep -q '^zram' /proc/modules; then >> + rmmod zram> /dev/null 2>&1 || \ >> + tst_brk TCONF "zram module is being used" > nit: I'd be more clear already in the output. Yes. > >> + else >> + tst_brk TCONF "test needs CONFIG_ZRAM=m" > Also here I'd somehow mention the old kernel. >> + fi >> + modprobe zram num_devices=$dev_num >> + fi >> + module_load=1 >> + dev_end=$(($dev_num - 1)) >> + tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created" >> + return >> + fi >> - dev_num_created=$(ls /dev/zram* | wc -w) >> + dev_start=$(ls /dev/zram* | wc -w) >> + dev_end=$(($dev_start + $dev_num - 1)) >> + sys_control=1 > >> - if [ "$dev_num_created" -ne "$dev_num" ]; then >> - tst_brk TFAIL "unexpected num of devices: $dev_num_created" >> - fi >> + for i in $(seq $dev_start $dev_end); do >> + cat /sys/class/zram-control/hot_add> /dev/null >> + done > >> - tst_res TPASS "all zram devices successfully created" >> + tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created" >> } > > IMHO this should work and be a bit more readable > (put extra TINFO to help understand the problem on failure or what has been > tested): > > tst_res TINFO "create '$dev_num' zram device(s)" > > # zram module loaded, new kernel > if [ -d "/sys/class/zram-control" ]; then > tst_res TINFO "zram module already loaded, kernel supports zram-control interface" > dev_start=$(ls /dev/zram* | wc -w) > dev_end=$(($dev_start + $dev_num - 1)) > sys_control=1 > > for i in $(seq $dev_start $dev_end); do > cat /sys/class/zram-control/hot_add> /dev/null > done > > tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created" > return > fi > > modprobe zram num_devices=$dev_num > > # detect old kernel or built-in > if [ ! -d "/sys/class/zram-control" ]; then > if grep -q '^zram' /proc/modules; then > rmmod zram> /dev/null 2>&1 || \ > tst_brk TCONF "zram module is being used on old kernel without zram-control interface" > else > tst_brk TCONF "test needs CONFIG_ZRAM=m on old kernel without zram-control interface" > fi > modprobe zram num_devices=$dev_num > fi > > module_load=1 > dev_end=$(($dev_num - 1)) > tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created" Nice, it is easy to understand. Best Regards Yang Xu > } > > > Kind regards, > Petr
diff --git a/testcases/kernel/device-drivers/zram/zram01.sh b/testcases/kernel/device-drivers/zram/zram01.sh index ad9a9a2be..5e13f387c 100755 --- a/testcases/kernel/device-drivers/zram/zram01.sh +++ b/testcases/kernel/device-drivers/zram/zram01.sh @@ -69,7 +69,7 @@ setup() zram_makefs() { - local i=0 + local i=$dev_start local fs for fs in $zram_filesystems; do @@ -90,7 +90,7 @@ zram_mount() { local i=0 - for i in $(seq 0 $(($dev_num - 1))); do + for i in $(seq $dev_start $dev_end); do tst_res TINFO "mount /dev/zram$i" mkdir zram$i ROD mount /dev/zram$i zram$i @@ -102,7 +102,7 @@ zram_mount() zram_fill_fs() { - for i in $(seq 0 $(($dev_num - 1))); do + for i in $(seq $dev_start $dev_end); do tst_res TINFO "filling zram$i (it can take long time)" local b=0 while true; do diff --git a/testcases/kernel/device-drivers/zram/zram02.sh b/testcases/kernel/device-drivers/zram/zram02.sh index f0421ce7f..c980fce76 100755 --- a/testcases/kernel/device-drivers/zram/zram02.sh +++ b/testcases/kernel/device-drivers/zram/zram02.sh @@ -29,7 +29,7 @@ zram_makeswap() tst_require_cmds mkswap swapon swapoff local i=0 - for i in $(seq 0 $(($dev_num - 1))); do + for i in $(seq $dev_start $dev_end); do ROD mkswap /dev/zram$i ROD swapon /dev/zram$i tst_res TINFO "done with /dev/zram$i" @@ -44,7 +44,7 @@ zram_swapoff() tst_require_cmds swapoff local i - for i in $(seq 0 $dev_makeswap); do + for i in $(seq $dev_start $dev_end); do ROD swapoff /dev/zram$i done dev_makeswap=-1 diff --git a/testcases/kernel/device-drivers/zram/zram_lib.sh b/testcases/kernel/device-drivers/zram/zram_lib.sh index fe9c915c3..84a9a4378 100755 --- a/testcases/kernel/device-drivers/zram/zram_lib.sh +++ b/testcases/kernel/device-drivers/zram/zram_lib.sh @@ -5,6 +5,10 @@ dev_makeswap=-1 dev_mounted=-1 +dev_start=0 +dev_end=-1 +module_load=-1 +sys_control=-1 TST_NEEDS_TMPDIR=1 TST_NEEDS_ROOT=1 @@ -17,19 +21,27 @@ zram_cleanup() { local i - for i in $(seq 0 $dev_makeswap); do + for i in $(seq $dev_start $dev_makeswap); do swapoff /dev/zram$i done - for i in $(seq 0 $dev_mounted); do + for i in $(seq $dev_start $dev_mounted); do umount /dev/zram$i done - for i in $(seq 0 $(($dev_num - 1))); do + for i in $(seq $dev_start $dev_end); do echo 1 > /sys/block/zram${i}/reset done - rmmod zram > /dev/null 2>&1 + if [ $sys_control -eq 1 ]; then + for i in $(seq $dev_start $dev_end); do + echo $i > /sys/class/zram-control/hot_remove + done + fi + + if [ $module_load -eq 1 ]; then + rmmod zram > /dev/null 2>&1 + fi } zram_load() @@ -51,16 +63,38 @@ zram_load() tst_res TINFO "create '$dev_num' zram device(s)" - modprobe zram num_devices=$dev_num || \ - tst_brk TBROK "failed to insert zram module" +# On kernel that supports /sys/class/zram-control interface but doesn't load zram, +# we dont' need to use hot_add/hot_remove interface. If system has loaded zram +# or buitin, we need to use hot_add/hot_remove interface. +# On old kernel that doesn't support /sys/class/zram-control interface, we just +# check whether zram module is being used or it is built in kernel(we can't create +# number of devices required). If so, skip it. + if [ ! -d "/sys/class/zram-control" ]; then + modprobe zram num_devices=$dev_num + if [ ! -d "/sys/class/zram-control" ]; then + if grep -q '^zram' /proc/modules; then + rmmod zram > /dev/null 2>&1 || \ + tst_brk TCONF "zram module is being used" + else + tst_brk TCONF "test needs CONFIG_ZRAM=m" + fi + modprobe zram num_devices=$dev_num + fi + module_load=1 + dev_end=$(($dev_num - 1)) + tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created" + return + fi - dev_num_created=$(ls /dev/zram* | wc -w) + dev_start=$(ls /dev/zram* | wc -w) + dev_end=$(($dev_start + $dev_num - 1)) + sys_control=1 - if [ "$dev_num_created" -ne "$dev_num" ]; then - tst_brk TFAIL "unexpected num of devices: $dev_num_created" - fi + for i in $(seq $dev_start $dev_end); do + cat /sys/class/zram-control/hot_add > /dev/null + done - tst_res TPASS "all zram devices successfully created" + tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created" } zram_max_streams() @@ -73,7 +107,7 @@ zram_max_streams() tst_res TINFO "set max_comp_streams to zram device(s)" - local i=0 + local i=$dev_start for max_s in $zram_max_streams; do local sys_path="/sys/block/zram${i}/max_comp_streams" @@ -85,7 +119,7 @@ zram_max_streams() tst_brk TFAIL "can't set max_streams '$max_s', get $max_stream" i=$(($i + 1)) - tst_res TINFO "$sys_path = '$max_streams' ($i/$dev_num)" + tst_res TINFO "$sys_path = '$max_streams'" done tst_res TPASS "test succeeded" @@ -100,20 +134,18 @@ zram_compress_alg() return fi - local i=0 + local i=$dev_start tst_res TINFO "test that we can set compression algorithm" - local algs="$(sed 's/[][]//g' /sys/block/zram0/comp_algorithm)" + local algs="$(sed 's/[][]//g' /sys/block/zram${i}/comp_algorithm)" tst_res TINFO "supported algs: $algs" - local dev_max=$(($dev_num - 1)) - - for i in $(seq 0 $dev_max); do + for i in $(seq $dev_start $dev_end); do for alg in $algs; do local sys_path="/sys/block/zram${i}/comp_algorithm" echo "$alg" > $sys_path || \ tst_brk TFAIL "can't set '$alg' to $sys_path" - tst_res TINFO "$sys_path = '$alg' ($i/$dev_max)" + tst_res TINFO "$sys_path = '$alg'" done done @@ -122,7 +154,7 @@ zram_compress_alg() zram_set_disksizes() { - local i=0 + local i=$dev_start local ds tst_res TINFO "set disk size to zram device(s)" @@ -132,7 +164,7 @@ zram_set_disksizes() tst_brk TFAIL "can't set '$ds' to $sys_path" i=$(($i + 1)) - tst_res TINFO "$sys_path = '$ds' ($i/$dev_num)" + tst_res TINFO "$sys_path = '$ds'" done tst_res TPASS "test succeeded" @@ -147,7 +179,7 @@ zram_set_memlimit() return fi - local i=0 + local i=$dev_start local ds tst_res TINFO "set memory limit to zram device(s)" @@ -158,7 +190,7 @@ zram_set_memlimit() tst_brk TFAIL "can't set '$ds' to $sys_path" i=$(($i + 1)) - tst_res TINFO "$sys_path = '$ds' ($i/$dev_num)" + tst_res TINFO "$sys_path = '$ds'" done tst_res TPASS "test succeeded"