xref: /aosp_15_r20/external/ltp/testcases/kernel/device-drivers/zram/zram01.sh (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker#!/bin/sh
2*49cdfc7eSAndroid Build Coastguard Worker# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
3*49cdfc7eSAndroid Build Coastguard Worker# Copyright (c) 2019-2022 Petr Vorel <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker# Author: Alexey Kodanev <[email protected]>
5*49cdfc7eSAndroid Build Coastguard Worker#
6*49cdfc7eSAndroid Build Coastguard Worker# Test creates several zram devices with different filesystems on them.
7*49cdfc7eSAndroid Build Coastguard Worker# It fills each device with zeros and checks that compression works.
8*49cdfc7eSAndroid Build Coastguard Worker
9*49cdfc7eSAndroid Build Coastguard WorkerTST_CNT=7
10*49cdfc7eSAndroid Build Coastguard WorkerTST_TESTFUNC="do_test"
11*49cdfc7eSAndroid Build Coastguard WorkerTST_NEEDS_CMDS="awk bc dd"
12*49cdfc7eSAndroid Build Coastguard WorkerTST_SETUP="setup"
13*49cdfc7eSAndroid Build Coastguard Worker
14*49cdfc7eSAndroid Build Coastguard Workercheck_space_for_fs()
15*49cdfc7eSAndroid Build Coastguard Worker{
16*49cdfc7eSAndroid Build Coastguard Worker	local fs="$1"
17*49cdfc7eSAndroid Build Coastguard Worker	local ram_size
18*49cdfc7eSAndroid Build Coastguard Worker
19*49cdfc7eSAndroid Build Coastguard Worker	ram_size=$(awk '/MemTotal:/ {print $2}' /proc/meminfo)
20*49cdfc7eSAndroid Build Coastguard Worker	if [ "$ram_size" -lt 1048576 ]; then
21*49cdfc7eSAndroid Build Coastguard Worker		tst_res TINFO "not enough space for $fs"
22*49cdfc7eSAndroid Build Coastguard Worker		return 1
23*49cdfc7eSAndroid Build Coastguard Worker	fi
24*49cdfc7eSAndroid Build Coastguard Worker	return 0
25*49cdfc7eSAndroid Build Coastguard Worker}
26*49cdfc7eSAndroid Build Coastguard Worker
27*49cdfc7eSAndroid Build Coastguard Worker# List of parameters for zram devices.
28*49cdfc7eSAndroid Build Coastguard Worker# For each number the test creates own zram device.
29*49cdfc7eSAndroid Build Coastguard Worker# NOTE about size:
30*49cdfc7eSAndroid Build Coastguard Worker# The zram sysfs node 'disksize' value can be either in bytes,
31*49cdfc7eSAndroid Build Coastguard Worker# or you can use mem suffixes. But in some old kernels, mem
32*49cdfc7eSAndroid Build Coastguard Worker# suffixes are not supported, for example, in RHEL6.6GA's kernel
33*49cdfc7eSAndroid Build Coastguard Worker# layer, it uses strict_strtoull() to parse disksize which does
34*49cdfc7eSAndroid Build Coastguard Worker# not support mem suffixes, in some newer kernels, they use
35*49cdfc7eSAndroid Build Coastguard Worker# memparse() which supports mem suffixes. So here we just use
36*49cdfc7eSAndroid Build Coastguard Worker# bytes to make sure everything works correctly.
37*49cdfc7eSAndroid Build Coastguard Workerinitialize_vars()
38*49cdfc7eSAndroid Build Coastguard Worker{
39*49cdfc7eSAndroid Build Coastguard Worker	local fs limit size stream=-1
40*49cdfc7eSAndroid Build Coastguard Worker	dev_num=0
41*49cdfc7eSAndroid Build Coastguard Worker
42*49cdfc7eSAndroid Build Coastguard Worker	for fs in $(tst_supported_fs -s tmpfs); do
43*49cdfc7eSAndroid Build Coastguard Worker		size="26214400"
44*49cdfc7eSAndroid Build Coastguard Worker		limit="25M"
45*49cdfc7eSAndroid Build Coastguard Worker
46*49cdfc7eSAndroid Build Coastguard Worker		if [ "$fs" = "btrfs" -o "$fs" = "xfs" ]; then
47*49cdfc7eSAndroid Build Coastguard Worker			check_space_for_fs "$fs" || continue
48*49cdfc7eSAndroid Build Coastguard Worker
49*49cdfc7eSAndroid Build Coastguard Worker			if [ "$fs" = "btrfs" ]; then
50*49cdfc7eSAndroid Build Coastguard Worker				size="402653184"
51*49cdfc7eSAndroid Build Coastguard Worker			elif [ "$fs" = "xfs" ]; then
52*49cdfc7eSAndroid Build Coastguard Worker				size=314572800
53*49cdfc7eSAndroid Build Coastguard Worker			fi
54*49cdfc7eSAndroid Build Coastguard Worker			limit="$((size/1024/1024))M"
55*49cdfc7eSAndroid Build Coastguard Worker		fi
56*49cdfc7eSAndroid Build Coastguard Worker
57*49cdfc7eSAndroid Build Coastguard Worker		stream=$((stream+3))
58*49cdfc7eSAndroid Build Coastguard Worker		dev_num=$((dev_num+1))
59*49cdfc7eSAndroid Build Coastguard Worker		zram_filesystems="$zram_filesystems $fs"
60*49cdfc7eSAndroid Build Coastguard Worker		zram_mem_limits="$zram_mem_limits $limit"
61*49cdfc7eSAndroid Build Coastguard Worker		zram_sizes="$zram_sizes $size"
62*49cdfc7eSAndroid Build Coastguard Worker		zram_max_streams="$zram_max_streams $stream"
63*49cdfc7eSAndroid Build Coastguard Worker	done
64*49cdfc7eSAndroid Build Coastguard Worker
65*49cdfc7eSAndroid Build Coastguard Worker	[ $dev_num -eq 0 ] && \
66*49cdfc7eSAndroid Build Coastguard Worker		tst_brk TCONF "no suitable filesystem"
67*49cdfc7eSAndroid Build Coastguard Worker}
68*49cdfc7eSAndroid Build Coastguard Worker
69*49cdfc7eSAndroid Build Coastguard Workersetup()
70*49cdfc7eSAndroid Build Coastguard Worker{
71*49cdfc7eSAndroid Build Coastguard Worker	initialize_vars
72*49cdfc7eSAndroid Build Coastguard Worker	zram_load
73*49cdfc7eSAndroid Build Coastguard Worker}
74*49cdfc7eSAndroid Build Coastguard Worker
75*49cdfc7eSAndroid Build Coastguard Workerzram_makefs()
76*49cdfc7eSAndroid Build Coastguard Worker{
77*49cdfc7eSAndroid Build Coastguard Worker	local i=$dev_start
78*49cdfc7eSAndroid Build Coastguard Worker	local fs
79*49cdfc7eSAndroid Build Coastguard Worker
80*49cdfc7eSAndroid Build Coastguard Worker	for fs in $zram_filesystems; do
81*49cdfc7eSAndroid Build Coastguard Worker		tst_res TINFO "make $fs filesystem on /dev/zram$i"
82*49cdfc7eSAndroid Build Coastguard Worker		mkfs.$fs /dev/zram$i > err.log 2>&1
83*49cdfc7eSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
84*49cdfc7eSAndroid Build Coastguard Worker			cat err.log
85*49cdfc7eSAndroid Build Coastguard Worker			tst_res TFAIL "Failed to make $fs on /dev/zram$i"
86*49cdfc7eSAndroid Build Coastguard Worker			tst_brk TBROK "Can't continue with mounting the FS"
87*49cdfc7eSAndroid Build Coastguard Worker		fi
88*49cdfc7eSAndroid Build Coastguard Worker
89*49cdfc7eSAndroid Build Coastguard Worker		i=$(($i + 1))
90*49cdfc7eSAndroid Build Coastguard Worker	done
91*49cdfc7eSAndroid Build Coastguard Worker
92*49cdfc7eSAndroid Build Coastguard Worker	tst_res TPASS "zram_makefs succeeded"
93*49cdfc7eSAndroid Build Coastguard Worker}
94*49cdfc7eSAndroid Build Coastguard Worker
95*49cdfc7eSAndroid Build Coastguard Workerzram_mount()
96*49cdfc7eSAndroid Build Coastguard Worker{
97*49cdfc7eSAndroid Build Coastguard Worker	local i
98*49cdfc7eSAndroid Build Coastguard Worker
99*49cdfc7eSAndroid Build Coastguard Worker	for i in $(seq $dev_start $dev_end); do
100*49cdfc7eSAndroid Build Coastguard Worker		tst_res TINFO "mount /dev/zram$i"
101*49cdfc7eSAndroid Build Coastguard Worker		mkdir zram$i
102*49cdfc7eSAndroid Build Coastguard Worker		ROD mount /dev/zram$i zram$i
103*49cdfc7eSAndroid Build Coastguard Worker		dev_mounted=$i
104*49cdfc7eSAndroid Build Coastguard Worker	done
105*49cdfc7eSAndroid Build Coastguard Worker
106*49cdfc7eSAndroid Build Coastguard Worker	tst_res TPASS "mount of zram device(s) succeeded"
107*49cdfc7eSAndroid Build Coastguard Worker}
108*49cdfc7eSAndroid Build Coastguard Worker
109*49cdfc7eSAndroid Build Coastguard Workerread_mem_used_total()
110*49cdfc7eSAndroid Build Coastguard Worker{
111*49cdfc7eSAndroid Build Coastguard Worker	echo $(awk '{print $3}' $1)
112*49cdfc7eSAndroid Build Coastguard Worker}
113*49cdfc7eSAndroid Build Coastguard Worker
114*49cdfc7eSAndroid Build Coastguard Worker# Reads /sys/block/zram*/mm_stat until mem_used_total is not 0.
115*49cdfc7eSAndroid Build Coastguard Workercheck_read_mem_used_total()
116*49cdfc7eSAndroid Build Coastguard Worker{
117*49cdfc7eSAndroid Build Coastguard Worker	local file="$1"
118*49cdfc7eSAndroid Build Coastguard Worker	local mem_used_total
119*49cdfc7eSAndroid Build Coastguard Worker
120*49cdfc7eSAndroid Build Coastguard Worker	tst_res TINFO "$file"
121*49cdfc7eSAndroid Build Coastguard Worker	cat $file >&2
122*49cdfc7eSAndroid Build Coastguard Worker
123*49cdfc7eSAndroid Build Coastguard Worker	mem_used_total=$(read_mem_used_total $file)
124*49cdfc7eSAndroid Build Coastguard Worker	[ "$mem_used_total" -eq 0 ] && return 1
125*49cdfc7eSAndroid Build Coastguard Worker
126*49cdfc7eSAndroid Build Coastguard Worker	return 0
127*49cdfc7eSAndroid Build Coastguard Worker}
128*49cdfc7eSAndroid Build Coastguard Worker
129*49cdfc7eSAndroid Build Coastguard Workerzram_fill_fs()
130*49cdfc7eSAndroid Build Coastguard Worker{
131*49cdfc7eSAndroid Build Coastguard Worker	local mem_used_total
132*49cdfc7eSAndroid Build Coastguard Worker	local b i r v
133*49cdfc7eSAndroid Build Coastguard Worker
134*49cdfc7eSAndroid Build Coastguard Worker	for i in $(seq $dev_start $dev_end); do
135*49cdfc7eSAndroid Build Coastguard Worker		tst_res TINFO "filling zram$i (it can take long time)"
136*49cdfc7eSAndroid Build Coastguard Worker		b=0
137*49cdfc7eSAndroid Build Coastguard Worker		while true; do
138*49cdfc7eSAndroid Build Coastguard Worker			dd conv=notrunc if=/dev/zero of=zram${i}/file \
139*49cdfc7eSAndroid Build Coastguard Worker				oflag=append count=1 bs=1024 status=none \
140*49cdfc7eSAndroid Build Coastguard Worker				>/dev/null 2>err.txt || break
141*49cdfc7eSAndroid Build Coastguard Worker			b=$(($b + 1))
142*49cdfc7eSAndroid Build Coastguard Worker		done
143*49cdfc7eSAndroid Build Coastguard Worker		if [ $b -eq 0 ]; then
144*49cdfc7eSAndroid Build Coastguard Worker			[ -s err.txt ] && tst_res TWARN "dd error: $(cat err.txt)"
145*49cdfc7eSAndroid Build Coastguard Worker			tst_brk TBROK "cannot fill zram $i"
146*49cdfc7eSAndroid Build Coastguard Worker		fi
147*49cdfc7eSAndroid Build Coastguard Worker		tst_res TPASS "zram$i was filled with '$b' KB"
148*49cdfc7eSAndroid Build Coastguard Worker
149*49cdfc7eSAndroid Build Coastguard Worker		if [ ! -f "/sys/block/zram$i/mm_stat" ]; then
150*49cdfc7eSAndroid Build Coastguard Worker			if [ $i -eq 0 ]; then
151*49cdfc7eSAndroid Build Coastguard Worker				tst_res TCONF "zram compression ratio test requires zram mm_stat sysfs file"
152*49cdfc7eSAndroid Build Coastguard Worker			fi
153*49cdfc7eSAndroid Build Coastguard Worker
154*49cdfc7eSAndroid Build Coastguard Worker			continue
155*49cdfc7eSAndroid Build Coastguard Worker		fi
156*49cdfc7eSAndroid Build Coastguard Worker
157*49cdfc7eSAndroid Build Coastguard Worker		TST_RETRY_FN_EXP_BACKOFF "check_read_mem_used_total /sys/block/zram$i/mm_stat" 0 10
158*49cdfc7eSAndroid Build Coastguard Worker		mem_used_total=$(read_mem_used_total /sys/block/zram$i/mm_stat)
159*49cdfc7eSAndroid Build Coastguard Worker		tst_res TINFO "mem_used_total: $mem_used_total"
160*49cdfc7eSAndroid Build Coastguard Worker
161*49cdfc7eSAndroid Build Coastguard Worker		v=$((100 * 1024 * $b / $mem_used_total))
162*49cdfc7eSAndroid Build Coastguard Worker		r=$(echo "scale=2; $v / 100 " | bc)
163*49cdfc7eSAndroid Build Coastguard Worker
164*49cdfc7eSAndroid Build Coastguard Worker		if [ "$v" -lt 100 ]; then
165*49cdfc7eSAndroid Build Coastguard Worker			tst_res TFAIL "compression ratio: $r:1"
166*49cdfc7eSAndroid Build Coastguard Worker			break
167*49cdfc7eSAndroid Build Coastguard Worker		fi
168*49cdfc7eSAndroid Build Coastguard Worker
169*49cdfc7eSAndroid Build Coastguard Worker		tst_res TPASS "compression ratio: $r:1"
170*49cdfc7eSAndroid Build Coastguard Worker	done
171*49cdfc7eSAndroid Build Coastguard Worker}
172*49cdfc7eSAndroid Build Coastguard Worker
173*49cdfc7eSAndroid Build Coastguard Workerdo_test()
174*49cdfc7eSAndroid Build Coastguard Worker{
175*49cdfc7eSAndroid Build Coastguard Worker	case $1 in
176*49cdfc7eSAndroid Build Coastguard Worker	 1) zram_max_streams;;
177*49cdfc7eSAndroid Build Coastguard Worker	 2) zram_compress_alg;;
178*49cdfc7eSAndroid Build Coastguard Worker	 3) zram_set_disksizes;;
179*49cdfc7eSAndroid Build Coastguard Worker	 4) zram_set_memlimit;;
180*49cdfc7eSAndroid Build Coastguard Worker	 5) zram_makefs;;
181*49cdfc7eSAndroid Build Coastguard Worker	 6) zram_mount;;
182*49cdfc7eSAndroid Build Coastguard Worker	 7) zram_fill_fs;;
183*49cdfc7eSAndroid Build Coastguard Worker	esac
184*49cdfc7eSAndroid Build Coastguard Worker}
185*49cdfc7eSAndroid Build Coastguard Worker
186*49cdfc7eSAndroid Build Coastguard Worker. zram_lib.sh
187*49cdfc7eSAndroid Build Coastguard Workertst_run
188