]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
TEST-55-OOMD: workaround for kernel regression in 6.12-rcX
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 11 Oct 2024 17:44:22 +0000 (02:44 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 19 Oct 2024 03:34:48 +0000 (12:34 +0900)
This ignore failures when running on kernel-6.12-rcX, which has a
regression in the kernel scheduler that breaks PSI.

From https://github.com/systemd/systemd/issues/32730#issuecomment-2415312260
> There is a known scheduler bug in 6.12 that breaks psi. It leaks
> "running tasks" counts, which matches your symptoms of seeing partial
> pressure only.
>
> Do you see "inconsistent task state" warnings in dmesg | grep psi?
>
> A fix is queued in the scheduler tree, should be sent to Linus shortly:
> https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/commit/?id=c6508124193d42bbc3224571eb75bfa4c1821fbb

Workaround for #32730.

test/units/TEST-55-OOMD.sh

index 10b3777df6d85657bfdeedc1b3772a81223b6bfe..6eb066e57ec425260ba97e63c3d43fa7b2fd72d4 100755 (executable)
@@ -95,6 +95,21 @@ else
     systemd-run -t -p MemoryMax=10M -p MemorySwapMax=0 -p MemoryZSwapMax=0 /bin/true
 fi
 
+check_killed() {
+    local unit="${1:?}"
+    shift
+
+    systemctl "$@" status "$unit" || return 0 # Yay! The service has been expectedly killed.
+
+    # Workaround for the regression in kernel 6.12-rcX, explained in issue #32730.
+    if journalctl --no-hostname -k -t kernel --grep 'psi: inconsistent task state!'; then
+        echo "$unit is unexpectedly still alive, and inconsistency in PSI is reported by the kernel, skipping." >/skipped
+        exit 77
+    fi
+
+    return 1 # Huh? Something borked.
+}
+
 test_basic() {
     local cgroup_path="${1:?}"
     shift
@@ -121,7 +136,7 @@ test_basic() {
     done
 
     # testbloat should be killed and testchill should be fine
-    if systemctl "$@" status TEST-55-OOMD-testbloat.service; then exit 42; fi
+    if ! check_killed TEST-55-OOMD-testbloat.service "$@"; then exit 42; fi
     if ! systemctl "$@" status TEST-55-OOMD-testchill.service; then exit 24; fi
 
     systemctl "$@" kill --signal=KILL TEST-55-OOMD-testbloat.service || :
@@ -172,7 +187,7 @@ EOF
 
     # testmunch should be killed since testbloat had the avoid xattr on it
     if ! systemctl status TEST-55-OOMD-testbloat.service; then exit 25; fi
-    if systemctl status TEST-55-OOMD-testmunch.service; then exit 43; fi
+    if ! check_killed TEST-55-OOMD-testmunch.service; then exit 43; fi
     if ! systemctl status TEST-55-OOMD-testchill.service; then exit 24; fi
 
     systemctl kill --signal=KILL TEST-55-OOMD-testbloat.service || :
@@ -248,7 +263,7 @@ EOF
         sleep 2
     done
 
-    if systemctl status TEST-55-OOMD-testmunch.service; then exit 44; fi
+    if ! check_killed TEST-55-OOMD-testmunch.service; then exit 44; fi
     if ! systemctl status TEST-55-OOMD-testchill.service; then exit 23; fi
 
     systemctl kill --signal=KILL TEST-55-OOMD-testmunch.service || :