162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
362306a36Sopenharmony_ci# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# Author: Alexey Kodanev <alexey.kodanev@oracle.com>
662306a36Sopenharmony_ci# Modified: Naresh Kamboju <naresh.kamboju@linaro.org>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cidev_makeswap=-1
962306a36Sopenharmony_cidev_mounted=-1
1062306a36Sopenharmony_cidev_start=0
1162306a36Sopenharmony_cidev_end=-1
1262306a36Sopenharmony_cimodule_load=-1
1362306a36Sopenharmony_cisys_control=-1
1462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
1562306a36Sopenharmony_ciksft_skip=4
1662306a36Sopenharmony_cikernel_version=`uname -r | cut -d'.' -f1,2`
1762306a36Sopenharmony_cikernel_major=${kernel_version%.*}
1862306a36Sopenharmony_cikernel_minor=${kernel_version#*.}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_citrap INT
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cicheck_prereqs()
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	local msg="skip all tests:"
2562306a36Sopenharmony_ci	local uid=$(id -u)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	if [ $uid -ne 0 ]; then
2862306a36Sopenharmony_ci		echo $msg must be run as root >&2
2962306a36Sopenharmony_ci		exit $ksft_skip
3062306a36Sopenharmony_ci	fi
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cikernel_gte()
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	major=${1%.*}
3662306a36Sopenharmony_ci	minor=${1#*.}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	if [ $kernel_major -gt $major ]; then
3962306a36Sopenharmony_ci		return 0
4062306a36Sopenharmony_ci	elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then
4162306a36Sopenharmony_ci		return 0
4262306a36Sopenharmony_ci	fi
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	return 1
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cizram_cleanup()
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	echo "zram cleanup"
5062306a36Sopenharmony_ci	local i=
5162306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_makeswap); do
5262306a36Sopenharmony_ci		swapoff /dev/zram$i
5362306a36Sopenharmony_ci	done
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_mounted); do
5662306a36Sopenharmony_ci		umount /dev/zram$i
5762306a36Sopenharmony_ci	done
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_end); do
6062306a36Sopenharmony_ci		echo 1 > /sys/block/zram${i}/reset
6162306a36Sopenharmony_ci		rm -rf zram$i
6262306a36Sopenharmony_ci	done
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	if [ $sys_control -eq 1 ]; then
6562306a36Sopenharmony_ci		for i in $(seq $dev_start $dev_end); do
6662306a36Sopenharmony_ci			echo $i > /sys/class/zram-control/hot_remove
6762306a36Sopenharmony_ci		done
6862306a36Sopenharmony_ci	fi
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	if [ $module_load -eq 1 ]; then
7162306a36Sopenharmony_ci		rmmod zram > /dev/null 2>&1
7262306a36Sopenharmony_ci	fi
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cizram_load()
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	echo "create '$dev_num' zram device(s)"
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	# zram module loaded, new kernel
8062306a36Sopenharmony_ci	if [ -d "/sys/class/zram-control" ]; then
8162306a36Sopenharmony_ci		echo "zram modules already loaded, kernel supports" \
8262306a36Sopenharmony_ci			"zram-control interface"
8362306a36Sopenharmony_ci		dev_start=$(ls /dev/zram* | wc -w)
8462306a36Sopenharmony_ci		dev_end=$(($dev_start + $dev_num - 1))
8562306a36Sopenharmony_ci		sys_control=1
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		for i in $(seq $dev_start $dev_end); do
8862306a36Sopenharmony_ci			cat /sys/class/zram-control/hot_add > /dev/null
8962306a36Sopenharmony_ci		done
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci		echo "all zram devices (/dev/zram$dev_start~$dev_end" \
9262306a36Sopenharmony_ci			"successfully created"
9362306a36Sopenharmony_ci		return 0
9462306a36Sopenharmony_ci	fi
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	# detect old kernel or built-in
9762306a36Sopenharmony_ci	modprobe zram num_devices=$dev_num
9862306a36Sopenharmony_ci	if [ ! -d "/sys/class/zram-control" ]; then
9962306a36Sopenharmony_ci		if grep -q '^zram' /proc/modules; then
10062306a36Sopenharmony_ci			rmmod zram > /dev/null 2>&1
10162306a36Sopenharmony_ci			if [ $? -ne 0 ]; then
10262306a36Sopenharmony_ci				echo "zram module is being used on old kernel" \
10362306a36Sopenharmony_ci					"without zram-control interface"
10462306a36Sopenharmony_ci				exit $ksft_skip
10562306a36Sopenharmony_ci			fi
10662306a36Sopenharmony_ci		else
10762306a36Sopenharmony_ci			echo "test needs CONFIG_ZRAM=m on old kernel without" \
10862306a36Sopenharmony_ci				"zram-control interface"
10962306a36Sopenharmony_ci			exit $ksft_skip
11062306a36Sopenharmony_ci		fi
11162306a36Sopenharmony_ci		modprobe zram num_devices=$dev_num
11262306a36Sopenharmony_ci	fi
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	module_load=1
11562306a36Sopenharmony_ci	dev_end=$(($dev_num - 1))
11662306a36Sopenharmony_ci	echo "all zram devices (/dev/zram0~$dev_end) successfully created"
11762306a36Sopenharmony_ci}
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cizram_max_streams()
12062306a36Sopenharmony_ci{
12162306a36Sopenharmony_ci	echo "set max_comp_streams to zram device(s)"
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	kernel_gte 4.7
12462306a36Sopenharmony_ci	if [ $? -eq 0 ]; then
12562306a36Sopenharmony_ci		echo "The device attribute max_comp_streams was"\
12662306a36Sopenharmony_ci		               "deprecated in 4.7"
12762306a36Sopenharmony_ci		return 0
12862306a36Sopenharmony_ci	fi
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	local i=$dev_start
13162306a36Sopenharmony_ci	for max_s in $zram_max_streams; do
13262306a36Sopenharmony_ci		local sys_path="/sys/block/zram${i}/max_comp_streams"
13362306a36Sopenharmony_ci		echo $max_s > $sys_path || \
13462306a36Sopenharmony_ci			echo "FAIL failed to set '$max_s' to $sys_path"
13562306a36Sopenharmony_ci		sleep 1
13662306a36Sopenharmony_ci		local max_streams=$(cat $sys_path)
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci		[ "$max_s" -ne "$max_streams" ] && \
13962306a36Sopenharmony_ci			echo "FAIL can't set max_streams '$max_s', get $max_stream"
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci		i=$(($i + 1))
14262306a36Sopenharmony_ci		echo "$sys_path = '$max_streams'"
14362306a36Sopenharmony_ci	done
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	echo "zram max streams: OK"
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cizram_compress_alg()
14962306a36Sopenharmony_ci{
15062306a36Sopenharmony_ci	echo "test that we can set compression algorithm"
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	local i=$dev_start
15362306a36Sopenharmony_ci	local algs=$(cat /sys/block/zram${i}/comp_algorithm)
15462306a36Sopenharmony_ci	echo "supported algs: $algs"
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	for alg in $zram_algs; do
15762306a36Sopenharmony_ci		local sys_path="/sys/block/zram${i}/comp_algorithm"
15862306a36Sopenharmony_ci		echo "$alg" >	$sys_path || \
15962306a36Sopenharmony_ci			echo "FAIL can't set '$alg' to $sys_path"
16062306a36Sopenharmony_ci		i=$(($i + 1))
16162306a36Sopenharmony_ci		echo "$sys_path = '$alg'"
16262306a36Sopenharmony_ci	done
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	echo "zram set compression algorithm: OK"
16562306a36Sopenharmony_ci}
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cizram_set_disksizes()
16862306a36Sopenharmony_ci{
16962306a36Sopenharmony_ci	echo "set disk size to zram device(s)"
17062306a36Sopenharmony_ci	local i=$dev_start
17162306a36Sopenharmony_ci	for ds in $zram_sizes; do
17262306a36Sopenharmony_ci		local sys_path="/sys/block/zram${i}/disksize"
17362306a36Sopenharmony_ci		echo "$ds" >	$sys_path || \
17462306a36Sopenharmony_ci			echo "FAIL can't set '$ds' to $sys_path"
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci		i=$(($i + 1))
17762306a36Sopenharmony_ci		echo "$sys_path = '$ds'"
17862306a36Sopenharmony_ci	done
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	echo "zram set disksizes: OK"
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cizram_set_memlimit()
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	echo "set memory limit to zram device(s)"
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	local i=$dev_start
18862306a36Sopenharmony_ci	for ds in $zram_mem_limits; do
18962306a36Sopenharmony_ci		local sys_path="/sys/block/zram${i}/mem_limit"
19062306a36Sopenharmony_ci		echo "$ds" >	$sys_path || \
19162306a36Sopenharmony_ci			echo "FAIL can't set '$ds' to $sys_path"
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci		i=$(($i + 1))
19462306a36Sopenharmony_ci		echo "$sys_path = '$ds'"
19562306a36Sopenharmony_ci	done
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	echo "zram set memory limit: OK"
19862306a36Sopenharmony_ci}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_cizram_makeswap()
20162306a36Sopenharmony_ci{
20262306a36Sopenharmony_ci	echo "make swap with zram device(s)"
20362306a36Sopenharmony_ci	local i=$dev_start
20462306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_end); do
20562306a36Sopenharmony_ci		mkswap /dev/zram$i > err.log 2>&1
20662306a36Sopenharmony_ci		if [ $? -ne 0 ]; then
20762306a36Sopenharmony_ci			cat err.log
20862306a36Sopenharmony_ci			echo "FAIL mkswap /dev/zram$1 failed"
20962306a36Sopenharmony_ci		fi
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci		swapon /dev/zram$i > err.log 2>&1
21262306a36Sopenharmony_ci		if [ $? -ne 0 ]; then
21362306a36Sopenharmony_ci			cat err.log
21462306a36Sopenharmony_ci			echo "FAIL swapon /dev/zram$1 failed"
21562306a36Sopenharmony_ci		fi
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci		echo "done with /dev/zram$i"
21862306a36Sopenharmony_ci		dev_makeswap=$i
21962306a36Sopenharmony_ci	done
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	echo "zram making zram mkswap and swapon: OK"
22262306a36Sopenharmony_ci}
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cizram_swapoff()
22562306a36Sopenharmony_ci{
22662306a36Sopenharmony_ci	local i=
22762306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_end); do
22862306a36Sopenharmony_ci		swapoff /dev/zram$i > err.log 2>&1
22962306a36Sopenharmony_ci		if [ $? -ne 0 ]; then
23062306a36Sopenharmony_ci			cat err.log
23162306a36Sopenharmony_ci			echo "FAIL swapoff /dev/zram$i failed"
23262306a36Sopenharmony_ci		fi
23362306a36Sopenharmony_ci	done
23462306a36Sopenharmony_ci	dev_makeswap=-1
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	echo "zram swapoff: OK"
23762306a36Sopenharmony_ci}
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cizram_makefs()
24062306a36Sopenharmony_ci{
24162306a36Sopenharmony_ci	local i=$dev_start
24262306a36Sopenharmony_ci	for fs in $zram_filesystems; do
24362306a36Sopenharmony_ci		# if requested fs not supported default it to ext2
24462306a36Sopenharmony_ci		which mkfs.$fs > /dev/null 2>&1 || fs=ext2
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci		echo "make $fs filesystem on /dev/zram$i"
24762306a36Sopenharmony_ci		mkfs.$fs /dev/zram$i > err.log 2>&1
24862306a36Sopenharmony_ci		if [ $? -ne 0 ]; then
24962306a36Sopenharmony_ci			cat err.log
25062306a36Sopenharmony_ci			echo "FAIL failed to make $fs on /dev/zram$i"
25162306a36Sopenharmony_ci		fi
25262306a36Sopenharmony_ci		i=$(($i + 1))
25362306a36Sopenharmony_ci		echo "zram mkfs.$fs: OK"
25462306a36Sopenharmony_ci	done
25562306a36Sopenharmony_ci}
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cizram_mount()
25862306a36Sopenharmony_ci{
25962306a36Sopenharmony_ci	local i=0
26062306a36Sopenharmony_ci	for i in $(seq $dev_start $dev_end); do
26162306a36Sopenharmony_ci		echo "mount /dev/zram$i"
26262306a36Sopenharmony_ci		mkdir zram$i
26362306a36Sopenharmony_ci		mount /dev/zram$i zram$i > /dev/null || \
26462306a36Sopenharmony_ci			echo "FAIL mount /dev/zram$i failed"
26562306a36Sopenharmony_ci		dev_mounted=$i
26662306a36Sopenharmony_ci	done
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	echo "zram mount of zram device(s): OK"
26962306a36Sopenharmony_ci}
270