main/postmarketos-zram: override vm.min_free_kbytes if >= 1GB RAM

Without a sufficient vm.min_free_kbytes value, the kernel may not start
reclaiming memory early enough to make use of zram swap before the
kernel OOM killer fires. Set a minimum of 100000 KB on devices with >=
1GB of RAM where the kernel's calculated value is lower.

This ignores devices with <1GB of RAM, because I think with so little
RAM isn't unlikely to really matter and if we set this too high then we
risk insta-OOMs.

Signed-off-by: Clayton Craft <craftyguy@postmarketos.org>
Part-of: <https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/8157>
This commit is contained in:
Clayton Craft 2026-03-11 23:56:44 -07:00 committed by The Friendly Meow (merge) Bot
parent b383547b54
commit 0f0b8ceaa2
No known key found for this signature in database
2 changed files with 23 additions and 3 deletions

View file

@ -1,6 +1,6 @@
maintainer="Clayton Craft <clayton@craftyguy.net>"
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
"

View file

@ -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"