File Index
Files and directories
Sign in
FILE

zram_lib.sh

File preview with syntax highlighting.

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