From 70fa66f6152d790aefb3af8f88ddbb197511bafa Mon Sep 17 00:00:00 2001
From: j1nx
Date: Mon, 1 Mar 2021 21:58:30 +0100
Subject: [PATCH] Add and configure 20% of memory as zram swap with a low
agressive swappiness
---
.../board/raspberrypi/kernel.config | 3 +
.../configs/rpi4_64-gui_defconfig | 1 +
.../rootfs-overlay/etc/sysctl.conf | 1 +
.../usr/lib/systemd/system/dev-zram0.swap | 10 +++
.../usr/lib/systemd/system/ovos-zram.target | 6 ++
.../usr/lib/systemd/system/zram-swap.service | 15 +++++
.../rootfs-overlay/usr/libexec/ovos-zram | 66 +++++++++++++++++++
7 files changed, 102 insertions(+)
create mode 100644 buildroot-external/rootfs-overlay/etc/sysctl.conf
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service
create mode 100755 buildroot-external/rootfs-overlay/usr/libexec/ovos-zram
diff --git a/buildroot-external/board/raspberrypi/kernel.config b/buildroot-external/board/raspberrypi/kernel.config
index ec70df16..2aaf5bd4 100644
--- a/buildroot-external/board/raspberrypi/kernel.config
+++ b/buildroot-external/board/raspberrypi/kernel.config
@@ -1,3 +1,6 @@
CONFIG_SND_SOC_WM8960=m
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+
+CONFIG_ZRAM=y
+CONFIG_ZSMALLOC=y
diff --git a/buildroot-external/configs/rpi4_64-gui_defconfig b/buildroot-external/configs/rpi4_64-gui_defconfig
index 9b7fe978..6c52e03a 100644
--- a/buildroot-external/configs/rpi4_64-gui_defconfig
+++ b/buildroot-external/configs/rpi4_64-gui_defconfig
@@ -465,6 +465,7 @@ BR2_PACKAGE_UTIL_LINUX_BINARIES=y
BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
BR2_PACKAGE_UTIL_LINUX_KILL=y
BR2_PACKAGE_UTIL_LINUX_MORE=y
+BR2_PACKAGE_UTIL_LINUX_ZRAMCTL=y
BR2_PACKAGE_NANO=y
BR2_PACKAGE_VIM=y
# BR2_PACKAGE_VIM_RUNTIME is not set
diff --git a/buildroot-external/rootfs-overlay/etc/sysctl.conf b/buildroot-external/rootfs-overlay/etc/sysctl.conf
new file mode 100644
index 00000000..e0b01f0d
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/sysctl.conf
@@ -0,0 +1 @@
+vm.swappiness = 20
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap
new file mode 100644
index 00000000..a37c9248
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap
@@ -0,0 +1,10 @@
+[Unit]
+Description=OVOS ZRAM swap
+Requires=zram-swap.service
+After=zram-swap.service
+
+[Swap]
+What=/dev/zram0
+
+[Install]
+WantedBy=swap.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target
new file mode 100644
index 00000000..10e8e323
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target
@@ -0,0 +1,6 @@
+[Unit]
+Description=OVOS zram targets
+Documentation=man:systemd.target(5)
+
+[Install]
+WantedBy=multi-user.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service
new file mode 100644
index 00000000..81532d1c
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OVOS ZRAM swap
+DefaultDependencies=no
+Before=dev-zram0.swap
+RefuseManualStart=true
+RefuseManualStop=true
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/ovos-zram -t swap
+RemainAfterExit=true
+StandardOutput=null
+
+[Install]
+WantedBy=ovos-zram.target
diff --git a/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram b/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram
new file mode 100755
index 00000000..e6d065be
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram
@@ -0,0 +1,66 @@
+#!/bin/sh
+# Credits go to: https://github.com/home-assistant/operating-system/
+set -e
+
+#### Options ####
+
+TYPE=""
+MOUNT=""
+DEVICE=""
+SIZE=0
+
+#### Parse arguments ####
+
+while [ "$1" != "" ]; do
+ key=$1
+ case $key in
+ -t|--type)
+ TYPE=$2
+ shift
+ ;;
+ -s|--size)
+ SIZE=$2
+ shift
+ ;;
+ -m|--mount)
+ MOUNT=$2
+ shift
+ ;;
+ *)
+ echo "[Error] $0 : Argument '$1' unknown"
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+# Valide Type
+if [ "$TYPE" != "swap" ]; then
+ echo "[Error] Type unknown!"
+ exit 1
+fi
+
+# Lookup device
+if [ "$TYPE" = "swap" ]; then
+ DEVICE="/dev/zram0"
+#elif [ "$MOUNT" = "var" ]; then
+# DEVICE="/dev/zram1"
+#elif [ "$MOUNT" = "tmp" ]; then
+# DEVICE="/dev/zram2"
+else
+ echo "[Error] No device for lookup!"
+ exit 1
+fi
+
+# Calc 20% of memory for ZRAM swap partition
+if [ "$TYPE" = "swap" ] && [ "$SIZE" -eq "0" ]; then
+ SIZE="$(awk '/MemTotal/{ print $2 * 0.20 }' /proc/meminfo)K"
+fi
+
+# Init device
+zramctl "$DEVICE" -s "$SIZE" -a lz4
+
+# Swap
+if [ "$TYPE" = "swap" ]; then
+ mkswap -L "ovos-zramswap" "$DEVICE"
+fi