Message ID | 20240403131936.787234-4-linux@roeck-us.net (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | Add support for suppressing warning backtraces | expand |
On Wed, 3 Apr 2024 at 21:19, Guenter Roeck <linux@roeck-us.net> wrote: > > Add unit tests to verify that warning backtrace suppression works. > > 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@linaro.org> > Acked-by: Dan Carpenter <dan.carpenter@linaro.org> > Reviewed-by: Kees Cook <keescook@chromium.org> > Signed-off-by: Guenter Roeck <linux@roeck-us.net> > --- There's a typo in the Makefile, which stops this from being built at all. Otherwise, it seems good to me. -- David > v2: > - Rebased to v6.9-rc1 > - Added Tested-by:, Acked-by:, and Reviewed-by: tags > - Introduced KUNIT_SUPPRESS_BACKTRACE configuration option > v3: > - Rebased to v6.9-rc2 > > lib/kunit/Makefile | 7 +- > lib/kunit/backtrace-suppression-test.c | 104 +++++++++++++++++++++++++ > 2 files changed, 109 insertions(+), 2 deletions(-) > create mode 100644 lib/kunit/backtrace-suppression-test.c > > diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile > index 545b57c3be48..3eee1bd0ce5e 100644 > --- a/lib/kunit/Makefile > +++ b/lib/kunit/Makefile > @@ -16,10 +16,13 @@ endif > > # KUnit 'hooks' and bug handling are built-in even when KUnit is built > # as a module. > -obj-y += hooks.o \ > - bug.o > +obj-y += hooks.o > +obj-$(CONFIG_KUNIT_SUPPRESS_BACKTRACE) += bug.o > > obj-$(CONFIG_KUNIT_TEST) += kunit-test.o > +ifeq ($(CCONFIG_KUNIT_SUPPRESS_BACKTRACE),y) s/CCONFIG_/CONFIG_/ ? > +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 000000000000..47c619283802 > --- /dev/null > +++ b/lib/kunit/backtrace-suppression-test.c > @@ -0,0 +1,104 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * KUnit test for suppressing warning tracebacks > + * > + * Copyright (C) 2024, Guenter Roeck > + * Author: Guenter Roeck <linux@roeck-us.net> > + */ > + > +#include <kunit/test.h> > +#include <linux/bug.h> > + > +static void backtrace_suppression_test_warn_direct(struct kunit *test) > +{ > + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); > + > + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); > + WARN(1, "This backtrace should be suppressed"); > + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); > + > + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_direct), 1); > +} > + > +static void trigger_backtrace_warn(void) > +{ > + WARN(1, "This backtrace should be suppressed"); > +} > + > +static void backtrace_suppression_test_warn_indirect(struct kunit *test) > +{ > + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn); > + > + START_SUPPRESSED_WARNING(trigger_backtrace_warn); > + trigger_backtrace_warn(); > + END_SUPPRESSED_WARNING(trigger_backtrace_warn); > + > + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn), 1); > +} > + > +static void backtrace_suppression_test_warn_multi(struct kunit *test) > +{ > + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn); > + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); > + > + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); > + START_SUPPRESSED_WARNING(trigger_backtrace_warn); > + WARN(1, "This backtrace should be suppressed"); > + trigger_backtrace_warn(); > + END_SUPPRESSED_WARNING(trigger_backtrace_warn); > + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); > + > + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_multi), 1); > + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn), 1); > +} > + > +static void backtrace_suppression_test_warn_on_direct(struct kunit *test) > +{ > + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); > + > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE) && !IS_ENABLED(CONFIG_KALLSYMS)) > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE or CONFIG_KALLSYMS"); > + > + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); > + WARN_ON(1); > + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); > + > + KUNIT_EXPECT_EQ(test, > + SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_on_direct), 1); > +} > + > +static void trigger_backtrace_warn_on(void) > +{ > + WARN_ON(1); > +} > + > +static void backtrace_suppression_test_warn_on_indirect(struct kunit *test) > +{ > + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn_on); > + > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE)) > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE"); > + > + START_SUPPRESSED_WARNING(trigger_backtrace_warn_on); > + trigger_backtrace_warn_on(); > + END_SUPPRESSED_WARNING(trigger_backtrace_warn_on); > + > + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn_on), 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"); > -- > 2.39.2 >
On Tue, Apr 09, 2024 at 04:29:42PM +0800, David Gow wrote: > > +ifeq ($(CCONFIG_KUNIT_SUPPRESS_BACKTRACE),y) > > s/CCONFIG_/CONFIG_/ ? > > Odd, I know I tested this (and it still works ;-). The additional "C" must have slipped in at some point. Thanks for noticing! Guenter
diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile index 545b57c3be48..3eee1bd0ce5e 100644 --- a/lib/kunit/Makefile +++ b/lib/kunit/Makefile @@ -16,10 +16,13 @@ endif # KUnit 'hooks' and bug handling are built-in even when KUnit is built # as a module. -obj-y += hooks.o \ - bug.o +obj-y += hooks.o +obj-$(CONFIG_KUNIT_SUPPRESS_BACKTRACE) += bug.o obj-$(CONFIG_KUNIT_TEST) += kunit-test.o +ifeq ($(CCONFIG_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 000000000000..47c619283802 --- /dev/null +++ b/lib/kunit/backtrace-suppression-test.c @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * KUnit test for suppressing warning tracebacks + * + * Copyright (C) 2024, Guenter Roeck + * Author: Guenter Roeck <linux@roeck-us.net> + */ + +#include <kunit/test.h> +#include <linux/bug.h> + +static void backtrace_suppression_test_warn_direct(struct kunit *test) +{ + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); + + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); + WARN(1, "This backtrace should be suppressed"); + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); + + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_direct), 1); +} + +static void trigger_backtrace_warn(void) +{ + WARN(1, "This backtrace should be suppressed"); +} + +static void backtrace_suppression_test_warn_indirect(struct kunit *test) +{ + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn); + + START_SUPPRESSED_WARNING(trigger_backtrace_warn); + trigger_backtrace_warn(); + END_SUPPRESSED_WARNING(trigger_backtrace_warn); + + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn), 1); +} + +static void backtrace_suppression_test_warn_multi(struct kunit *test) +{ + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn); + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); + + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); + START_SUPPRESSED_WARNING(trigger_backtrace_warn); + WARN(1, "This backtrace should be suppressed"); + trigger_backtrace_warn(); + END_SUPPRESSED_WARNING(trigger_backtrace_warn); + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); + + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_multi), 1); + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn), 1); +} + +static void backtrace_suppression_test_warn_on_direct(struct kunit *test) +{ + DEFINE_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); + + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE) && !IS_ENABLED(CONFIG_KALLSYMS)) + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE or CONFIG_KALLSYMS"); + + START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); + WARN_ON(1); + END_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); + + KUNIT_EXPECT_EQ(test, + SUPPRESSED_WARNING_COUNT(backtrace_suppression_test_warn_on_direct), 1); +} + +static void trigger_backtrace_warn_on(void) +{ + WARN_ON(1); +} + +static void backtrace_suppression_test_warn_on_indirect(struct kunit *test) +{ + DEFINE_SUPPRESSED_WARNING(trigger_backtrace_warn_on); + + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE)) + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE"); + + START_SUPPRESSED_WARNING(trigger_backtrace_warn_on); + trigger_backtrace_warn_on(); + END_SUPPRESSED_WARNING(trigger_backtrace_warn_on); + + KUNIT_EXPECT_EQ(test, SUPPRESSED_WARNING_COUNT(trigger_backtrace_warn_on), 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");