162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later 362306a36Sopenharmony_ci# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved. 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Author: Alexey Kodanev <alexey.kodanev@oracle.com> 662306a36Sopenharmony_ci# Modified: Naresh Kamboju <naresh.kamboju@linaro.org> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cidev_makeswap=-1 962306a36Sopenharmony_cidev_mounted=-1 1062306a36Sopenharmony_cidev_start=0 1162306a36Sopenharmony_cidev_end=-1 1262306a36Sopenharmony_cimodule_load=-1 1362306a36Sopenharmony_cisys_control=-1 1462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4. 1562306a36Sopenharmony_ciksft_skip=4 1662306a36Sopenharmony_cikernel_version=`uname -r | cut -d'.' -f1,2` 1762306a36Sopenharmony_cikernel_major=${kernel_version%.*} 1862306a36Sopenharmony_cikernel_minor=${kernel_version#*.} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_citrap INT 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cicheck_prereqs() 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci local msg="skip all tests:" 2562306a36Sopenharmony_ci local uid=$(id -u) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci if [ $uid -ne 0 ]; then 2862306a36Sopenharmony_ci echo $msg must be run as root >&2 2962306a36Sopenharmony_ci exit $ksft_skip 3062306a36Sopenharmony_ci fi 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cikernel_gte() 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci major=${1%.*} 3662306a36Sopenharmony_ci minor=${1#*.} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci if [ $kernel_major -gt $major ]; then 3962306a36Sopenharmony_ci return 0 4062306a36Sopenharmony_ci elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then 4162306a36Sopenharmony_ci return 0 4262306a36Sopenharmony_ci fi 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci return 1 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cizram_cleanup() 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci echo "zram cleanup" 5062306a36Sopenharmony_ci local i= 5162306a36Sopenharmony_ci for i in $(seq $dev_start $dev_makeswap); do 5262306a36Sopenharmony_ci swapoff /dev/zram$i 5362306a36Sopenharmony_ci done 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci for i in $(seq $dev_start $dev_mounted); do 5662306a36Sopenharmony_ci umount /dev/zram$i 5762306a36Sopenharmony_ci done 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 6062306a36Sopenharmony_ci echo 1 > /sys/block/zram${i}/reset 6162306a36Sopenharmony_ci rm -rf zram$i 6262306a36Sopenharmony_ci done 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci if [ $sys_control -eq 1 ]; then 6562306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 6662306a36Sopenharmony_ci echo $i > /sys/class/zram-control/hot_remove 6762306a36Sopenharmony_ci done 6862306a36Sopenharmony_ci fi 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci if [ $module_load -eq 1 ]; then 7162306a36Sopenharmony_ci rmmod zram > /dev/null 2>&1 7262306a36Sopenharmony_ci fi 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cizram_load() 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci echo "create '$dev_num' zram device(s)" 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci # zram module loaded, new kernel 8062306a36Sopenharmony_ci if [ -d "/sys/class/zram-control" ]; then 8162306a36Sopenharmony_ci echo "zram modules already loaded, kernel supports" \ 8262306a36Sopenharmony_ci "zram-control interface" 8362306a36Sopenharmony_ci dev_start=$(ls /dev/zram* | wc -w) 8462306a36Sopenharmony_ci dev_end=$(($dev_start + $dev_num - 1)) 8562306a36Sopenharmony_ci sys_control=1 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 8862306a36Sopenharmony_ci cat /sys/class/zram-control/hot_add > /dev/null 8962306a36Sopenharmony_ci done 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci echo "all zram devices (/dev/zram$dev_start~$dev_end" \ 9262306a36Sopenharmony_ci "successfully created" 9362306a36Sopenharmony_ci return 0 9462306a36Sopenharmony_ci fi 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci # detect old kernel or built-in 9762306a36Sopenharmony_ci modprobe zram num_devices=$dev_num 9862306a36Sopenharmony_ci if [ ! -d "/sys/class/zram-control" ]; then 9962306a36Sopenharmony_ci if grep -q '^zram' /proc/modules; then 10062306a36Sopenharmony_ci rmmod zram > /dev/null 2>&1 10162306a36Sopenharmony_ci if [ $? -ne 0 ]; then 10262306a36Sopenharmony_ci echo "zram module is being used on old kernel" \ 10362306a36Sopenharmony_ci "without zram-control interface" 10462306a36Sopenharmony_ci exit $ksft_skip 10562306a36Sopenharmony_ci fi 10662306a36Sopenharmony_ci else 10762306a36Sopenharmony_ci echo "test needs CONFIG_ZRAM=m on old kernel without" \ 10862306a36Sopenharmony_ci "zram-control interface" 10962306a36Sopenharmony_ci exit $ksft_skip 11062306a36Sopenharmony_ci fi 11162306a36Sopenharmony_ci modprobe zram num_devices=$dev_num 11262306a36Sopenharmony_ci fi 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci module_load=1 11562306a36Sopenharmony_ci dev_end=$(($dev_num - 1)) 11662306a36Sopenharmony_ci echo "all zram devices (/dev/zram0~$dev_end) successfully created" 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cizram_max_streams() 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci echo "set max_comp_streams to zram device(s)" 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci kernel_gte 4.7 12462306a36Sopenharmony_ci if [ $? -eq 0 ]; then 12562306a36Sopenharmony_ci echo "The device attribute max_comp_streams was"\ 12662306a36Sopenharmony_ci "deprecated in 4.7" 12762306a36Sopenharmony_ci return 0 12862306a36Sopenharmony_ci fi 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci local i=$dev_start 13162306a36Sopenharmony_ci for max_s in $zram_max_streams; do 13262306a36Sopenharmony_ci local sys_path="/sys/block/zram${i}/max_comp_streams" 13362306a36Sopenharmony_ci echo $max_s > $sys_path || \ 13462306a36Sopenharmony_ci echo "FAIL failed to set '$max_s' to $sys_path" 13562306a36Sopenharmony_ci sleep 1 13662306a36Sopenharmony_ci local max_streams=$(cat $sys_path) 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci [ "$max_s" -ne "$max_streams" ] && \ 13962306a36Sopenharmony_ci echo "FAIL can't set max_streams '$max_s', get $max_stream" 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci i=$(($i + 1)) 14262306a36Sopenharmony_ci echo "$sys_path = '$max_streams'" 14362306a36Sopenharmony_ci done 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci echo "zram max streams: OK" 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cizram_compress_alg() 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci echo "test that we can set compression algorithm" 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci local i=$dev_start 15362306a36Sopenharmony_ci local algs=$(cat /sys/block/zram${i}/comp_algorithm) 15462306a36Sopenharmony_ci echo "supported algs: $algs" 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci for alg in $zram_algs; do 15762306a36Sopenharmony_ci local sys_path="/sys/block/zram${i}/comp_algorithm" 15862306a36Sopenharmony_ci echo "$alg" > $sys_path || \ 15962306a36Sopenharmony_ci echo "FAIL can't set '$alg' to $sys_path" 16062306a36Sopenharmony_ci i=$(($i + 1)) 16162306a36Sopenharmony_ci echo "$sys_path = '$alg'" 16262306a36Sopenharmony_ci done 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci echo "zram set compression algorithm: OK" 16562306a36Sopenharmony_ci} 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cizram_set_disksizes() 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci echo "set disk size to zram device(s)" 17062306a36Sopenharmony_ci local i=$dev_start 17162306a36Sopenharmony_ci for ds in $zram_sizes; do 17262306a36Sopenharmony_ci local sys_path="/sys/block/zram${i}/disksize" 17362306a36Sopenharmony_ci echo "$ds" > $sys_path || \ 17462306a36Sopenharmony_ci echo "FAIL can't set '$ds' to $sys_path" 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci i=$(($i + 1)) 17762306a36Sopenharmony_ci echo "$sys_path = '$ds'" 17862306a36Sopenharmony_ci done 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci echo "zram set disksizes: OK" 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cizram_set_memlimit() 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci echo "set memory limit to zram device(s)" 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci local i=$dev_start 18862306a36Sopenharmony_ci for ds in $zram_mem_limits; do 18962306a36Sopenharmony_ci local sys_path="/sys/block/zram${i}/mem_limit" 19062306a36Sopenharmony_ci echo "$ds" > $sys_path || \ 19162306a36Sopenharmony_ci echo "FAIL can't set '$ds' to $sys_path" 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci i=$(($i + 1)) 19462306a36Sopenharmony_ci echo "$sys_path = '$ds'" 19562306a36Sopenharmony_ci done 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci echo "zram set memory limit: OK" 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cizram_makeswap() 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci echo "make swap with zram device(s)" 20362306a36Sopenharmony_ci local i=$dev_start 20462306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 20562306a36Sopenharmony_ci mkswap /dev/zram$i > err.log 2>&1 20662306a36Sopenharmony_ci if [ $? -ne 0 ]; then 20762306a36Sopenharmony_ci cat err.log 20862306a36Sopenharmony_ci echo "FAIL mkswap /dev/zram$1 failed" 20962306a36Sopenharmony_ci fi 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci swapon /dev/zram$i > err.log 2>&1 21262306a36Sopenharmony_ci if [ $? -ne 0 ]; then 21362306a36Sopenharmony_ci cat err.log 21462306a36Sopenharmony_ci echo "FAIL swapon /dev/zram$1 failed" 21562306a36Sopenharmony_ci fi 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci echo "done with /dev/zram$i" 21862306a36Sopenharmony_ci dev_makeswap=$i 21962306a36Sopenharmony_ci done 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci echo "zram making zram mkswap and swapon: OK" 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cizram_swapoff() 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci local i= 22762306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 22862306a36Sopenharmony_ci swapoff /dev/zram$i > err.log 2>&1 22962306a36Sopenharmony_ci if [ $? -ne 0 ]; then 23062306a36Sopenharmony_ci cat err.log 23162306a36Sopenharmony_ci echo "FAIL swapoff /dev/zram$i failed" 23262306a36Sopenharmony_ci fi 23362306a36Sopenharmony_ci done 23462306a36Sopenharmony_ci dev_makeswap=-1 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci echo "zram swapoff: OK" 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cizram_makefs() 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci local i=$dev_start 24262306a36Sopenharmony_ci for fs in $zram_filesystems; do 24362306a36Sopenharmony_ci # if requested fs not supported default it to ext2 24462306a36Sopenharmony_ci which mkfs.$fs > /dev/null 2>&1 || fs=ext2 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci echo "make $fs filesystem on /dev/zram$i" 24762306a36Sopenharmony_ci mkfs.$fs /dev/zram$i > err.log 2>&1 24862306a36Sopenharmony_ci if [ $? -ne 0 ]; then 24962306a36Sopenharmony_ci cat err.log 25062306a36Sopenharmony_ci echo "FAIL failed to make $fs on /dev/zram$i" 25162306a36Sopenharmony_ci fi 25262306a36Sopenharmony_ci i=$(($i + 1)) 25362306a36Sopenharmony_ci echo "zram mkfs.$fs: OK" 25462306a36Sopenharmony_ci done 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cizram_mount() 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci local i=0 26062306a36Sopenharmony_ci for i in $(seq $dev_start $dev_end); do 26162306a36Sopenharmony_ci echo "mount /dev/zram$i" 26262306a36Sopenharmony_ci mkdir zram$i 26362306a36Sopenharmony_ci mount /dev/zram$i zram$i > /dev/null || \ 26462306a36Sopenharmony_ci echo "FAIL mount /dev/zram$i failed" 26562306a36Sopenharmony_ci dev_mounted=$i 26662306a36Sopenharmony_ci done 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci echo "zram mount of zram device(s): OK" 26962306a36Sopenharmony_ci} 270