1f08c3bdfSopenharmony_ci#!/bin/sh
2f08c3bdfSopenharmony_ci# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
3f08c3bdfSopenharmony_ci# Copyright (c) 2019-2022 Petr Vorel <pvorel@suse.cz>
4f08c3bdfSopenharmony_ci# Author: Alexey Kodanev <alexey.kodanev@oracle.com>
5f08c3bdfSopenharmony_ci
6f08c3bdfSopenharmony_cidev_makeswap=-1
7f08c3bdfSopenharmony_cidev_mounted=-1
8f08c3bdfSopenharmony_cidev_start=0
9f08c3bdfSopenharmony_cidev_end=-1
10f08c3bdfSopenharmony_cimodule_load=-1
11f08c3bdfSopenharmony_cisys_control=-1
12f08c3bdfSopenharmony_ci
13f08c3bdfSopenharmony_ciTST_NEEDS_TMPDIR=1
14f08c3bdfSopenharmony_ciTST_NEEDS_ROOT=1
15f08c3bdfSopenharmony_ciTST_SETUP="${TST_SETUP:-zram_load}"
16f08c3bdfSopenharmony_ciTST_CLEANUP="${TST_CLEANUP:-zram_cleanup}"
17f08c3bdfSopenharmony_ciTST_NEEDS_DRIVERS="zram"
18f08c3bdfSopenharmony_ci
19f08c3bdfSopenharmony_cizram_cleanup()
20f08c3bdfSopenharmony_ci{
21f08c3bdfSopenharmony_ci	local i
22f08c3bdfSopenharmony_ci
23f08c3bdfSopenharmony_ci	for i in $(seq $dev_start $dev_makeswap); do
24f08c3bdfSopenharmony_ci		swapoff /dev/zram$i
25f08c3bdfSopenharmony_ci	done
26f08c3bdfSopenharmony_ci
27f08c3bdfSopenharmony_ci	for i in $(seq $dev_start $dev_mounted); do
28f08c3bdfSopenharmony_ci		umount /dev/zram$i
29f08c3bdfSopenharmony_ci	done
30f08c3bdfSopenharmony_ci
31f08c3bdfSopenharmony_ci	for i in $(seq $dev_start $dev_end); do
32f08c3bdfSopenharmony_ci		echo 1 > /sys/block/zram${i}/reset
33f08c3bdfSopenharmony_ci	done
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ci	if [ $sys_control -eq 1 ]; then
36f08c3bdfSopenharmony_ci		for i in $(seq $dev_start $dev_end); do
37f08c3bdfSopenharmony_ci			echo $i > /sys/class/zram-control/hot_remove
38f08c3bdfSopenharmony_ci		done
39f08c3bdfSopenharmony_ci	fi
40f08c3bdfSopenharmony_ci
41f08c3bdfSopenharmony_ci	if [ $module_load -eq 1 ]; then
42f08c3bdfSopenharmony_ci		rmmod zram > /dev/null 2>&1
43f08c3bdfSopenharmony_ci	fi
44f08c3bdfSopenharmony_ci}
45f08c3bdfSopenharmony_ci
46f08c3bdfSopenharmony_cizram_load()
47f08c3bdfSopenharmony_ci{
48f08c3bdfSopenharmony_ci	local tmp
49f08c3bdfSopenharmony_ci
50f08c3bdfSopenharmony_ci	if [ -z "$dev_num" ]; then
51f08c3bdfSopenharmony_ci		dev_num=0
52f08c3bdfSopenharmony_ci		for tmp in $zram_max_streams; do
53f08c3bdfSopenharmony_ci			dev_num=$((dev_num+1))
54f08c3bdfSopenharmony_ci		done
55f08c3bdfSopenharmony_ci	fi
56f08c3bdfSopenharmony_ci
57f08c3bdfSopenharmony_ci	if [ $dev_num -le 0 ]; then
58f08c3bdfSopenharmony_ci		tst_brk TBROK "dev_num must be > 0"
59f08c3bdfSopenharmony_ci	fi
60f08c3bdfSopenharmony_ci
61f08c3bdfSopenharmony_ci	tst_set_timeout $((dev_num*450))
62f08c3bdfSopenharmony_ci
63f08c3bdfSopenharmony_ci	tst_res TINFO "create '$dev_num' zram device(s)"
64f08c3bdfSopenharmony_ci
65f08c3bdfSopenharmony_ci	# zram module loaded, new kernel
66f08c3bdfSopenharmony_ci	if [ -d "/sys/class/zram-control" ]; then
67f08c3bdfSopenharmony_ci		tst_res TINFO "zram module already loaded, kernel supports zram-control interface"
68f08c3bdfSopenharmony_ci		dev_start=$(ls /dev/zram* | wc -w)
69f08c3bdfSopenharmony_ci		dev_end=$(($dev_start + $dev_num - 1))
70f08c3bdfSopenharmony_ci		sys_control=1
71f08c3bdfSopenharmony_ci
72f08c3bdfSopenharmony_ci		for i in $(seq  $dev_start $dev_end); do
73f08c3bdfSopenharmony_ci			cat /sys/class/zram-control/hot_add > /dev/null
74f08c3bdfSopenharmony_ci		done
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_ci		tst_res TPASS "all zram devices (/dev/zram$dev_start~$dev_end) successfully created"
77f08c3bdfSopenharmony_ci		return
78f08c3bdfSopenharmony_ci	fi
79f08c3bdfSopenharmony_ci
80f08c3bdfSopenharmony_ci	# detect old kernel or built-in
81f08c3bdfSopenharmony_ci	modprobe zram num_devices=$dev_num
82f08c3bdfSopenharmony_ci	if [ ! -d "/sys/class/zram-control" ]; then
83f08c3bdfSopenharmony_ci		if grep -q '^zram' /proc/modules; then
84f08c3bdfSopenharmony_ci			rmmod zram > /dev/null 2>&1 || \
85f08c3bdfSopenharmony_ci				tst_brk TCONF "zram module is being used on old kernel without zram-control interface"
86f08c3bdfSopenharmony_ci		else
87f08c3bdfSopenharmony_ci			tst_brk TCONF "test needs CONFIG_ZRAM=m on old kernel without zram-control interface"
88f08c3bdfSopenharmony_ci		fi
89f08c3bdfSopenharmony_ci		modprobe zram num_devices=$dev_num
90f08c3bdfSopenharmony_ci	fi
91f08c3bdfSopenharmony_ci
92f08c3bdfSopenharmony_ci	module_load=1
93f08c3bdfSopenharmony_ci	dev_end=$(($dev_num - 1))
94f08c3bdfSopenharmony_ci	tst_res TPASS "all zram devices (/dev/zram0~$dev_end) successfully created"
95f08c3bdfSopenharmony_ci}
96f08c3bdfSopenharmony_ci
97f08c3bdfSopenharmony_cizram_max_streams()
98f08c3bdfSopenharmony_ci{
99f08c3bdfSopenharmony_ci	if tst_kvcmp -lt "3.15" -o -ge "4.7"; then
100f08c3bdfSopenharmony_ci		tst_res TCONF "The device attribute max_comp_streams was"\
101f08c3bdfSopenharmony_ci		               "introduced in kernel 3.15 and deprecated in 4.7"
102f08c3bdfSopenharmony_ci		return
103f08c3bdfSopenharmony_ci	fi
104f08c3bdfSopenharmony_ci
105f08c3bdfSopenharmony_ci	tst_res TINFO "set max_comp_streams to zram device(s)"
106f08c3bdfSopenharmony_ci
107f08c3bdfSopenharmony_ci	local i=$dev_start
108f08c3bdfSopenharmony_ci
109f08c3bdfSopenharmony_ci	for max_s in $zram_max_streams; do
110f08c3bdfSopenharmony_ci		local sys_path="/sys/block/zram${i}/max_comp_streams"
111f08c3bdfSopenharmony_ci		echo $max_s > $sys_path || \
112f08c3bdfSopenharmony_ci			tst_brk TFAIL "failed to set '$max_s' to $sys_path"
113f08c3bdfSopenharmony_ci		local max_streams=$(cat $sys_path)
114f08c3bdfSopenharmony_ci
115f08c3bdfSopenharmony_ci		[ "$max_s" -ne "$max_streams" ] && \
116f08c3bdfSopenharmony_ci			tst_brk TFAIL "can't set max_streams '$max_s', get $max_stream"
117f08c3bdfSopenharmony_ci
118f08c3bdfSopenharmony_ci		i=$(($i + 1))
119f08c3bdfSopenharmony_ci		tst_res TINFO "$sys_path = '$max_streams'"
120f08c3bdfSopenharmony_ci	done
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_ci	tst_res TPASS "test succeeded"
123f08c3bdfSopenharmony_ci}
124f08c3bdfSopenharmony_ci
125f08c3bdfSopenharmony_cizram_compress_alg()
126f08c3bdfSopenharmony_ci{
127f08c3bdfSopenharmony_ci	if tst_kvcmp -lt "3.15"; then
128f08c3bdfSopenharmony_ci		tst_res TCONF "device attribute comp_algorithm is"\
129f08c3bdfSopenharmony_ci			"introduced since kernel v3.15, the running kernel"\
130f08c3bdfSopenharmony_ci			"does not support it"
131f08c3bdfSopenharmony_ci		return
132f08c3bdfSopenharmony_ci	fi
133f08c3bdfSopenharmony_ci
134f08c3bdfSopenharmony_ci	local i=$dev_start
135f08c3bdfSopenharmony_ci
136f08c3bdfSopenharmony_ci	tst_res TINFO "test that we can set compression algorithm"
137f08c3bdfSopenharmony_ci	local algs="$(sed 's/[][]//g' /sys/block/zram${i}/comp_algorithm)"
138f08c3bdfSopenharmony_ci	tst_res TINFO "supported algs: $algs"
139f08c3bdfSopenharmony_ci
140f08c3bdfSopenharmony_ci	for i in $(seq $dev_start $dev_end); do
141f08c3bdfSopenharmony_ci		for alg in $algs; do
142f08c3bdfSopenharmony_ci			local sys_path="/sys/block/zram${i}/comp_algorithm"
143f08c3bdfSopenharmony_ci			echo "$alg" >  $sys_path || \
144f08c3bdfSopenharmony_ci				tst_brk TFAIL "can't set '$alg' to $sys_path"
145f08c3bdfSopenharmony_ci			tst_res TINFO "$sys_path = '$alg'"
146f08c3bdfSopenharmony_ci		done
147f08c3bdfSopenharmony_ci	done
148f08c3bdfSopenharmony_ci
149f08c3bdfSopenharmony_ci	tst_res TPASS "test succeeded"
150f08c3bdfSopenharmony_ci}
151f08c3bdfSopenharmony_ci
152f08c3bdfSopenharmony_cizram_set_disksizes()
153f08c3bdfSopenharmony_ci{
154f08c3bdfSopenharmony_ci	local i=$dev_start
155f08c3bdfSopenharmony_ci	local ds
156f08c3bdfSopenharmony_ci
157f08c3bdfSopenharmony_ci	tst_res TINFO "set disk size to zram device(s)"
158f08c3bdfSopenharmony_ci	for ds in $zram_sizes; do
159f08c3bdfSopenharmony_ci		local sys_path="/sys/block/zram${i}/disksize"
160f08c3bdfSopenharmony_ci		echo "$ds" >  $sys_path || \
161f08c3bdfSopenharmony_ci			tst_brk TFAIL "can't set '$ds' to $sys_path"
162f08c3bdfSopenharmony_ci
163f08c3bdfSopenharmony_ci		i=$(($i + 1))
164f08c3bdfSopenharmony_ci		tst_res TINFO "$sys_path = '$ds'"
165f08c3bdfSopenharmony_ci	done
166f08c3bdfSopenharmony_ci
167f08c3bdfSopenharmony_ci	tst_res TPASS "test succeeded"
168f08c3bdfSopenharmony_ci}
169f08c3bdfSopenharmony_ci
170f08c3bdfSopenharmony_cizram_set_memlimit()
171f08c3bdfSopenharmony_ci{
172f08c3bdfSopenharmony_ci	if tst_kvcmp -lt "3.18"; then
173f08c3bdfSopenharmony_ci		tst_res TCONF "device attribute mem_limit is"\
174f08c3bdfSopenharmony_ci			"introduced since kernel v3.18, the running kernel"\
175f08c3bdfSopenharmony_ci			"does not support it"
176f08c3bdfSopenharmony_ci		return
177f08c3bdfSopenharmony_ci	fi
178f08c3bdfSopenharmony_ci
179f08c3bdfSopenharmony_ci	local i=$dev_start
180f08c3bdfSopenharmony_ci	local ds
181f08c3bdfSopenharmony_ci
182f08c3bdfSopenharmony_ci	tst_res TINFO "set memory limit to zram device(s)"
183f08c3bdfSopenharmony_ci
184f08c3bdfSopenharmony_ci	for ds in $zram_mem_limits; do
185f08c3bdfSopenharmony_ci		local sys_path="/sys/block/zram${i}/mem_limit"
186f08c3bdfSopenharmony_ci		echo "$ds" >  $sys_path || \
187f08c3bdfSopenharmony_ci			tst_brk TFAIL "can't set '$ds' to $sys_path"
188f08c3bdfSopenharmony_ci
189f08c3bdfSopenharmony_ci		i=$(($i + 1))
190f08c3bdfSopenharmony_ci		tst_res TINFO "$sys_path = '$ds'"
191f08c3bdfSopenharmony_ci	done
192f08c3bdfSopenharmony_ci
193f08c3bdfSopenharmony_ci	tst_res TPASS "test succeeded"
194f08c3bdfSopenharmony_ci}
195f08c3bdfSopenharmony_ci
196f08c3bdfSopenharmony_ci. tst_test.sh
197