Re: [PATCH v7 3/5] kunit: Add backtrace suppression self-tests
From: Albert Esteve
Date: Fri Apr 24 2026 - 04:29:31 EST
On Wed, Apr 22, 2026 at 2:22 PM David Gow <david@xxxxxxxxxxxx> wrote:
>
> Le 20/04/2026 à 8:28 PM, Albert Esteve a écrit :
> > From: Guenter Roeck <linux@xxxxxxxxxxxx>
> >
> > Add unit tests to verify that warning backtrace suppression works,
> > covering WARN() and WARN_ON() with direct calls, indirect calls
> > through helper functions, and multiple warnings in a single window.
> >
> > If backtrace suppression does _not_ work, the unit tests will likely
> > trigger unsuppressed backtraces, which should actually help to get
> > the affected architectures / platforms fixed.
> >
> > Tested-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx>
> > Acked-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> > Reviewed-by: Kees Cook <keescook@xxxxxxxxxxxx>
> > Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
> > Signed-off-by: Alessandro Carminati <acarmina@xxxxxxxxxx>
> > Signed-off-by: Albert Esteve <aesteve@xxxxxxxxxx>
> > ---
>
> Thanks very much for including tests!
>
> Maybe it'd be nice to test that the suppression is disabled after
> KUNIT_END_SUPPRESSED_WARNING(). Of course, then triggering an actual
> stacktrace would be a pain, but maybe we could check that
> __kunit_is_suppressed_warning() returns false? If you wanted to be
> really fancy, you could test that it returns false on another kthread
> even while the suppression is active, too, but I won't hold you to it.
> Equally, you could try setting up a fake test context and ensuring the
> cleanup is called correctly, but I think that's mostly covered by the
> existing KUnit resource tests.
Good suggestions. I'll add a test for __kunit_is_suppressed_warning()
returning false after END. The cross-kthread test is a nice idea too.
I'll see if I can fit it in without overcomplicating things.
>
> Otherwise, looking good. A couple of other minor suggestions below,
> which may require some reworking of the __kunit_suppress scope, but all
> optional suggestions.
>
> Reviewed-by: David Gow <david@xxxxxxxxxxxx>
Thanks for the review!
>
> > lib/kunit/Makefile | 3 ++
> > lib/kunit/backtrace-suppression-test.c | 90 ++++++++++++++++++++++++++++++++++
> > 2 files changed, 93 insertions(+)
> >
> > diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
> > index fe177ff3ebdef..b2f2b8ada7b71 100644
> > --- a/lib/kunit/Makefile
> > +++ b/lib/kunit/Makefile
> > @@ -23,6 +23,9 @@ obj-$(if $(CONFIG_KUNIT),y) += hooks.o \
> >
> > obj-$(CONFIG_KUNIT_TEST) += kunit-test.o
> > obj-$(CONFIG_KUNIT_TEST) += platform-test.o
> > +ifeq ($(CONFIG_KUNIT_SUPPRESS_BACKTRACE),y)
> > +obj-$(CONFIG_KUNIT_TEST) += backtrace-suppression-test.o
> > +endif
> >
> > # string-stream-test compiles built-in only.
> > ifeq ($(CONFIG_KUNIT_TEST),y)
> > diff --git a/lib/kunit/backtrace-suppression-test.c b/lib/kunit/backtrace-suppression-test.c
> > new file mode 100644
> > index 0000000000000..2ba5dcb5fef35
> > --- /dev/null
> > +++ b/lib/kunit/backtrace-suppression-test.c
> > @@ -0,0 +1,90 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * KUnit test for suppressing warning tracebacks.
> > + *
> > + * Copyright (C) 2024, Guenter Roeck
> > + * Author: Guenter Roeck <linux@xxxxxxxxxxxx>
> > + */
> > +
> > +#include <kunit/test.h>
> > +#include <linux/bug.h>
> > +
> > +static void backtrace_suppression_test_warn_direct(struct kunit *test)
> > +{
> > + KUNIT_START_SUPPRESSED_WARNING(test);
> > + WARN(1, "This backtrace should be suppressed");
> > + KUNIT_END_SUPPRESSED_WARNING(test);
> > +
> > + KUNIT_EXPECT_EQ(test, KUNIT_SUPPRESSED_WARNING_COUNT(), 1);
> > +}
> > +
> > +static void trigger_backtrace_warn(void)
> > +{
> > + WARN(1, "This backtrace should be suppressed");
> > +}
> > +
> > +static void backtrace_suppression_test_warn_indirect(struct kunit *test)
> > +{
> > + KUNIT_START_SUPPRESSED_WARNING(test);
> > + trigger_backtrace_warn();
> > + KUNIT_END_SUPPRESSED_WARNING(test);
> > +
> > + KUNIT_EXPECT_EQ(test, KUNIT_SUPPRESSED_WARNING_COUNT(), 1);
> > +}
> > +
> > +static void backtrace_suppression_test_warn_multi(struct kunit *test)
> > +{
> > + KUNIT_START_SUPPRESSED_WARNING(test);
> > + WARN(1, "This backtrace should be suppressed");
> > + trigger_backtrace_warn();
> > + KUNIT_END_SUPPRESSED_WARNING(test);
> > +
> > + KUNIT_EXPECT_EQ(test, KUNIT_SUPPRESSED_WARNING_COUNT(), 2);
>
> Would it make sense to test KUNIT_SUPPRESSED_WARNING_COUNT() more
> thoroughly here by checking that it's 0 before any warnings, and
> checking that it's 1 in-between the two warnings?
>
> Of course, the first case doesn't work due to __kunit_suppress not being
> defined, but if the implementation changes to support this, let's add it
> to the test, too.
I thought this was a test gap when you commented the limitation in
patch #1, so I agree to add more granular COUNT checks once the API
supports it (which it should after the rework to expose the pointer).
Thanks!
>
> > +}
> > +
> > +static void backtrace_suppression_test_warn_on_direct(struct kunit *test)
> > +{
> > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE) && !IS_ENABLED(CONFIG_KALLSYMS))
> > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE or CONFIG_KALLSYMS");
> > +
> > + KUNIT_START_SUPPRESSED_WARNING(test);
> > + WARN_ON(1);
> > + KUNIT_END_SUPPRESSED_WARNING(test);
> > +
> > + KUNIT_EXPECT_EQ(test, KUNIT_SUPPRESSED_WARNING_COUNT(), 1);
> > +}
> > +
> > +static void trigger_backtrace_warn_on(void)
> > +{
> > + WARN_ON(1);
> > +}
> > +
> > +static void backtrace_suppression_test_warn_on_indirect(struct kunit *test)
> > +{
> > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE))
> > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE");
> > +
> > + KUNIT_START_SUPPRESSED_WARNING(test);
> > + trigger_backtrace_warn_on();
> > + KUNIT_END_SUPPRESSED_WARNING(test);
> > +
> > + KUNIT_EXPECT_EQ(test, KUNIT_SUPPRESSED_WARNING_COUNT(), 1);
> > +}
> > +
> > +static struct kunit_case backtrace_suppression_test_cases[] = {
> > + KUNIT_CASE(backtrace_suppression_test_warn_direct),
> > + KUNIT_CASE(backtrace_suppression_test_warn_indirect),
> > + KUNIT_CASE(backtrace_suppression_test_warn_multi),
> > + KUNIT_CASE(backtrace_suppression_test_warn_on_direct),
> > + KUNIT_CASE(backtrace_suppression_test_warn_on_indirect),
> > + {}
> > +};
> > +
> > +static struct kunit_suite backtrace_suppression_test_suite = {
> > + .name = "backtrace-suppression-test",
> > + .test_cases = backtrace_suppression_test_cases,
> > +};
> > +kunit_test_suites(&backtrace_suppression_test_suite);
> > +
> > +MODULE_LICENSE("GPL");
> > +MODULE_DESCRIPTION("KUnit test to verify warning backtrace suppression");
> >
>