test: switch TEST-55-OOMD stress-ng --vm-method to lfsr32
Commit881e4717c7("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 for881e4717c7Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+3
-4
@@ -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
|
||||
|
||||
+3
-4
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user