From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 21F3FCD4851 for ; Fri, 15 May 2026 08:30:25 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8CB8610F479; Fri, 15 May 2026 08:30:24 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="N5Z2s3wb"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9E6E110F479 for ; Fri, 15 May 2026 08:30:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778833822; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bl97SG38DqEYm+qLShyfMzefRk/OXd7eX3bX+dxr3ds=; b=N5Z2s3wbGD5T2Ur87tk2PSZ7jF5uYSYh5vcEP7+xZ1Y2XhEVw2CrSDg6rxPDb5XxpAOsSk hEWj6JV3TPDX1Fr/vrUBvLbNlyFgExNlz5pIXHYjubNnLT7PmGl0N0rHrduz0lhP0Lj+UU PvwG9DT8ljWWWqdXTpiP9FSTYHDKmO0= Received: from mail-yx1-f70.google.com (mail-yx1-f70.google.com [74.125.224.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-467-0uFBBkbZPzSoGGKk6hGGvQ-1; Fri, 15 May 2026 04:30:21 -0400 X-MC-Unique: 0uFBBkbZPzSoGGKk6hGGvQ-1 X-Mimecast-MFC-AGG-ID: 0uFBBkbZPzSoGGKk6hGGvQ_1778833821 Received: by mail-yx1-f70.google.com with SMTP id 956f58d0204a3-651bd2131f0so21689036d50.3 for ; Fri, 15 May 2026 01:30:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778833821; x=1779438621; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=bl97SG38DqEYm+qLShyfMzefRk/OXd7eX3bX+dxr3ds=; b=K/gwQG6MC82g8EXEsNerSXYbyg068M6I5MAOw2JC9LMlyBCEdB9gnvm5eDkEK/nBHi wWYebPR0YBE2Ik2kJww2vs5xSSQPanI1AI2Q4eO2AsXvX/bUOWoqAhcsbSOmqxo81Vpu X4nd1Qy8Vqu/gwrNaNitEYpo3+hGSkLyXzC1DeKrvKDqGkHfIenAkyknVitWo6894kbC RisPewoYy1blthg9qpvINEOq0mAWSBwMZZjInm1hy6dCp8kOQCs0nx8xQbw9QE8fHb9B LKZxwgXNS2vhgGUebcZx5wPEURYpXvbDV4FFOfO5PphlwhKxpuhYJUOP7F58dcjNchYF t1uA== X-Forwarded-Encrypted: i=1; AFNElJ9xZYpc5IKrdbX+mUlGzgulncpeOohtF8u0L4bVjGYtPbOMo/RMbhADiwDg0lnWrdMSo0XTcUUbUQU=@lists.freedesktop.org X-Gm-Message-State: AOJu0YwRSYJ4LKugrj7uEZK7Q3swTfbyin6fXS73/GIbncBXxISjDhnU yjkeLcmfFMxHLrAruNM1f1mluAXCA+0X0wsPnuUUyl6fcDzhspkNSBFuT1lFLx9L8bhvMm8A0qn a++iZbGg5GJpR4WXyHMGwfrOtAgzwTXLwRBQG0ewj4txBBWxhsrOeF6wHmPIpI+KZJfYzEi3EAN HGtp0u7Uqzwhsda+yXVZC0RfS6AZK0wACXdAcc8BBP+uIO X-Gm-Gg: Acq92OELusUTYpw+1NCznEmuL6FW+vu7vWj/2OKl5ZY2RLZjj83JKXJoDEjydI6A71Q jXtoBtqZg8DMy3Xixsfyy2PyXcbuhWN0e0LkS0wKlItNrQ4sFxl4VBl/nvL8fe/TltzLGoNG1dr RL62OM0nQJ3TpeNwvPJylTIVzSjikunBKsoSiu99F8hocoKyKEQADnyUrGKXhD1uwA6mkpin/Jg ufl8A== X-Received: by 2002:a05:690c:d91:b0:7a4:8718:8c73 with SMTP id 00721157ae682-7c959f7eae9mr29527787b3.9.1778833820532; Fri, 15 May 2026 01:30:20 -0700 (PDT) X-Received: by 2002:a05:690c:d91:b0:7a4:8718:8c73 with SMTP id 00721157ae682-7c959f7eae9mr29527457b3.9.1778833820057; Fri, 15 May 2026 01:30:20 -0700 (PDT) MIME-Version: 1.0 References: <20260514-kunit_add_support-v11-0-b36a530a6d8f@redhat.com> <20260514-kunit_add_support-v11-2-b36a530a6d8f@redhat.com> In-Reply-To: <20260514-kunit_add_support-v11-2-b36a530a6d8f@redhat.com> From: Albert Esteve Date: Fri, 15 May 2026 10:30:07 +0200 X-Gm-Features: AVHnY4IpbN1L0iL3JJ5V1KLP5rKC5fDaPhQjSTbBKstC7eTK3NlVXbuxOJbgBlw Message-ID: Subject: Re: [PATCH v11 2/4] kunit: Add backtrace suppression self-tests To: Arnd Bergmann , Brendan Higgins , David Gow , Rae Moar , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Andrew Morton , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, dri-devel@lists.freedesktop.org, workflows@vger.kernel.org, linux-riscv@lists.infradead.org, linux-doc@vger.kernel.org, peterz@infradead.org, Guenter Roeck , Linux Kernel Functional Testing , Alessandro Carminati , Dan Carpenter , Kees Cook X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 2Lem96XXLPF7z0160E8wuYDsH8U0f1sOobWvxYiECQw_1778833821 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Thu, May 14, 2026 at 1:07=E2=80=AFPM Albert Esteve = wrote: > > From: Guenter Roeck > > Add unit tests to verify that warning backtrace suppression works. > > Tests cover both API forms: > - Scoped: kunit_warning_suppress() with in-block count verification > and post-block inactivity check. > - Direct functions: kunit_start/end_suppress_warning() with > sequential independent suppression blocks and per-block counts. > > Furthermore, tests verify incremental warning counting, that > kunit_has_active_suppress_warning() transitions correctly around > suppression boundaries, and that suppression active in the test > kthread does not leak to a separate kthread. > > 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 > Acked-by: Dan Carpenter > Reviewed-by: Kees Cook > Signed-off-by: Guenter Roeck > Signed-off-by: Alessandro Carminati > Reviewed-by: David Gow > Signed-off-by: Albert Esteve > --- > lib/kunit/Makefile | 1 + > lib/kunit/backtrace-suppression-test.c | 198 +++++++++++++++++++++++++++= ++++++ > 2 files changed, 199 insertions(+) > > diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile > index 4592f9d0aa8dd..2e8a6b71a2ab0 100644 > --- a/lib/kunit/Makefile > +++ b/lib/kunit/Makefile > @@ -22,6 +22,7 @@ obj-$(if $(CONFIG_KUNIT),y) +=3D hooks.o > > obj-$(CONFIG_KUNIT_TEST) +=3D kunit-test.o > obj-$(CONFIG_KUNIT_TEST) +=3D platform-test.o > +obj-$(CONFIG_KUNIT_TEST) +=3D backtrace-suppression-test.o > > # 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..7a2a59c6a780d > --- /dev/null > +++ b/lib/kunit/backtrace-suppression-test.c > @@ -0,0 +1,198 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * KUnit test for suppressing warning tracebacks. > + * > + * Copyright (C) 2024, Guenter Roeck > + * Author: Guenter Roeck > + */ > + > +#include > +#include > +#include > +#include > + > +static void backtrace_suppression_test_warn_direct(struct kunit *test) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + > + kunit_warning_suppress(test) { > + WARN(1, "This backtrace should be suppressed"); > + /* > + * Count must be checked inside the scope; the handle > + * is not accessible after the block exits. > + */ > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 1); > + } > + KUNIT_EXPECT_FALSE(test, kunit_has_active_suppress_warning()); > +} > + > +static noinline void trigger_backtrace_warn(void) > +{ > + WARN(1, "This backtrace should be suppressed"); > +} > + > +static void backtrace_suppression_test_warn_indirect(struct kunit *test) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + > + kunit_warning_suppress(test) { > + trigger_backtrace_warn(); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 1); > + } > +} > + > +static void backtrace_suppression_test_warn_multi(struct kunit *test) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + > + kunit_warning_suppress(test) { > + WARN(1, "This backtrace should be suppressed"); > + trigger_backtrace_warn(); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 2); > + } > +} > + > +static void backtrace_suppression_test_warn_on_direct(struct kunit *test= ) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE) && !IS_ENABLED(CONFIG_KA= LLSYMS)) > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE or CON= FIG_KALLSYMS"); > + > + kunit_warning_suppress(test) { > + WARN_ON(1); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 1); > + } > +} > + > +static noinline void trigger_backtrace_warn_on(void) > +{ > + WARN_ON(1); > +} > + > +static void backtrace_suppression_test_warn_on_indirect(struct kunit *te= st) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE)) > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE"); Sashiko says: """ Is there a reason why backtrace_suppression_test_warn_on_direct() falls bac= k to checking CONFIG_KALLSYMS while backtrace_suppression_test_warn_on_indirect() does not? The core warning suppression logic matches on the task, so it seems like CONFIG_KALLSYMS should be sufficient for both. Could this cause tests to be unnecessarily skipped on systems with CONFIG_KALLSYMS enabled but CONFIG_DEBUG_BUGVERBOSE disabled? """ This is interesting. I am not sure why they were different; it was probably an oversight. But after looking at it, this is probably a leftover from when suppression occurred at the macros. They do not seem necessary anymore. So I will remove them. > + > + kunit_warning_suppress(test) { > + trigger_backtrace_warn_on(); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 1); > + } > +} > + > +static void backtrace_suppression_test_count(struct kunit *test) > +{ > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + > + kunit_warning_suppress(test) { > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 0); > + > + WARN(1, "suppressed"); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 1); > + > + WARN(1, "suppressed again"); > + KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, 2); > + } > +} > + > +static void backtrace_suppression_test_active_state(struct kunit *test) > +{ > + KUNIT_EXPECT_FALSE(test, kunit_has_active_suppress_warning()); > + > + kunit_warning_suppress(test) { > + KUNIT_EXPECT_TRUE(test, kunit_has_active_suppress_warning= ()); > + } > + > + KUNIT_EXPECT_FALSE(test, kunit_has_active_suppress_warning()); > + > + kunit_warning_suppress(test) { > + KUNIT_EXPECT_TRUE(test, kunit_has_active_suppress_warning= ()); > + } > + > + KUNIT_EXPECT_FALSE(test, kunit_has_active_suppress_warning()); > +} > + > +static void backtrace_suppression_test_multi_scope(struct kunit *test) > +{ > + struct kunit_suppressed_warning *sw1, *sw2; > + > + if (!IS_ENABLED(CONFIG_BUG)) > + kunit_skip(test, "requires CONFIG_BUG"); > + if (!IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE)) > + kunit_skip(test, "requires CONFIG_DEBUG_BUGVERBOSE"); > + > + sw1 =3D kunit_start_suppress_warning(test); > + trigger_backtrace_warn_on(); > + WARN(1, "suppressed by sw1"); > + kunit_end_suppress_warning(test, sw1); > + > + sw2 =3D kunit_start_suppress_warning(test); > + WARN(1, "suppressed by sw2"); > + kunit_end_suppress_warning(test, sw2); > + > + KUNIT_EXPECT_EQ(test, kunit_suppressed_warning_count(sw1), 2); > + KUNIT_EXPECT_EQ(test, kunit_suppressed_warning_count(sw2), 1); > +} > + > +struct cross_kthread_data { > + bool was_active; > + struct completion done; > +}; > + > +static int cross_kthread_fn(void *data) > +{ > + struct cross_kthread_data *d =3D data; > + > + d->was_active =3D kunit_has_active_suppress_warning(); > + complete(&d->done); > + while (!kthread_should_stop()) > + schedule(); > + return 0; > +} > + > +static void backtrace_suppression_test_cross_kthread(struct kunit *test) > +{ > + struct cross_kthread_data data; > + struct task_struct *task; > + > + data.was_active =3D false; > + init_completion(&data.done); > + > + kunit_warning_suppress(test) { > + task =3D kthread_run(cross_kthread_fn, &data, "kunit-cros= s-test"); > + KUNIT_ASSERT_FALSE(test, IS_ERR(task)); > + wait_for_completion(&data.done); > + kthread_stop(task); > + } > + > + KUNIT_EXPECT_FALSE(test, data.was_active); > +} > + > +static struct kunit_case backtrace_suppression_test_cases[] =3D { > + 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), > + KUNIT_CASE(backtrace_suppression_test_count), > + KUNIT_CASE(backtrace_suppression_test_active_state), > + KUNIT_CASE(backtrace_suppression_test_multi_scope), > + KUNIT_CASE(backtrace_suppression_test_cross_kthread), > + {} > +}; > + > +static struct kunit_suite backtrace_suppression_test_suite =3D { > + .name =3D "backtrace-suppression-test", > + .test_cases =3D backtrace_suppression_test_cases, > +}; > +kunit_test_suites(&backtrace_suppression_test_suite); > + > +MODULE_LICENSE("GPL"); > +MODULE_DESCRIPTION("KUnit test to verify warning backtrace suppression")= ; > > -- > 2.53.0 >