#!/bin/bash

loop=1000
zram_control="/sys/class/zram-control/"
zram_size=$((20<<20))
zram_devs=0
max_dev=25

create_zram() {
	local max_dev=$1
	for (( i=0; i < $max_dev; i++))
	do
		zram_id=`cat $zram_control/zram_add`
		if [ $? -lt 0 ]
		then
			echo "failed to create zram" $?
			exit 1
		fi


		echo "new zram_id " $zram_id
		echo $zram_size > /sys/block/zram$zram_id/disksize
		zram_devs[$i]=$zram_id
	done
}

destroy_zram() {
	local max_dev=$1
	local loop_exit=0
	while [ $loop_exit -ne 1 ]
	do
		loop_exit=1
		for (( i=0; i<$max_dev; i++ ))
		do
			local zram_id=${zram_devs[$i]}
			if [ $zram_id -eq -1 ]
			then
				continue
			fi

			echo "zram_id " $zram_id
			echo $zram_id > "$zram_control/zram_remove"
			if [ $? -eq 0 ]
			then
				echo "removed zram_id " $zram_id
				zram_devs[$i]=-1
			fi
		done

		for (( i=0; i<$max_dev; i++ ))
		do
			if [ ${zram_devs[$i]} -ne -1 ]
			then
				# there is some zram_dev returned EBUSY so retry
				printf "zram[%d] is busy\n" "${zram_devs[$i]}"
				loop_exit=0
			fi
		done
	done
}

do_work() {
	local max_dev=$1
	
	for (( i=0; i<$max_dev; i++ ))
	do
		zram_id=${zram_devs[$i]}
		if [ $zram_id -ne -1 ]
		then
			dd if=/dev/zero of=/dev/zram$zram_id bs=10M count=1 &
		fi
	done
}

i=0
while [ $i -lt $loop ]
do
	printf "====== iteration %d\n" $loop
	create_zram $max_dev
	do_work $max_dev
	destroy_zram $max_dev
	i=$((i + 1))
done
