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} 270