GNU Linux-libre 4.14.290-gnu1
[releases.git] / tools / testing / selftests / zram / zram_lib.sh
1 #!/bin/sh
2 # Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License as
6 # published by the Free Software Foundation; either version 2 of
7 # the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it would be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # Author: Alexey Kodanev <alexey.kodanev@oracle.com>
15 # Modified: Naresh Kamboju <naresh.kamboju@linaro.org>
16
17 dev_makeswap=-1
18 dev_mounted=-1
19 dev_start=0
20 dev_end=-1
21 module_load=-1
22 sys_control=-1
23 # Kselftest framework requirement - SKIP code is 4.
24 ksft_skip=4
25 kernel_version=`uname -r | cut -d'.' -f1,2`
26 kernel_major=${kernel_version%.*}
27 kernel_minor=${kernel_version#*.}
28
29 trap INT
30
31 check_prereqs()
32 {
33         local msg="skip all tests:"
34         local uid=$(id -u)
35
36         if [ $uid -ne 0 ]; then
37                 echo $msg must be run as root >&2
38                 exit $ksft_skip
39         fi
40 }
41
42 kernel_gte()
43 {
44         major=${1%.*}
45         minor=${1#*.}
46
47         if [ $kernel_major -gt $major ]; then
48                 return 0
49         elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then
50                 return 0
51         fi
52
53         return 1
54 }
55
56 zram_cleanup()
57 {
58         echo "zram cleanup"
59         local i=
60         for i in $(seq $dev_start $dev_makeswap); do
61                 swapoff /dev/zram$i
62         done
63
64         for i in $(seq $dev_start $dev_mounted); do
65                 umount /dev/zram$i
66         done
67
68         for i in $(seq $dev_start $dev_end); do
69                 echo 1 > /sys/block/zram${i}/reset
70                 rm -rf zram$i
71         done
72
73         if [ $sys_control -eq 1 ]; then
74                 for i in $(seq $dev_start $dev_end); do
75                         echo $i > /sys/class/zram-control/hot_remove
76                 done
77         fi
78
79         if [ $module_load -eq 1 ]; then
80                 rmmod zram > /dev/null 2>&1
81         fi
82 }
83
84 zram_load()
85 {
86         echo "create '$dev_num' zram device(s)"
87
88         # zram module loaded, new kernel
89         if [ -d "/sys/class/zram-control" ]; then
90                 echo "zram modules already loaded, kernel supports" \
91                         "zram-control interface"
92                 dev_start=$(ls /dev/zram* | wc -w)
93                 dev_end=$(($dev_start + $dev_num - 1))
94                 sys_control=1
95
96                 for i in $(seq $dev_start $dev_end); do
97                         cat /sys/class/zram-control/hot_add > /dev/null
98                 done
99
100                 echo "all zram devices (/dev/zram$dev_start~$dev_end" \
101                         "successfully created"
102                 return 0
103         fi
104
105         # detect old kernel or built-in
106         modprobe zram num_devices=$dev_num
107         if [ ! -d "/sys/class/zram-control" ]; then
108                 if grep -q '^zram' /proc/modules; then
109                         rmmod zram > /dev/null 2>&1
110                         if [ $? -ne 0 ]; then
111                                 echo "zram module is being used on old kernel" \
112                                         "without zram-control interface"
113                                 exit $ksft_skip
114                         fi
115                 else
116                         echo "test needs CONFIG_ZRAM=m on old kernel without" \
117                                 "zram-control interface"
118                         exit $ksft_skip
119                 fi
120                 modprobe zram num_devices=$dev_num
121         fi
122
123         module_load=1
124         dev_end=$(($dev_num - 1))
125         echo "all zram devices (/dev/zram0~$dev_end) successfully created"
126 }
127
128 zram_max_streams()
129 {
130         echo "set max_comp_streams to zram device(s)"
131
132         kernel_gte 4.7
133         if [ $? -eq 0 ]; then
134                 echo "The device attribute max_comp_streams was"\
135                                "deprecated in 4.7"
136                 return 0
137         fi
138
139         local i=$dev_start
140         for max_s in $zram_max_streams; do
141                 local sys_path="/sys/block/zram${i}/max_comp_streams"
142                 echo $max_s > $sys_path || \
143                         echo "FAIL failed to set '$max_s' to $sys_path"
144                 sleep 1
145                 local max_streams=$(cat $sys_path)
146
147                 [ "$max_s" -ne "$max_streams" ] && \
148                         echo "FAIL can't set max_streams '$max_s', get $max_stream"
149
150                 i=$(($i + 1))
151                 echo "$sys_path = '$max_streams'"
152         done
153
154         echo "zram max streams: OK"
155 }
156
157 zram_compress_alg()
158 {
159         echo "test that we can set compression algorithm"
160
161         local i=$dev_start
162         local algs=$(cat /sys/block/zram${i}/comp_algorithm)
163         echo "supported algs: $algs"
164
165         for alg in $zram_algs; do
166                 local sys_path="/sys/block/zram${i}/comp_algorithm"
167                 echo "$alg" >   $sys_path || \
168                         echo "FAIL can't set '$alg' to $sys_path"
169                 i=$(($i + 1))
170                 echo "$sys_path = '$alg'"
171         done
172
173         echo "zram set compression algorithm: OK"
174 }
175
176 zram_set_disksizes()
177 {
178         echo "set disk size to zram device(s)"
179         local i=$dev_start
180         for ds in $zram_sizes; do
181                 local sys_path="/sys/block/zram${i}/disksize"
182                 echo "$ds" >    $sys_path || \
183                         echo "FAIL can't set '$ds' to $sys_path"
184
185                 i=$(($i + 1))
186                 echo "$sys_path = '$ds'"
187         done
188
189         echo "zram set disksizes: OK"
190 }
191
192 zram_set_memlimit()
193 {
194         echo "set memory limit to zram device(s)"
195
196         local i=$dev_start
197         for ds in $zram_mem_limits; do
198                 local sys_path="/sys/block/zram${i}/mem_limit"
199                 echo "$ds" >    $sys_path || \
200                         echo "FAIL can't set '$ds' to $sys_path"
201
202                 i=$(($i + 1))
203                 echo "$sys_path = '$ds'"
204         done
205
206         echo "zram set memory limit: OK"
207 }
208
209 zram_makeswap()
210 {
211         echo "make swap with zram device(s)"
212         local i=$dev_start
213         for i in $(seq $dev_start $dev_end); do
214                 mkswap /dev/zram$i > err.log 2>&1
215                 if [ $? -ne 0 ]; then
216                         cat err.log
217                         echo "FAIL mkswap /dev/zram$1 failed"
218                 fi
219
220                 swapon /dev/zram$i > err.log 2>&1
221                 if [ $? -ne 0 ]; then
222                         cat err.log
223                         echo "FAIL swapon /dev/zram$1 failed"
224                 fi
225
226                 echo "done with /dev/zram$i"
227                 dev_makeswap=$i
228         done
229
230         echo "zram making zram mkswap and swapon: OK"
231 }
232
233 zram_swapoff()
234 {
235         local i=
236         for i in $(seq $dev_start $dev_end); do
237                 swapoff /dev/zram$i > err.log 2>&1
238                 if [ $? -ne 0 ]; then
239                         cat err.log
240                         echo "FAIL swapoff /dev/zram$i failed"
241                 fi
242         done
243         dev_makeswap=-1
244
245         echo "zram swapoff: OK"
246 }
247
248 zram_makefs()
249 {
250         local i=$dev_start
251         for fs in $zram_filesystems; do
252                 # if requested fs not supported default it to ext2
253                 which mkfs.$fs > /dev/null 2>&1 || fs=ext2
254
255                 echo "make $fs filesystem on /dev/zram$i"
256                 mkfs.$fs /dev/zram$i > err.log 2>&1
257                 if [ $? -ne 0 ]; then
258                         cat err.log
259                         echo "FAIL failed to make $fs on /dev/zram$i"
260                 fi
261                 i=$(($i + 1))
262                 echo "zram mkfs.$fs: OK"
263         done
264 }
265
266 zram_mount()
267 {
268         local i=0
269         for i in $(seq $dev_start $dev_end); do
270                 echo "mount /dev/zram$i"
271                 mkdir zram$i
272                 mount /dev/zram$i zram$i > /dev/null || \
273                         echo "FAIL mount /dev/zram$i failed"
274                 dev_mounted=$i
275         done
276
277         echo "zram mount of zram device(s): OK"
278 }