#!/system/bin/sh
#
# handle zram and swap filesystems
#
# Andrew Sutherland - (20121003)

BB=/system/xbin/busybox
logI="log -p i -t handleswap"
logE="log -p e -t handleswap"

# Do we support swap?
if [ ! -e /proc/swaps ]; then exit; fi

# find SD Card
for MMC_NUM in $(seq 0 9); do
    if [ ! -e /sys/block/mmcblk${MMC_NUM}/device/type ]; then continue; fi
    MMC_TYPE=$($BB cat /sys/block/mmcblk${MMC_NUM}/device/type)
    if [ "$MMC_TYPE" = "SD" ]; then
        SWAP_PART=$($BB fdisk -l /dev/block/mmcblk${MMC_NUM} | $BB awk '/^\// && $5 == 82 {print $1;exit;}')
        break
    fi
done

#
# do zram first so it gets first priority since it should be faster
#

# handle zram
zramprop=$(getprop persist.service.zram)
test $zramprop || zramprop=0
# Hardcode this: I can't think of a scenario where we would want multiple devs
zramblkdev=zram0
# 10% is smallest reasonable size
if [ $zramprop -ge 10 ]; then
    if [ -b /dev/block/${zramblkdev} ]; then
        memtotal=$($BB awk '{ if ($1 eq "MemTotal:") print $2;exit; }' </proc/meminfo)
        # Memtotal is in kB we need to convert that to bytes
        zramsize=$((($(($memtotal * $zramprop)) / 100) * 1024))
        $BB echo $zramsize > /sys/block/${zramblkdev}/disksize
        $BB mkswap /dev/block/${zramblkdev} >/dev/null
        [ $? -ne 0 ] && $logE "Error: mkswap returned $?"
        $BB swapon /dev/block/${zramblkdev} >/dev/null
        [ $? -ne 0 ] && $logE "Error: swapon returned $?"
        $logI "Initialized $(($zramsize / 1024 / 1024))MB of swap (${zramprop}%) on $zramblkdev"
        # This is just a waste of memory if we arent going to use it.
        if [ $($BB sysctl -n vm.swappiness) -lt 60 ]; then
            $BB sysctl -w vm.swappiness=60 >/dev/null
        fi
    else
        $logE "Error: $zramblkdev not found"
    fi
fi

# enable swap
if [ -n "$SWAP_PART" ]; then
    if [ -b $SWAP_PART ]; then
        $BB swapon $SWAP_PART >/dev/null
        [ $? -ne 0 ] && $logE "Error: swapon returned $?"
        swapsize=$($BB fdisk -l $SWAP_PART | $BB awk '/^Disk/ {print $3;exit;}')
        $logI "Initialized ${swapsize}MB of swap on $SWAP_PART"
    else
        $logE "Error: $SWAP_PART not found"
    fi
fi
