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