Thread (26 messages) 26 messages, 5 authors, 3h ago

Re: [PATCH v4 01/11] seq_buf: Do not print an empty line from an overflowed seq_buf_do_printk()

From: bot+bpf-ci@kernel.org
Date: 2026-10-03 04:50:52
Also in: bpf, linux-doc, linux-hardening, linux-security-module, lkml, nvdimm

seq_buf: Do not print an empty line from an overflowed seq_buf_do_printk()
TL;DR: The new KUnit test may fail spuriously, and stop detecting the bug,
when console_loglevel suppresses KERN_INFO (quiet, loglevel=N) or
CONFIG_PRINTK=n, since the capture console never sees records.
quoted hunk ↗ jump to hunk
diff --git a/lib/tests/seq_buf_kunit.c b/lib/tests/seq_buf_kunit.c
index eb466386bbef..0934dfb602ff 100644
--- a/lib/tests/seq_buf_kunit.c
+++ b/lib/tests/seq_buf_kunit.c
[ ... ]
quoted hunk ↗ jump to hunk
+static void seq_buf_printk_run(struct console *capture, struct seq_buf *s)
+{
+	seq_buf_printk_marked = 0;
+	seq_buf_printk_empty = 0;
+	seq_buf_printk_last_was_ours = false;
+
+	/*
+	 * register_console() will not take an unmatched console without
+	 * CON_ENABLED, and unregister_console() clears it, so set it on
+	 * every run to keep the test repeatable.
+	 */
+	capture->flags = CON_ENABLED;
+	register_console(capture);
+	seq_buf_do_printk(s, KERN_INFO);
+	unregister_console(capture);
+}
Does this test depend on console_loglevel being above LOGLEVEL_INFO?

The records are printed at KERN_INFO, and a legacy console only gets a record
through console_emit_next_record(), which calls printk_get_next_message()
with may_suppress set.  That function skips any record for which
suppress_message_printing() is true:

    static bool suppress_message_printing(int level)
    {
            return (level >= console_loglevel && !ignore_loglevel);
    }

A skipped record just advances con->seq and ->write() is never called.

With console_loglevel <= 6, seq_buf_printk_capture() never runs and
seq_buf_printk_marked stays 0, so these expectations in
seq_buf_do_printk_test() fail:

    KUNIT_EXPECT_EQ(test, seq_buf_printk_marked, 1);
    KUNIT_EXPECT_EQ(test, seq_buf_printk_marked, 2);
    KUNIT_EXPECT_EQ(test, seq_buf_printk_marked, 1);

The seq_buf_printk_empty checks would still pass in that setup, so the test
would also stop detecting the bug it was written for.

CONFIG_CONSOLE_LOGLEVEL_QUIET is 4 when "quiet" is on the command line.  A
loglevel=N boot argument, dmesg -n, or a kernel.printk sysctl that lowers the
console level has the same effect, and some distributions lower it by
default.  With CONFIG_SEQ_BUF_KUNIT_TEST=m this would report a failure.  The
same happens with CONFIG_PRINTK=n, where printk() is a no-op and
SEQ_BUF_KUNIT_TEST depends only on KUNIT.

The kunit.py qemu and UML runs would not notice, since they do not lower the
loglevel.  The later commits in this series still call
seq_buf_do_printk(s, KERN_INFO) unchanged.

Would it make sense to use a level that is not filtered, call kunit_skip()
when console_loglevel would suppress KERN_INFO, or read the records back from
the printk ring buffer instead of a console?


---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/37096036516
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help