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