On Wed, Apr 22, 2026 at 2:22 PM David Gow <[email protected]> wrote: > > Le 20/04/2026 à 8:28 PM, Albert Esteve a écrit : > > From: Guenter Roeck <[email protected]> > > > > 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 <[email protected]> > > Acked-by: Dan Carpenter <[email protected]> > > Reviewed-by: Kees Cook <[email protected]> > > Signed-off-by: Guenter Roeck <[email protected]> > > Signed-off-by: Alessandro Carminati <[email protected]> > > Signed-off-by: Albert Esteve <[email protected]> > > --- > > 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 <[email protected]> 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 <[email protected]> > > + */ > > + > > +#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"); > > >

