1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 3*4882a593Smuzhiyun# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Author: Alexey Kodanev <alexey.kodanev@oracle.com> 6*4882a593Smuzhiyun# Modified: Naresh Kamboju <naresh.kamboju@linaro.org> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyundev_makeswap=-1 9*4882a593Smuzhiyundev_mounted=-1 10*4882a593Smuzhiyundev_start=0 11*4882a593Smuzhiyundev_end=-1 12*4882a593Smuzhiyunmodule_load=-1 13*4882a593Smuzhiyunsys_control=-1 14*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 15*4882a593Smuzhiyunksft_skip=4 16*4882a593Smuzhiyunkernel_version=`uname -r | cut -d'.' -f1,2` 17*4882a593Smuzhiyunkernel_major=${kernel_version%.*} 18*4882a593Smuzhiyunkernel_minor=${kernel_version#*.} 19*4882a593Smuzhiyun 20*4882a593Smuzhiyuntrap INT 21*4882a593Smuzhiyun 22*4882a593Smuzhiyuncheck_prereqs() 23*4882a593Smuzhiyun{ 24*4882a593Smuzhiyun local msg="skip all tests:" 25*4882a593Smuzhiyun local uid=$(id -u) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun if [ $uid -ne 0 ]; then 28*4882a593Smuzhiyun echo $msg must be run as root >&2 29*4882a593Smuzhiyun exit $ksft_skip 30*4882a593Smuzhiyun fi 31*4882a593Smuzhiyun} 32*4882a593Smuzhiyun 33*4882a593Smuzhiyunkernel_gte() 34*4882a593Smuzhiyun{ 35*4882a593Smuzhiyun major=${1%.*} 36*4882a593Smuzhiyun minor=${1#*.} 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun if [ $kernel_major -gt $major ]; then 39*4882a593Smuzhiyun return 0 40*4882a593Smuzhiyun elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then 41*4882a593Smuzhiyun return 0 42*4882a593Smuzhiyun fi 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun return 1 45*4882a593Smuzhiyun} 46*4882a593Smuzhiyun 47*4882a593Smuzhiyunzram_cleanup() 48*4882a593Smuzhiyun{ 49*4882a593Smuzhiyun echo "zram cleanup" 50*4882a593Smuzhiyun local i= 51*4882a593Smuzhiyun for i in $(seq $dev_start $dev_makeswap); do 52*4882a593Smuzhiyun swapoff /dev/zram$i 53*4882a593Smuzhiyun done 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun for i in $(seq $dev_start $dev_mounted); do 56*4882a593Smuzhiyun umount /dev/zram$i 57*4882a593Smuzhiyun done 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 60*4882a593Smuzhiyun echo 1 > /sys/block/zram${i}/reset 61*4882a593Smuzhiyun rm -rf zram$i 62*4882a593Smuzhiyun done 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun if [ $sys_control -eq 1 ]; then 65*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 66*4882a593Smuzhiyun echo $i > /sys/class/zram-control/hot_remove 67*4882a593Smuzhiyun done 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun if [ $module_load -eq 1 ]; then 71*4882a593Smuzhiyun rmmod zram > /dev/null 2>&1 72*4882a593Smuzhiyun fi 73*4882a593Smuzhiyun} 74*4882a593Smuzhiyun 75*4882a593Smuzhiyunzram_load() 76*4882a593Smuzhiyun{ 77*4882a593Smuzhiyun echo "create '$dev_num' zram device(s)" 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun # zram module loaded, new kernel 80*4882a593Smuzhiyun if [ -d "/sys/class/zram-control" ]; then 81*4882a593Smuzhiyun echo "zram modules already loaded, kernel supports" \ 82*4882a593Smuzhiyun "zram-control interface" 83*4882a593Smuzhiyun dev_start=$(ls /dev/zram* | wc -w) 84*4882a593Smuzhiyun dev_end=$(($dev_start + $dev_num - 1)) 85*4882a593Smuzhiyun sys_control=1 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 88*4882a593Smuzhiyun cat /sys/class/zram-control/hot_add > /dev/null 89*4882a593Smuzhiyun done 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun echo "all zram devices (/dev/zram$dev_start~$dev_end" \ 92*4882a593Smuzhiyun "successfully created" 93*4882a593Smuzhiyun return 0 94*4882a593Smuzhiyun fi 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun # detect old kernel or built-in 97*4882a593Smuzhiyun modprobe zram num_devices=$dev_num 98*4882a593Smuzhiyun if [ ! -d "/sys/class/zram-control" ]; then 99*4882a593Smuzhiyun if grep -q '^zram' /proc/modules; then 100*4882a593Smuzhiyun rmmod zram > /dev/null 2>&1 101*4882a593Smuzhiyun if [ $? -ne 0 ]; then 102*4882a593Smuzhiyun echo "zram module is being used on old kernel" \ 103*4882a593Smuzhiyun "without zram-control interface" 104*4882a593Smuzhiyun exit $ksft_skip 105*4882a593Smuzhiyun fi 106*4882a593Smuzhiyun else 107*4882a593Smuzhiyun echo "test needs CONFIG_ZRAM=m on old kernel without" \ 108*4882a593Smuzhiyun "zram-control interface" 109*4882a593Smuzhiyun exit $ksft_skip 110*4882a593Smuzhiyun fi 111*4882a593Smuzhiyun modprobe zram num_devices=$dev_num 112*4882a593Smuzhiyun fi 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun module_load=1 115*4882a593Smuzhiyun dev_end=$(($dev_num - 1)) 116*4882a593Smuzhiyun echo "all zram devices (/dev/zram0~$dev_end) successfully created" 117*4882a593Smuzhiyun} 118*4882a593Smuzhiyun 119*4882a593Smuzhiyunzram_max_streams() 120*4882a593Smuzhiyun{ 121*4882a593Smuzhiyun echo "set max_comp_streams to zram device(s)" 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun kernel_gte 4.7 124*4882a593Smuzhiyun if [ $? -eq 0 ]; then 125*4882a593Smuzhiyun echo "The device attribute max_comp_streams was"\ 126*4882a593Smuzhiyun "deprecated in 4.7" 127*4882a593Smuzhiyun return 0 128*4882a593Smuzhiyun fi 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun local i=$dev_start 131*4882a593Smuzhiyun for max_s in $zram_max_streams; do 132*4882a593Smuzhiyun local sys_path="/sys/block/zram${i}/max_comp_streams" 133*4882a593Smuzhiyun echo $max_s > $sys_path || \ 134*4882a593Smuzhiyun echo "FAIL failed to set '$max_s' to $sys_path" 135*4882a593Smuzhiyun sleep 1 136*4882a593Smuzhiyun local max_streams=$(cat $sys_path) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun [ "$max_s" -ne "$max_streams" ] && \ 139*4882a593Smuzhiyun echo "FAIL can't set max_streams '$max_s', get $max_stream" 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun i=$(($i + 1)) 142*4882a593Smuzhiyun echo "$sys_path = '$max_streams'" 143*4882a593Smuzhiyun done 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun echo "zram max streams: OK" 146*4882a593Smuzhiyun} 147*4882a593Smuzhiyun 148*4882a593Smuzhiyunzram_compress_alg() 149*4882a593Smuzhiyun{ 150*4882a593Smuzhiyun echo "test that we can set compression algorithm" 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun local i=$dev_start 153*4882a593Smuzhiyun local algs=$(cat /sys/block/zram${i}/comp_algorithm) 154*4882a593Smuzhiyun echo "supported algs: $algs" 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun for alg in $zram_algs; do 157*4882a593Smuzhiyun local sys_path="/sys/block/zram${i}/comp_algorithm" 158*4882a593Smuzhiyun echo "$alg" > $sys_path || \ 159*4882a593Smuzhiyun echo "FAIL can't set '$alg' to $sys_path" 160*4882a593Smuzhiyun i=$(($i + 1)) 161*4882a593Smuzhiyun echo "$sys_path = '$alg'" 162*4882a593Smuzhiyun done 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun echo "zram set compression algorithm: OK" 165*4882a593Smuzhiyun} 166*4882a593Smuzhiyun 167*4882a593Smuzhiyunzram_set_disksizes() 168*4882a593Smuzhiyun{ 169*4882a593Smuzhiyun echo "set disk size to zram device(s)" 170*4882a593Smuzhiyun local i=$dev_start 171*4882a593Smuzhiyun for ds in $zram_sizes; do 172*4882a593Smuzhiyun local sys_path="/sys/block/zram${i}/disksize" 173*4882a593Smuzhiyun echo "$ds" > $sys_path || \ 174*4882a593Smuzhiyun echo "FAIL can't set '$ds' to $sys_path" 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun i=$(($i + 1)) 177*4882a593Smuzhiyun echo "$sys_path = '$ds'" 178*4882a593Smuzhiyun done 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun echo "zram set disksizes: OK" 181*4882a593Smuzhiyun} 182*4882a593Smuzhiyun 183*4882a593Smuzhiyunzram_set_memlimit() 184*4882a593Smuzhiyun{ 185*4882a593Smuzhiyun echo "set memory limit to zram device(s)" 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun local i=$dev_start 188*4882a593Smuzhiyun for ds in $zram_mem_limits; do 189*4882a593Smuzhiyun local sys_path="/sys/block/zram${i}/mem_limit" 190*4882a593Smuzhiyun echo "$ds" > $sys_path || \ 191*4882a593Smuzhiyun echo "FAIL can't set '$ds' to $sys_path" 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun i=$(($i + 1)) 194*4882a593Smuzhiyun echo "$sys_path = '$ds'" 195*4882a593Smuzhiyun done 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun echo "zram set memory limit: OK" 198*4882a593Smuzhiyun} 199*4882a593Smuzhiyun 200*4882a593Smuzhiyunzram_makeswap() 201*4882a593Smuzhiyun{ 202*4882a593Smuzhiyun echo "make swap with zram device(s)" 203*4882a593Smuzhiyun local i=$dev_start 204*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 205*4882a593Smuzhiyun mkswap /dev/zram$i > err.log 2>&1 206*4882a593Smuzhiyun if [ $? -ne 0 ]; then 207*4882a593Smuzhiyun cat err.log 208*4882a593Smuzhiyun echo "FAIL mkswap /dev/zram$1 failed" 209*4882a593Smuzhiyun fi 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun swapon /dev/zram$i > err.log 2>&1 212*4882a593Smuzhiyun if [ $? -ne 0 ]; then 213*4882a593Smuzhiyun cat err.log 214*4882a593Smuzhiyun echo "FAIL swapon /dev/zram$1 failed" 215*4882a593Smuzhiyun fi 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun echo "done with /dev/zram$i" 218*4882a593Smuzhiyun dev_makeswap=$i 219*4882a593Smuzhiyun done 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun echo "zram making zram mkswap and swapon: OK" 222*4882a593Smuzhiyun} 223*4882a593Smuzhiyun 224*4882a593Smuzhiyunzram_swapoff() 225*4882a593Smuzhiyun{ 226*4882a593Smuzhiyun local i= 227*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 228*4882a593Smuzhiyun swapoff /dev/zram$i > err.log 2>&1 229*4882a593Smuzhiyun if [ $? -ne 0 ]; then 230*4882a593Smuzhiyun cat err.log 231*4882a593Smuzhiyun echo "FAIL swapoff /dev/zram$i failed" 232*4882a593Smuzhiyun fi 233*4882a593Smuzhiyun done 234*4882a593Smuzhiyun dev_makeswap=-1 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun echo "zram swapoff: OK" 237*4882a593Smuzhiyun} 238*4882a593Smuzhiyun 239*4882a593Smuzhiyunzram_makefs() 240*4882a593Smuzhiyun{ 241*4882a593Smuzhiyun local i=$dev_start 242*4882a593Smuzhiyun for fs in $zram_filesystems; do 243*4882a593Smuzhiyun # if requested fs not supported default it to ext2 244*4882a593Smuzhiyun which mkfs.$fs > /dev/null 2>&1 || fs=ext2 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun echo "make $fs filesystem on /dev/zram$i" 247*4882a593Smuzhiyun mkfs.$fs /dev/zram$i > err.log 2>&1 248*4882a593Smuzhiyun if [ $? -ne 0 ]; then 249*4882a593Smuzhiyun cat err.log 250*4882a593Smuzhiyun echo "FAIL failed to make $fs on /dev/zram$i" 251*4882a593Smuzhiyun fi 252*4882a593Smuzhiyun i=$(($i + 1)) 253*4882a593Smuzhiyun echo "zram mkfs.$fs: OK" 254*4882a593Smuzhiyun done 255*4882a593Smuzhiyun} 256*4882a593Smuzhiyun 257*4882a593Smuzhiyunzram_mount() 258*4882a593Smuzhiyun{ 259*4882a593Smuzhiyun local i=0 260*4882a593Smuzhiyun for i in $(seq $dev_start $dev_end); do 261*4882a593Smuzhiyun echo "mount /dev/zram$i" 262*4882a593Smuzhiyun mkdir zram$i 263*4882a593Smuzhiyun mount /dev/zram$i zram$i > /dev/null || \ 264*4882a593Smuzhiyun echo "FAIL mount /dev/zram$i failed" 265*4882a593Smuzhiyun dev_mounted=$i 266*4882a593Smuzhiyun done 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun echo "zram mount of zram device(s): OK" 269*4882a593Smuzhiyun} 270