Hi Kamil, Thanks for review.
On Friday, 16 January 2026 17:24:53 CET Kamil Konieczny wrote: > Hi Janusz, > On 2026-01-16 at 14:15:06 +0100, Janusz Krzysztofik wrote: > > The smem-oom subtest can expectedly result in oom-killer being triggered, > > which then dumps a call trace from a process that triggered it. If that > > happens to be a process that executes drm or i915 functions then the call > > trace dump contains lines recognized by igt_runner running in piglit mode > > as potential warnings. If severity of the call trace dump messages is > > NOTICE or higher, which isn't unlikely, then a dmesg-warn result is > > reported despite successful completion of the subtest. > > > > Fortunately, severity of those call trace dump messages depends on kernel > > default log level which can be controlled from user space over sysctl. > > > > To avoid false failure reports, relax kernel default log level to INFO so > > those log lines are ignored by igt_runner in piglit mode at an expense of > > call traces from real issues potentially detected by the subtest not > > contributing to the igt_runner reported result. Since those call traces > > are still available to developers, only submitted with reduced severity, > > that shouldn't hurt as long as the igt_runner still abandons further > > execution and reports an abort result on a kernel taint. > > > > v5: Fix abort skipped on memory allocation failure or other error. > > v4: In the exit handler, restore the default log level with a simple > > write() from a formerly prepared buffer, and abort verbosely if that > > doesn't succeed (Kamil). > > v3: Move cleanup to an exit handler in case we are killed (Kamil). > > v2: Move default log level setup inside subtest smem-oom (Kamil), > > - move cleanup there as well. > > > > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5493 > > Cc: Kamil Konieczny <[email protected]> > > Signed-off-by: Janusz Krzysztofik <[email protected]> > > --- > > tests/intel/gem_lmem_swapping.c | 88 ++++++++++++++++++++++++++++++++- > > 1 file changed, 86 insertions(+), 2 deletions(-) > > > > diff --git a/tests/intel/gem_lmem_swapping.c > > b/tests/intel/gem_lmem_swapping.c > > index adae26716c..acd3714b5a 100644 > > --- a/tests/intel/gem_lmem_swapping.c > > +++ b/tests/intel/gem_lmem_swapping.c > > @@ -9,6 +9,7 @@ > > #include "i915/intel_memory_region.h" > > #include "igt.h" > > #include "igt_kmod.h" > > +#include "runnercomms.h" > > #include <unistd.h> > > #include <stdlib.h> > > #include <stdint.h> > > @@ -661,6 +662,35 @@ static void gem_leak(int fd, uint64_t alloc) > > gem_madvise(fd, handle, I915_MADV_DONTNEED); > > } > > > > +static int printk = -1; > > +static char log_levels[4]; > > + > > +static void printk_exit_handler(int sig) > > +{ > > + char msg[80] = {}; > > + int len; > > + > > + if (printk < 0) > > + return; > > + > > + len = strlen(log_levels); > > + if (!len) > > + snprintf(msg, sizeof(msg), "%s\n", > > + "no defaults saved, unable to restore > > /proc/sys/kernel/printk"); > > + else if (write(printk, log_levels, len) != len) > > + snprintf(msg, sizeof(msg), > > + "restoring /proc/sys/kernel/printk defaults failed, > > errno: %d\n", > > + errno); > > + close(printk); > > + > > + if (*msg) { > > + log_to_runner_sig_safe(msg, strlen(msg)); > > + abort(); > > + } > > + > > + printk = -1; > > +} > > + > > static int *lmem_done; > > > > static void smem_oom_exit_handler(int sig) > > @@ -861,8 +891,62 @@ int igt_main_args("", long_options, help_str, > > opt_handler, NULL) > > } > > > > igt_describe("Exercise local memory swapping during exhausting system > > memory"); > > - dynamic_lmem_subtest(region, regions, "smem-oom") > > - test_smem_oom(i915, ctx, region); > > + igt_subtest_with_dynamic("smem-oom") { > > + int console_log_level, default_log_level; > > + unsigned int fd, i = 0; > > + FILE *stream = NULL; > > + > > + /* > > + * This subtest can result in oom-killer being triggered, which > > + * then dumps a call trace from a process that triggered it. > > + * If that happens to be a process that executes drm or i915 > > + * functions then the call trace dump contains lines recognized > > + * by igt_runner as warnings and a dmesg-warn result is > > + * reported. To avoid false failure reports, relax kernel > > + * default log level to INFO for those lines to be ignored by > > + * igt_runner in piglit mode, at an expense of call traces from > > + * potential real issues not contributing to the igt_runner > > + * reported result. Since those call traces are still available > > + * to developers, only displayed with relaxed severity, that > > + * shouldn't hurt as long as igt_runner still abandons further > > + * execution and reports an abort result on a kernel taint. > > + */ > > + fd = open("/proc/sys/kernel/printk", O_RDWR); > > + if (!igt_debug_on(fd < 0)) > > + stream = fdopen(fd, "r+"); > > + > > + if (igt_debug_on(!stream)) > > + close(fd); > > + else > > + i = fscanf(stream, "%d %d", &console_log_level, > > &default_log_level); > > + > > + if (igt_debug_on(i != 2) || default_log_level >= 6) { > > + i = 0; > > + fclose(stream); > > + } else { > > + i = snprintf(log_levels, sizeof(log_levels), "%d %d", > > + console_log_level, default_log_level); > > + } > > + > > + if (!igt_debug_on(i != 3)) > > + printk = dup(fd); > > + > > + if (!igt_debug_on(printk < 0)) { > > + igt_install_exit_handler(printk_exit_handler); > > + > > + rewind(stream); > > + igt_debug_on(fprintf(stream, "%d 6", console_log_level) > > != 6); > > != 3 Yeah, I've no idea where I got that 6 from, that was still 3 in v3, sorry. But wait, fclose is now missing! I have to submit another version, no way. Thanks, Janusz > > Rest looks good. > > Regards, > Kamil > > > + } > > + > > + for (i = 0; i < regions->num_regions; i++) { > > + region = ®ions->regions[i]; > > + if (region->region.memory_class == > > I915_MEMORY_CLASS_DEVICE) > > + igt_dynamic_f("lmem%u", > > region->region.memory_instance) > > + test_smem_oom(i915, ctx, region); > > + } > > + > > + printk_exit_handler(0); > > + } > > > > igt_fixture() { > > intel_allocator_multiprocess_stop(); >
