| From: Guenter Roeck <linux@roeck-us.net> |
| Subject: kunit: add test cases for backtrace warning suppression |
| Date: Thu, 13 Mar 2025 11:43:18 +0000 |
| |
| 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. |
| |
| Link: https://lkml.kernel.org/r/20250313114329.284104-4-acarmina@redhat.com |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Alessandro Carminati <acarmina@redhat.com> |
| Tested-by: Linux Kernel Functional Testing <lkft@linaro.org> |
| Acked-by: Dan Carpenter <dan.carpenter@linaro.org> |
| Reviewed-by: Kees Cook <keescook@chromium.org> |
| Reviewed-by: David Gow <davidgow@google.com> |
| Cc: Albert Ou <aou@eecs.berkeley.edu> |
| Cc: Alexander Gordeev <agordeev@linux.ibm.com> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Cc: Arthur Grillo <arthurgrillo@riseup.net> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Brendan Higgins <brendan.higgins@linux.dev> |
| Cc: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Charlie Jenkins <charlie@rivosinc.com> |
| Cc: Daniel Diaz <daniel.diaz@linaro.org> |
| Cc: Daniel Vetter <daniel@ffwll.ch> |
| Cc: Dave Airlie <airlied@gmail.com> |
| Cc: Dave Hansen <dave.hansen@linux.intel.com> |
| Cc: Heiko Carstens <hca@linux.ibm.com> |
| Cc: Helge Deller <deller@gmx.de> |
| Cc: Huacai Chen <chenhuacai@kernel.org> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Jani Nikula <jani.nikula@intel.com> |
| Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> |
| Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> |
| Cc: Maíra Canal <mcanal@igalia.com> |
| Cc: Maxime Ripard <mripard@kernel.org> |
| Cc: Michael Ellerman <mpe@ellerman.id.au> |
| Cc: Naresh Kamboju <naresh.kamboju@linaro.org> |
| Cc: Palmer Dabbelt <palmer@dabbelt.com> |
| Cc: Paul Walmsley <paul.walmsley@sifive.com> |
| Cc: Rae Moar <rmoar@google.com> |
| Cc: Rich Felker <dalias@libc.org> |
| Cc: Simon Horman <horms@kernel.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Thomas Zimemrmann <tzimmermann@suse.de> |
| Cc: Vasily Gorbik <gor@linux.ibm.com> |
| Cc: Ville Syrjala <ville.syrjala@linux.intel.com> |
| Cc: Will Deacon <will@kernel.org> |
| Cc: Yoshinori Sato <ysato@users.sourceforge.jp> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| lib/kunit/Makefile | 7 + |
| lib/kunit/backtrace-suppression-test.c | 104 +++++++++++++++++++++++ |
| 2 files changed, 109 insertions(+), 2 deletions(-) |
| |
| diff --git a/lib/kunit/backtrace-suppression-test.c a/lib/kunit/backtrace-suppression-test.c |
| new file mode 100644 |
| --- /dev/null |
| +++ a/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); |
| + |
| + KUNIT_START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_direct); |
| + WARN(1, "This backtrace should be suppressed"); |
| + KUNIT_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); |
| + |
| + KUNIT_START_SUPPRESSED_WARNING(trigger_backtrace_warn); |
| + trigger_backtrace_warn(); |
| + KUNIT_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); |
| + |
| + KUNIT_START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_multi); |
| + KUNIT_START_SUPPRESSED_WARNING(trigger_backtrace_warn); |
| + WARN(1, "This backtrace should be suppressed"); |
| + trigger_backtrace_warn(); |
| + KUNIT_END_SUPPRESSED_WARNING(trigger_backtrace_warn); |
| + KUNIT_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"); |
| + |
| + KUNIT_START_SUPPRESSED_WARNING(backtrace_suppression_test_warn_on_direct); |
| + WARN_ON(1); |
| + KUNIT_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"); |
| + |
| + KUNIT_START_SUPPRESSED_WARNING(trigger_backtrace_warn_on); |
| + trigger_backtrace_warn_on(); |
| + KUNIT_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"); |
| --- a/lib/kunit/Makefile~kunit-add-test-cases-for-backtrace-warning-suppression |
| +++ a/lib/kunit/Makefile |
| @@ -18,11 +18,14 @@ 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 |
| 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) |
| _ |