Skip to content

Commit 01dabed

Browse files
xuyang0410shuahkh
authored andcommitted
selftests/zram: Adapt the situation that /dev/zram0 is being used
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. 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 6566d1a("zram: add dynamic device add/remove functionality") in v4.2-rc1. 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. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
1 parent d18da7e commit 01dabed

File tree

4 files changed

+66
-63
lines changed

4 files changed

+66
-63
lines changed

tools/testing/selftests/zram/zram.sh

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
# SPDX-License-Identifier: GPL-2.0
33
TCID="zram.sh"
44

5-
# Kselftest framework requirement - SKIP code is 4.
6-
ksft_skip=4
7-
85
. ./zram_lib.sh
96

107
run_zram () {
@@ -18,14 +15,4 @@ echo ""
1815

1916
check_prereqs
2017

21-
# check zram module exists
22-
MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
23-
if [ -f $MODULE_PATH ]; then
24-
run_zram
25-
elif [ -b /dev/zram0 ]; then
26-
run_zram
27-
else
28-
echo "$TCID : No zram.ko module or /dev/zram0 device file not found"
29-
echo "$TCID : CONFIG_ZRAM is not set"
30-
exit $ksft_skip
31-
fi
18+
run_zram

tools/testing/selftests/zram/zram01.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ zram_algs="lzo"
3333

3434
zram_fill_fs()
3535
{
36-
for i in $(seq 0 $(($dev_num - 1))); do
36+
for i in $(seq $dev_start $dev_end); do
3737
echo "fill zram$i..."
3838
local b=0
3939
while [ true ]; do
@@ -67,7 +67,6 @@ zram_mount
6767

6868
zram_fill_fs
6969
zram_cleanup
70-
zram_unload
7170

7271
if [ $ERR_CODE -ne 0 ]; then
7372
echo "$TCID : [FAIL]"

tools/testing/selftests/zram/zram02.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ zram_set_memlimit
3636
zram_makeswap
3737
zram_swapoff
3838
zram_cleanup
39-
zram_unload
4039

4140
if [ $ERR_CODE -ne 0 ]; then
4241
echo "$TCID : [FAIL]"

tools/testing/selftests/zram/zram_lib.sh

Lines changed: 64 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
# Author: Alexey Kodanev <alexey.kodanev@oracle.com>
66
# Modified: Naresh Kamboju <naresh.kamboju@linaro.org>
77

8-
MODULE=0
98
dev_makeswap=-1
109
dev_mounted=-1
11-
10+
dev_start=0
11+
dev_end=-1
12+
module_load=-1
13+
sys_control=-1
1214
# Kselftest framework requirement - SKIP code is 4.
1315
ksft_skip=4
1416
kernel_version=`uname -r | cut -d'.' -f1,2`
@@ -46,57 +48,72 @@ zram_cleanup()
4648
{
4749
echo "zram cleanup"
4850
local i=
49-
for i in $(seq 0 $dev_makeswap); do
51+
for i in $(seq $dev_start $dev_makeswap); do
5052
swapoff /dev/zram$i
5153
done
5254

53-
for i in $(seq 0 $dev_mounted); do
55+
for i in $(seq $dev_start $dev_mounted); do
5456
umount /dev/zram$i
5557
done
5658

57-
for i in $(seq 0 $(($dev_num - 1))); do
59+
for i in $(seq $dev_start $dev_end); do
5860
echo 1 > /sys/block/zram${i}/reset
5961
rm -rf zram$i
6062
done
6163

62-
}
64+
if [ $sys_control -eq 1 ]; then
65+
for i in $(seq $dev_start $dev_end); do
66+
echo $i > /sys/class/zram-control/hot_remove
67+
done
68+
fi
6369

64-
zram_unload()
65-
{
66-
if [ $MODULE -ne 0 ] ; then
67-
echo "zram rmmod zram"
70+
if [ $module_load -eq 1 ]; then
6871
rmmod zram > /dev/null 2>&1
6972
fi
7073
}
7174

7275
zram_load()
7376
{
74-
# check zram module exists
75-
MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
76-
if [ -f $MODULE_PATH ]; then
77-
MODULE=1
78-
echo "create '$dev_num' zram device(s)"
79-
modprobe zram num_devices=$dev_num
80-
if [ $? -ne 0 ]; then
81-
echo "failed to insert zram module"
82-
exit 1
83-
fi
84-
85-
dev_num_created=$(ls /dev/zram* | wc -w)
77+
echo "create '$dev_num' zram device(s)"
78+
79+
# zram module loaded, new kernel
80+
if [ -d "/sys/class/zram-control" ]; then
81+
echo "zram modules already loaded, kernel supports" \
82+
"zram-control interface"
83+
dev_start=$(ls /dev/zram* | wc -w)
84+
dev_end=$(($dev_start + $dev_num - 1))
85+
sys_control=1
86+
87+
for i in $(seq $dev_start $dev_end); do
88+
cat /sys/class/zram-control/hot_add > /dev/null
89+
done
90+
91+
echo "all zram devices (/dev/zram$dev_start~$dev_end" \
92+
"successfully created"
93+
return 0
94+
fi
8695

87-
if [ "$dev_num_created" -ne "$dev_num" ]; then
88-
echo "unexpected num of devices: $dev_num_created"
89-
ERR_CODE=-1
96+
# detect old kernel or built-in
97+
modprobe zram num_devices=$dev_num
98+
if [ ! -d "/sys/class/zram-control" ]; then
99+
if grep -q '^zram' /proc/modules; then
100+
rmmod zram > /dev/null 2>&1
101+
if [ $? -ne 0 ]; then
102+
echo "zram module is being used on old kernel" \
103+
"without zram-control interface"
104+
exit $ksft_skip
105+
fi
90106
else
91-
echo "zram load module successful"
107+
echo "test needs CONFIG_ZRAM=m on old kernel without" \
108+
"zram-control interface"
109+
exit $ksft_skip
92110
fi
93-
elif [ -b /dev/zram0 ]; then
94-
echo "/dev/zram0 device file found: OK"
95-
else
96-
echo "ERROR: No zram.ko module or no /dev/zram0 device found"
97-
echo "$TCID : CONFIG_ZRAM is not set"
98-
exit 1
111+
modprobe zram num_devices=$dev_num
99112
fi
113+
114+
module_load=1
115+
dev_end=$(($dev_num - 1))
116+
echo "all zram devices (/dev/zram0~$dev_end) successfully created"
100117
}
101118

102119
zram_max_streams()
@@ -110,7 +127,7 @@ zram_max_streams()
110127
return 0
111128
fi
112129

113-
local i=0
130+
local i=$dev_start
114131
for max_s in $zram_max_streams; do
115132
local sys_path="/sys/block/zram${i}/max_comp_streams"
116133
echo $max_s > $sys_path || \
@@ -122,7 +139,7 @@ zram_max_streams()
122139
echo "FAIL can't set max_streams '$max_s', get $max_stream"
123140

124141
i=$(($i + 1))
125-
echo "$sys_path = '$max_streams' ($i/$dev_num)"
142+
echo "$sys_path = '$max_streams'"
126143
done
127144

128145
echo "zram max streams: OK"
@@ -132,15 +149,16 @@ zram_compress_alg()
132149
{
133150
echo "test that we can set compression algorithm"
134151

135-
local algs=$(cat /sys/block/zram0/comp_algorithm)
152+
local i=$dev_start
153+
local algs=$(cat /sys/block/zram${i}/comp_algorithm)
136154
echo "supported algs: $algs"
137-
local i=0
155+
138156
for alg in $zram_algs; do
139157
local sys_path="/sys/block/zram${i}/comp_algorithm"
140158
echo "$alg" > $sys_path || \
141159
echo "FAIL can't set '$alg' to $sys_path"
142160
i=$(($i + 1))
143-
echo "$sys_path = '$alg' ($i/$dev_num)"
161+
echo "$sys_path = '$alg'"
144162
done
145163

146164
echo "zram set compression algorithm: OK"
@@ -149,14 +167,14 @@ zram_compress_alg()
149167
zram_set_disksizes()
150168
{
151169
echo "set disk size to zram device(s)"
152-
local i=0
170+
local i=$dev_start
153171
for ds in $zram_sizes; do
154172
local sys_path="/sys/block/zram${i}/disksize"
155173
echo "$ds" > $sys_path || \
156174
echo "FAIL can't set '$ds' to $sys_path"
157175

158176
i=$(($i + 1))
159-
echo "$sys_path = '$ds' ($i/$dev_num)"
177+
echo "$sys_path = '$ds'"
160178
done
161179

162180
echo "zram set disksizes: OK"
@@ -166,14 +184,14 @@ zram_set_memlimit()
166184
{
167185
echo "set memory limit to zram device(s)"
168186

169-
local i=0
187+
local i=$dev_start
170188
for ds in $zram_mem_limits; do
171189
local sys_path="/sys/block/zram${i}/mem_limit"
172190
echo "$ds" > $sys_path || \
173191
echo "FAIL can't set '$ds' to $sys_path"
174192

175193
i=$(($i + 1))
176-
echo "$sys_path = '$ds' ($i/$dev_num)"
194+
echo "$sys_path = '$ds'"
177195
done
178196

179197
echo "zram set memory limit: OK"
@@ -182,8 +200,8 @@ zram_set_memlimit()
182200
zram_makeswap()
183201
{
184202
echo "make swap with zram device(s)"
185-
local i=0
186-
for i in $(seq 0 $(($dev_num - 1))); do
203+
local i=$dev_start
204+
for i in $(seq $dev_start $dev_end); do
187205
mkswap /dev/zram$i > err.log 2>&1
188206
if [ $? -ne 0 ]; then
189207
cat err.log
@@ -206,7 +224,7 @@ zram_makeswap()
206224
zram_swapoff()
207225
{
208226
local i=
209-
for i in $(seq 0 $dev_makeswap); do
227+
for i in $(seq $dev_start $dev_end); do
210228
swapoff /dev/zram$i > err.log 2>&1
211229
if [ $? -ne 0 ]; then
212230
cat err.log
@@ -220,7 +238,7 @@ zram_swapoff()
220238

221239
zram_makefs()
222240
{
223-
local i=0
241+
local i=$dev_start
224242
for fs in $zram_filesystems; do
225243
# if requested fs not supported default it to ext2
226244
which mkfs.$fs > /dev/null 2>&1 || fs=ext2
@@ -239,7 +257,7 @@ zram_makefs()
239257
zram_mount()
240258
{
241259
local i=0
242-
for i in $(seq 0 $(($dev_num - 1))); do
260+
for i in $(seq $dev_start $dev_end); do
243261
echo "mount /dev/zram$i"
244262
mkdir zram$i
245263
mount /dev/zram$i zram$i > /dev/null || \

0 commit comments

Comments
 (0)