#!/bin/bash
# memory-optimisation script for workstation-class systems

function status {
    echo "MGLRU Enabled:  "`cat /sys/kernel/mm/lru_gen/enabled | sed 's/0x0007/Yes/'`
    echo "Zswap Enabled:  "`cat /sys/module/zswap/parameters/enabled | sed 's/Y/Yes/'`
    echo "VM Configured:  "`cat /proc/sys/vm/swappiness | sed 's/180/Yes/'`
}

function start {
    # Enable MGLRU
    echo 7 > /sys/kernel/mm/lru_gen/enabled
    echo 1000 > /sys/kernel/mm/lru_gen/min_ttl_ms
    
    # Enable zswap
    echo 1 > /sys/module/zswap/parameters/enabled
    [ -f "/sys/module/zswap/parameters/zpool" ] && echo zsmalloc > /sys/module/zswap/parameters/zpool
    echo lz4 > /sys/module/zswap/parameters/compressor
    echo 90 > /sys/module/zswap/parameters/accept_threshold_percent
    echo 13 > /sys/module/zswap/parameters/max_pool_percent
    echo 1 > /sys/module/zswap/parameters/shrinker_enabled
    
    # Configure VM accordingly (via Pop!OS)
    /usr/sbin/sysctl -q vm.swappiness=180
    /usr/sbin/sysctl -q vm.page-cluster=0
    /usr/sbin/sysctl -q vm.watermark_boost_factor=0
    /usr/sbin/sysctl -q vm.watermark_scale_factor=125

    status

    true
}

function stop {
    # Disable MGLRU
    echo 0 > /sys/kernel/mm/lru_gen/enabled

    # Disable zswap
    echo 0 > /sys/module/zswap/parameters/enabled

    # Configure VM accordingly
    /usr/sbin/sysctl -q vm.swappiness=60

    status

    true
}

function usage {
    echo "ERROR!"
    echo "Invalid arguments. Usage:"
    echo ""
    echo "memory-optimisation start|status|stop"
    
    status

    false
}



if [[ "$*" == "start" ]]; then start
elif [[ "$*" == "stop" ]]; then stop
elif [[ "$*" == "status" ]]; then status
else usage; fi
