270 lines · bash
1#!/bin/sh2# SPDX-License-Identifier: GPL-2.0-or-later3# 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=-19dev_mounted=-110dev_start=011dev_end=-112module_load=-113sys_control=-114# Kselftest framework requirement - SKIP code is 4.15ksft_skip=416kernel_version=`uname -r | cut -d'.' -f1,2`17kernel_major=${kernel_version%.*}18kernel_minor=${kernel_version#*.}19 20trap INT21 22check_prereqs()23{24 local msg="skip all tests:"25 local uid=$(id -u)26 27 if [ $uid -ne 0 ]; then28 echo $msg must be run as root >&229 exit $ksft_skip30 fi31}32 33kernel_gte()34{35 major=${1%.*}36 minor=${1#*.}37 38 if [ $kernel_major -gt $major ]; then39 return 040 elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then41 return 042 fi43 44 return 145}46 47zram_cleanup()48{49 echo "zram cleanup"50 local i=51 for i in $(seq $dev_start $dev_makeswap); do52 swapoff /dev/zram$i53 done54 55 for i in $(seq $dev_start $dev_mounted); do56 umount /dev/zram$i57 done58 59 for i in $(seq $dev_start $dev_end); do60 echo 1 > /sys/block/zram${i}/reset61 rm -rf zram$i62 done63 64 if [ $sys_control -eq 1 ]; then65 for i in $(seq $dev_start $dev_end); do66 echo $i > /sys/class/zram-control/hot_remove67 done68 fi69 70 if [ $module_load -eq 1 ]; then71 rmmod zram > /dev/null 2>&172 fi73}74 75zram_load()76{77 echo "create '$dev_num' zram device(s)"78 79 # zram module loaded, new kernel80 if [ -d "/sys/class/zram-control" ]; then81 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=186 87 for i in $(seq $dev_start $dev_end); do88 cat /sys/class/zram-control/hot_add > /dev/null89 done90 91 echo "all zram devices (/dev/zram$dev_start~$dev_end" \92 "successfully created"93 return 094 fi95 96 # detect old kernel or built-in97 modprobe zram num_devices=$dev_num98 if [ ! -d "/sys/class/zram-control" ]; then99 if grep -q '^zram' /proc/modules; then100 rmmod zram > /dev/null 2>&1101 if [ $? -ne 0 ]; then102 echo "zram module is being used on old kernel" \103 "without zram-control interface"104 exit $ksft_skip105 fi106 else107 echo "test needs CONFIG_ZRAM=m on old kernel without" \108 "zram-control interface"109 exit $ksft_skip110 fi111 modprobe zram num_devices=$dev_num112 fi113 114 module_load=1115 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.7124 if [ $? -eq 0 ]; then125 echo "The device attribute max_comp_streams was"\126 "deprecated in 4.7"127 return 0128 fi129 130 local i=$dev_start131 for max_s in $zram_max_streams; do132 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 1136 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 done144 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_start153 local algs=$(cat /sys/block/zram${i}/comp_algorithm)154 echo "supported algs: $algs"155 156 for alg in $zram_algs; do157 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 done163 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_start171 for ds in $zram_sizes; do172 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 done179 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_start188 for ds in $zram_mem_limits; do189 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 done196 197 echo "zram set memory limit: OK"198}199 200zram_makeswap()201{202 echo "make swap with zram device(s)"203 local i=$dev_start204 for i in $(seq $dev_start $dev_end); do205 mkswap /dev/zram$i > err.log 2>&1206 if [ $? -ne 0 ]; then207 cat err.log208 echo "FAIL mkswap /dev/zram$1 failed"209 fi210 211 swapon /dev/zram$i > err.log 2>&1212 if [ $? -ne 0 ]; then213 cat err.log214 echo "FAIL swapon /dev/zram$1 failed"215 fi216 217 echo "done with /dev/zram$i"218 dev_makeswap=$i219 done220 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); do228 swapoff /dev/zram$i > err.log 2>&1229 if [ $? -ne 0 ]; then230 cat err.log231 echo "FAIL swapoff /dev/zram$i failed"232 fi233 done234 dev_makeswap=-1235 236 echo "zram swapoff: OK"237}238 239zram_makefs()240{241 local i=$dev_start242 for fs in $zram_filesystems; do243 # if requested fs not supported default it to ext2244 which mkfs.$fs > /dev/null 2>&1 || fs=ext2245 246 echo "make $fs filesystem on /dev/zram$i"247 mkfs.$fs /dev/zram$i > err.log 2>&1248 if [ $? -ne 0 ]; then249 cat err.log250 echo "FAIL failed to make $fs on /dev/zram$i"251 fi252 i=$(($i + 1))253 echo "zram mkfs.$fs: OK"254 done255}256 257zram_mount()258{259 local i=0260 for i in $(seq $dev_start $dev_end); do261 echo "mount /dev/zram$i"262 mkdir zram$i263 mount /dev/zram$i zram$i > /dev/null || \264 echo "FAIL mount /dev/zram$i failed"265 dev_mounted=$i266 done267 268 echo "zram mount of zram device(s): OK"269}270