1f08c3bdfSopenharmony_ci#!/bin/sh 2f08c3bdfSopenharmony_ci# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved. 3f08c3bdfSopenharmony_ci# Copyright (c) 2019-2022 Petr Vorel <pvorel@suse.cz> 4f08c3bdfSopenharmony_ci# Author: Alexey Kodanev <alexey.kodanev@oracle.com> 5f08c3bdfSopenharmony_ci# 6f08c3bdfSopenharmony_ci# Test creates several zram devices with different filesystems on them. 7f08c3bdfSopenharmony_ci# It fills each device with zeros and checks that compression works. 8f08c3bdfSopenharmony_ci 9f08c3bdfSopenharmony_ciTST_CNT=7 10f08c3bdfSopenharmony_ciTST_TESTFUNC="do_test" 11f08c3bdfSopenharmony_ciTST_NEEDS_CMDS="awk bc dd" 12f08c3bdfSopenharmony_ciTST_SETUP="setup" 13f08c3bdfSopenharmony_ci 14f08c3bdfSopenharmony_cicheck_space_for_fs() 15f08c3bdfSopenharmony_ci{ 16f08c3bdfSopenharmony_ci local fs="$1" 17f08c3bdfSopenharmony_ci local ram_size 18f08c3bdfSopenharmony_ci 19f08c3bdfSopenharmony_ci ram_size=$(awk '/MemTotal:/ {print $2}' /proc/meminfo) 20f08c3bdfSopenharmony_ci if [ "$ram_size" -lt 1048576 ]; then 21f08c3bdfSopenharmony_ci tst_res TINFO "not enough space for $fs" 22f08c3bdfSopenharmony_ci return 1 23f08c3bdfSopenharmony_ci fi 24f08c3bdfSopenharmony_ci return 0 25f08c3bdfSopenharmony_ci} 26f08c3bdfSopenharmony_ci 27f08c3bdfSopenharmony_ci# List of parameters for zram devices. 28f08c3bdfSopenharmony_ci# For each number the test creates own zram device. 29f08c3bdfSopenharmony_ci# NOTE about size: 30f08c3bdfSopenharmony_ci# The zram sysfs node 'disksize' value can be either in bytes, 31f08c3bdfSopenharmony_ci# or you can use mem suffixes. But in some old kernels, mem 32f08c3bdfSopenharmony_ci# suffixes are not supported, for example, in RHEL6.6GA's kernel 33f08c3bdfSopenharmony_ci# layer, it uses strict_strtoull() to parse disksize which does 34f08c3bdfSopenharmony_ci# not support mem suffixes, in some newer kernels, they use 35f08c3bdfSopenharmony_ci# memparse() which supports mem suffixes. So here we just use 36f08c3bdfSopenharmony_ci# bytes to make sure everything works correctly. 37f08c3bdfSopenharmony_ciinitialize_vars() 38f08c3bdfSopenharmony_ci{ 39f08c3bdfSopenharmony_ci local fs limit size stream=-1 40f08c3bdfSopenharmony_ci dev_num=0 41f08c3bdfSopenharmony_ci 42f08c3bdfSopenharmony_ci for fs in $(tst_supported_fs -s tmpfs); do 43f08c3bdfSopenharmony_ci size="26214400" 44f08c3bdfSopenharmony_ci limit="25M" 45f08c3bdfSopenharmony_ci 46f08c3bdfSopenharmony_ci if [ "$fs" = "btrfs" -o "$fs" = "xfs" ]; then 47f08c3bdfSopenharmony_ci check_space_for_fs "$fs" || continue 48f08c3bdfSopenharmony_ci 49f08c3bdfSopenharmony_ci if [ "$fs" = "btrfs" ]; then 50f08c3bdfSopenharmony_ci size="402653184" 51f08c3bdfSopenharmony_ci elif [ "$fs" = "xfs" ]; then 52f08c3bdfSopenharmony_ci size=314572800 53f08c3bdfSopenharmony_ci fi 54f08c3bdfSopenharmony_ci limit="$((size/1024/1024))M" 55f08c3bdfSopenharmony_ci fi 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_ci stream=$((stream+3)) 58f08c3bdfSopenharmony_ci dev_num=$((dev_num+1)) 59f08c3bdfSopenharmony_ci zram_filesystems="$zram_filesystems $fs" 60f08c3bdfSopenharmony_ci zram_mem_limits="$zram_mem_limits $limit" 61f08c3bdfSopenharmony_ci zram_sizes="$zram_sizes $size" 62f08c3bdfSopenharmony_ci zram_max_streams="$zram_max_streams $stream" 63f08c3bdfSopenharmony_ci done 64f08c3bdfSopenharmony_ci 65f08c3bdfSopenharmony_ci [ $dev_num -eq 0 ] && \ 66f08c3bdfSopenharmony_ci tst_brk TCONF "no suitable filesystem" 67f08c3bdfSopenharmony_ci} 68f08c3bdfSopenharmony_ci 69f08c3bdfSopenharmony_cisetup() 70f08c3bdfSopenharmony_ci{ 71f08c3bdfSopenharmony_ci initialize_vars 72f08c3bdfSopenharmony_ci zram_load 73f08c3bdfSopenharmony_ci} 74f08c3bdfSopenharmony_ci 75f08c3bdfSopenharmony_cizram_makefs() 76f08c3bdfSopenharmony_ci{ 77f08c3bdfSopenharmony_ci local i=$dev_start 78f08c3bdfSopenharmony_ci local fs 79f08c3bdfSopenharmony_ci 80f08c3bdfSopenharmony_ci for fs in $zram_filesystems; do 81f08c3bdfSopenharmony_ci tst_res TINFO "make $fs filesystem on /dev/zram$i" 82f08c3bdfSopenharmony_ci mkfs.$fs /dev/zram$i > err.log 2>&1 83f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 84f08c3bdfSopenharmony_ci cat err.log 85f08c3bdfSopenharmony_ci tst_brk TFAIL "failed to make $fs on /dev/zram$i" 86f08c3bdfSopenharmony_ci fi 87f08c3bdfSopenharmony_ci 88f08c3bdfSopenharmony_ci i=$(($i + 1)) 89f08c3bdfSopenharmony_ci done 90f08c3bdfSopenharmony_ci 91f08c3bdfSopenharmony_ci tst_res TPASS "zram_makefs succeeded" 92f08c3bdfSopenharmony_ci} 93f08c3bdfSopenharmony_ci 94f08c3bdfSopenharmony_cizram_mount() 95f08c3bdfSopenharmony_ci{ 96f08c3bdfSopenharmony_ci local i 97f08c3bdfSopenharmony_ci 98f08c3bdfSopenharmony_ci for i in $(seq $dev_start $dev_end); do 99f08c3bdfSopenharmony_ci tst_res TINFO "mount /dev/zram$i" 100f08c3bdfSopenharmony_ci mkdir zram$i 101f08c3bdfSopenharmony_ci ROD mount /dev/zram$i zram$i 102f08c3bdfSopenharmony_ci dev_mounted=$i 103f08c3bdfSopenharmony_ci done 104f08c3bdfSopenharmony_ci 105f08c3bdfSopenharmony_ci tst_res TPASS "mount of zram device(s) succeeded" 106f08c3bdfSopenharmony_ci} 107f08c3bdfSopenharmony_ci 108f08c3bdfSopenharmony_ciread_mem_used_total() 109f08c3bdfSopenharmony_ci{ 110f08c3bdfSopenharmony_ci echo $(awk '{print $3}' $1) 111f08c3bdfSopenharmony_ci} 112f08c3bdfSopenharmony_ci 113f08c3bdfSopenharmony_ci# Reads /sys/block/zram*/mm_stat until mem_used_total is not 0. 114f08c3bdfSopenharmony_cicheck_read_mem_used_total() 115f08c3bdfSopenharmony_ci{ 116f08c3bdfSopenharmony_ci local file="$1" 117f08c3bdfSopenharmony_ci local mem_used_total 118f08c3bdfSopenharmony_ci 119f08c3bdfSopenharmony_ci tst_res TINFO "$file" 120f08c3bdfSopenharmony_ci cat $file >&2 121f08c3bdfSopenharmony_ci 122f08c3bdfSopenharmony_ci mem_used_total=$(read_mem_used_total $file) 123f08c3bdfSopenharmony_ci [ "$mem_used_total" -eq 0 ] && return 1 124f08c3bdfSopenharmony_ci 125f08c3bdfSopenharmony_ci return 0 126f08c3bdfSopenharmony_ci} 127f08c3bdfSopenharmony_ci 128f08c3bdfSopenharmony_cizram_fill_fs() 129f08c3bdfSopenharmony_ci{ 130f08c3bdfSopenharmony_ci local mem_used_total 131f08c3bdfSopenharmony_ci local b i r v 132f08c3bdfSopenharmony_ci 133f08c3bdfSopenharmony_ci for i in $(seq $dev_start $dev_end); do 134f08c3bdfSopenharmony_ci tst_res TINFO "filling zram$i (it can take long time)" 135f08c3bdfSopenharmony_ci b=0 136f08c3bdfSopenharmony_ci while true; do 137f08c3bdfSopenharmony_ci dd conv=notrunc if=/dev/zero of=zram${i}/file \ 138f08c3bdfSopenharmony_ci oflag=append count=1 bs=1024 status=none \ 139f08c3bdfSopenharmony_ci >/dev/null 2>err.txt || break 140f08c3bdfSopenharmony_ci b=$(($b + 1)) 141f08c3bdfSopenharmony_ci done 142f08c3bdfSopenharmony_ci if [ $b -eq 0 ]; then 143f08c3bdfSopenharmony_ci [ -s err.txt ] && tst_res TWARN "dd error: $(cat err.txt)" 144f08c3bdfSopenharmony_ci tst_brk TBROK "cannot fill zram $i" 145f08c3bdfSopenharmony_ci fi 146f08c3bdfSopenharmony_ci tst_res TPASS "zram$i was filled with '$b' KB" 147f08c3bdfSopenharmony_ci 148f08c3bdfSopenharmony_ci if [ ! -f "/sys/block/zram$i/mm_stat" ]; then 149f08c3bdfSopenharmony_ci if [ $i -eq 0 ]; then 150f08c3bdfSopenharmony_ci tst_res TCONF "zram compression ratio test requires zram mm_stat sysfs file" 151f08c3bdfSopenharmony_ci fi 152f08c3bdfSopenharmony_ci 153f08c3bdfSopenharmony_ci continue 154f08c3bdfSopenharmony_ci fi 155f08c3bdfSopenharmony_ci 156f08c3bdfSopenharmony_ci TST_RETRY_FUNC "check_read_mem_used_total /sys/block/zram$i/mm_stat" 0 157f08c3bdfSopenharmony_ci mem_used_total=$(read_mem_used_total /sys/block/zram$i/mm_stat) 158f08c3bdfSopenharmony_ci tst_res TINFO "mem_used_total: $mem_used_total" 159f08c3bdfSopenharmony_ci 160f08c3bdfSopenharmony_ci v=$((100 * 1024 * $b / $mem_used_total)) 161f08c3bdfSopenharmony_ci r=$(echo "scale=2; $v / 100 " | bc) 162f08c3bdfSopenharmony_ci 163f08c3bdfSopenharmony_ci if [ "$v" -lt 100 ]; then 164f08c3bdfSopenharmony_ci tst_res TFAIL "compression ratio: $r:1" 165f08c3bdfSopenharmony_ci break 166f08c3bdfSopenharmony_ci fi 167f08c3bdfSopenharmony_ci 168f08c3bdfSopenharmony_ci tst_res TPASS "compression ratio: $r:1" 169f08c3bdfSopenharmony_ci done 170f08c3bdfSopenharmony_ci} 171f08c3bdfSopenharmony_ci 172f08c3bdfSopenharmony_cido_test() 173f08c3bdfSopenharmony_ci{ 174f08c3bdfSopenharmony_ci case $1 in 175f08c3bdfSopenharmony_ci 1) zram_max_streams;; 176f08c3bdfSopenharmony_ci 2) zram_compress_alg;; 177f08c3bdfSopenharmony_ci 3) zram_set_disksizes;; 178f08c3bdfSopenharmony_ci 4) zram_set_memlimit;; 179f08c3bdfSopenharmony_ci 5) zram_makefs;; 180f08c3bdfSopenharmony_ci 6) zram_mount;; 181f08c3bdfSopenharmony_ci 7) zram_fill_fs;; 182f08c3bdfSopenharmony_ci esac 183f08c3bdfSopenharmony_ci} 184f08c3bdfSopenharmony_ci 185f08c3bdfSopenharmony_ci. zram_lib.sh 186f08c3bdfSopenharmony_citst_run 187