Sorry for responding to myself, but some self-criticism is needed.
On Tuesday, 4 November 2025 17:42:19 CET Janusz Krzysztofik wrote:
> Dynamic sub-subtests of smem-oom subtest spawn smem memory hog helper
> processes which are expected to be killed by OOM killer. When that
> happens, a default IGT signal helper inherited from its parent process is
> now executed inside the helper process. That leads to a dynamic sub-
> subtest CRASH result message sent to stdout, followed by a parent subtest
> SUCCESS result message. Meanwhile, processing of the dynamic sub-subtest
> that spawned that helper still continues, and then another set of result
> messages is submitted on its completion. As a consequence, ambiguous
> results from that dynamic sub-subtests and its parent subtest are detected
> and reported by igt_runner, even if an error code returned by the helper
> is ignored.
>
> Shut those redundant messages up by installing a custom signal handler
> that just exists the helper process when killed by the OOM killer, without
> reporting any IGT results or executing any IGT exit handlers.
>
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5493
> Signed-off-by: Janusz Krzysztofik <[email protected]>
> ---
> tests/intel/gem_lmem_swapping.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/tests/intel/gem_lmem_swapping.c b/tests/intel/gem_lmem_swapping.c
> index 8e0dac42d8..5e11092c04 100644
> --- a/tests/intel/gem_lmem_swapping.c
> +++ b/tests/intel/gem_lmem_swapping.c
> @@ -668,6 +668,11 @@ static void smem_oom_exit_handler(int sig)
> (*lmem_done)++;
> }
>
> +static void smem_oom_helper_sig_handler(int sig)
> +{
> + _exit(0);
> +}
> +
> static void test_smem_oom(int i915,
> const intel_ctx_t *ctx,
> struct drm_i915_memory_region_info *region)
> @@ -706,6 +711,8 @@ static void test_smem_oom(int i915,
> while (!READ_ONCE(*lmem_done)) {
> igt_fork_helper(&smem_proc) {
> igt_fork(child, 1) {
> + signal(SIGBUS, smem_oom_helper_sig_handler);
> +
> for (int pass = 0; pass < num_alloc; pass++) {
> if (READ_ONCE(*lmem_done))
> break;
> @@ -715,6 +722,8 @@ static void test_smem_oom(int i915,
> igt_fork(child, 1) {
> int fd = drm_reopen_driver(i915);
>
> + signal(SIGBUS, smem_oom_helper_sig_handler);
While this patch looked to me like resolving the issue when I test tested it,
SIGBUS is not a direct indication of a process being killed by OOM killer.
More deep analysis is needed. Please forget this patch.
Thanks,
Janusz
> +
> for (int pass = 0; pass < num_alloc; pass++) {
> if (READ_ONCE(*lmem_done))
> break;
>