diff mbox series

[v5,2/4] zram/zram_lib.sh: adapt the situation that zram device is being used

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

Commit Message

Yang Xu \(Fujitsu\) Dec. 20, 2021, 6:52 a.m. UTC
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,
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

Fixes: #888
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
---
 .../kernel/device-drivers/zram/zram01.sh      |  6 +-
 .../kernel/device-drivers/zram/zram02.sh      |  4 +-
 .../kernel/device-drivers/zram/zram_lib.sh    | 78 +++++++++++++------
 3 files changed, 60 insertions(+), 28 deletions(-)

Comments

Petr Vorel Dec. 20, 2021, 10:45 a.m. UTC | #1
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
Yang Xu \(Fujitsu\) Dec. 21, 2021, 1:33 a.m. UTC | #2
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 mbox series

Patch

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"