diff --git a/main/postmarketos-zram/APKBUILD b/main/postmarketos-zram/APKBUILD index 9e8457feb..d70ca11a3 100644 --- a/main/postmarketos-zram/APKBUILD +++ b/main/postmarketos-zram/APKBUILD @@ -1,6 +1,6 @@ maintainer="Clayton Craft " pkgname=postmarketos-zram -pkgver=2 +pkgver=3 pkgrel=0 pkgdesc="zram swap configuration for postmarketOS" url="https://postmarketos.org" @@ -27,6 +27,6 @@ package() { sha512sums=" ca91be78a47c00f40f3e645f79a72b2cd7ba3f080e2feb256998bb121f64c0394041f2ed822ad307ac36e86398b8175b3284dc5097a7017947e520a304b0a37d postmarketos-zram-swap.initd 5c1787bc2d597726113aaf3ea59229b5a56b8fc3446c78406a202e163a0b37ac564a87b2acc1c1f1a7dcdc18ff863c45e13aa687b93fa537c5ef000b9e8d6d19 postmarketos-zram-swap.service -cc8ae3a0a26aeac7015c5b66c08d76f7d7d4479f20b0876dc14368d6f4ff57a0132bac1f673c194d1b3e1df23660161486123f9691ee4d078a06f328d7246417 zramstart +b08a59a624e4b56f2f88987ce4e246b86effea31bb9a3f8d1581c1bf3444bc0f9ed96a17bf64b5942bd9cc1eca5ab8a295f8220d86d52ed6ac95f9362ba587ac zramstart a70d2bcb26c1af42a71811a1c1cd2984808f5ce09d7af52b26824cf5c15c8a9c819691fc6290cf3028226fca39f6e7a495546c5573c582a14d5a8c7c65dbfe3e zramstop " diff --git a/main/postmarketos-zram/zramstart b/main/postmarketos-zram/zramstart index 34a15e80f..529c21ec8 100644 --- a/main/postmarketos-zram/zramstart +++ b/main/postmarketos-zram/zramstart @@ -6,6 +6,10 @@ set -e # shellcheck disable=SC1091 . /usr/share/misc/source_deviceinfo +get_mem_size_mb() { + LC_ALL=C free -m | awk '/^Mem:/{print $2}' +} + get_size() { # Size defaults to: # - 150% of RAM for devices with less than 32GB of RAM @@ -14,7 +18,7 @@ get_size() { # https://gitlab.postmarketos.org/postmarketOS/pmaports/-/issues/4250 local mem_size_mb size_pct - mem_size_mb="$(LC_ALL=C free -m | awk '/^Mem:/{print $2}')" + mem_size_mb="$(get_mem_size_mb)" if [ "$mem_size_mb" -le 32768 ]; then size_pct=150 @@ -45,6 +49,21 @@ get_algo() { echo "${deviceinfo_zram_swap_algo:-zstd}" } +set_min_free_kbytes() { + local mem_size_mb current + # Set vm.min_free_kbytes to 100000 KB if the kernel's current value + # is lower. This ensures the kernel starts reclaiming memory early + # enough to make use of zram swap before the kernel OOM killer fires. + # This is only applied on devices with >= 1GB of RAM. + mem_size_mb="$(get_mem_size_mb)" + [ "$mem_size_mb" -lt 1024 ] && return + + current="$(cat /proc/sys/vm/min_free_kbytes)" + [ "$current" -ge 100000 ] && return + + sysctl -w vm.min_free_kbytes=100000 >/dev/null +} + size=$(get_size) algo=$(get_algo) @@ -64,5 +83,6 @@ swapon "$dev" >/dev/null sysctl -w \ vm.page-cluster=0 \ vm.swappiness=180 >/dev/null +set_min_free_kbytes echo "ZRAM swap device $dev activated using $algo and size $size MB"