]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: switch TEST-55-OOMD stress-ng --vm-method to lfsr32 42185/head
authorLuca Boccassi <luca.boccassi@gmail.com>
Tue, 19 May 2026 21:42:25 +0000 (22:42 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 19 May 2026 21:53:59 +0000 (22:53 +0100)
Commit 881e4717c7 ("test: pin stress-ng --vm-method to a portable
scalar method in TEST-55-OOMD") pinned --vm-method=zero-one with the
rationale that it is "a long-standing scalar method". That rationale is
wrong: stress_vm_zero_one() in stress-ng's stress-vm.c is declared

    static size_t TARGET_CLONES stress_vm_zero_one(...)

i.e. it carries the exact same TARGET_CLONES attribute as 33 of the 35
other vm methods. On x86_64 with GCC >=5, TARGET_CLONES expands (see
core-target-clones.h in stress-ng) to a target_clones attribute
including "arch=skylake-avx512", "arch=cooperlake", "arch=tigerlake",
"arch=sapphirerapids", and several other AVX-512-bearing arch variants,
plus "default". GCC generates AVX-512 clones of stress_vm_zero_one() and
the IFUNC resolver picks them on any CPU that advertises AVX-512.

The only vm methods in stress-ng's registry whose function definitions
omit TARGET_CLONES entirely (and are therefore guaranteed not to
dispatch to an AVX-512 clone) are lfsr32 (portable, always registered)
and write64ds (x86_64-only, gated on HAVE_ASM_X86_MOVDIRI, i.e. Intel
Tremont / Tiger Lake+ MOVDIRI instruction).

Switch the four stress-ng --vm invocations in TEST-55-OOMD to
--vm-method=lfsr32 so the AVX-512 SIGILL on CPUs without AVX-512 (e.g.
AMD Zen 1-3) can no longer occur regardless of compiler version,
optimization level, or stress-ng package build.

Follow-up for 881e4717c7981b274853309e68b39153e3b292f4

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
test/integration-tests/TEST-55-OOMD/TEST-55-OOMD.units/TEST-55-OOMD-testbloat.service
test/integration-tests/TEST-55-OOMD/TEST-55-OOMD.units/TEST-55-OOMD-testmunch.service
test/units/TEST-55-OOMD.sh

index 22bbd210e96f5d378751095ab4eb1d5cb34d7de0..e4109fd60ddf9720f59950a8e81cb5690e56318f 100644 (file)
@@ -7,7 +7,6 @@ Description=Create a lot of memory pressure
 # to throttle and be put under heavy pressure.
 MemoryHigh=3M
 Slice=TEST-55-OOMD-workload.slice
-# Pin --vm-method to a portable method (zero-one): the default 'all' cycles
-# through methods, including newer ones using AVX-512 instructions that SIGILL
-# on CPUs without AVX-512 (e.g. AMD Zen 1-3), making the test flaky.
-ExecStart=stress-ng --timeout 3m --vm 10 --vm-bytes 200M --vm-keep --vm-method=zero-one
+# Pin --vm-method=lfsr32: the only stress-ng vm method without TARGET_CLONES,
+# so it can't dispatch to an AVX-512 clone and SIGILL on CPUs lacking it.
+ExecStart=stress-ng --timeout 3m --vm 10 --vm-bytes 200M --vm-keep --vm-method=lfsr32
index 06eea10b79a55e6be3d1f9c36520d5c938fc611d..81305c7e974dd59e9cddbf17a08e6e510371f62f 100644 (file)
@@ -5,7 +5,6 @@ Description=Create some memory pressure
 [Service]
 MemoryHigh=12M
 Slice=TEST-55-OOMD-workload.slice
-# Pin --vm-method to a portable method (zero-one): the default 'all' cycles
-# through methods, including newer ones using AVX-512 instructions that SIGILL
-# on CPUs without AVX-512 (e.g. AMD Zen 1-3), making the test flaky.
-ExecStart=stress-ng --timeout 3m --vm 10 --vm-bytes 200M --vm-keep --vm-method=zero-one
+# Pin --vm-method=lfsr32: the only stress-ng vm method without TARGET_CLONES,
+# so it can't dispatch to an AVX-512 clone and SIGILL on CPUs lacking it.
+ExecStart=stress-ng --timeout 3m --vm 10 --vm-bytes 200M --vm-keep --vm-method=lfsr32
index b7311e83dca4eb3155e89a69df1803b9f73d40af..84baee12a42942dcc82866b8364df7f7f66a414c 100755 (executable)
@@ -366,13 +366,12 @@ EOF
     systemctl reload systemd-oomd.service
 
     # Run a transient service with OOMRules=testrule that generates memory pressure.
-    # Pin --vm-method to a portable method (zero-one): the default 'all' cycles
-    # through every method, including newer ones using AVX-512 instructions that
-    # SIGILL on CPUs without AVX-512 (e.g. AMD Zen 1-3), making the test flaky.
+    # Pin --vm-method=lfsr32: the only stress-ng vm method without TARGET_CLONES,
+    # so it can't dispatch to an AVX-512 clone and SIGILL on CPUs lacking it.
     (! systemd-run --wait --unit=TEST-55-OOMD-testrules \
         -p MemoryHigh=3M \
         -p OOMRules=testrule \
-        stress-ng --timeout 3m --vm 10 --vm-bytes 50M --vm-keep --vm-method=zero-one)
+        stress-ng --timeout 3m --vm 10 --vm-bytes 50M --vm-keep --vm-method=lfsr32)
 
     # Verify in the journal that the rule triggered
     journalctl --sync
@@ -457,14 +456,12 @@ EOF
 
     # Start the unit without --wait so we can check mid-run state. The
     # stress-ng timeout bounds the test if anything goes wrong.
-    # Pin --vm-method to a portable method (zero-one): the default 'all' cycles
-    # through every method, including newer ones using AVX-512 instructions that
-    # SIGILL on CPUs without AVX-512 (e.g. AMD Zen 1-3) and would cause stress-ng
-    # to exit before the 6 s wait below elapses, failing the ActiveState check.
+    # Pin --vm-method=lfsr32: the only stress-ng vm method without TARGET_CLONES,
+    # so it can't SIGILL on AVX-512-less CPUs and exit before the 6 s wait below.
     systemd-run --unit=TEST-55-OOMD-slowrule \
         -p MemoryHigh=3M \
         -p OOMRules=slowrule \
-        stress-ng --timeout 15s --vm 10 --vm-bytes 50M --vm-keep --vm-method=zero-one
+        stress-ng --timeout 15s --vm 10 --vm-bytes 50M --vm-keep --vm-method=lfsr32
 
     # Wait long enough for oomd's 1s rule-check loop to evaluate the condition
     # many times. With LastingSec=1h the kill must not fire.