From nobody Sat Feb 7 18:21:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F8692DF142 for ; Fri, 14 Nov 2025 06:26:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763101565; cv=none; b=ozFYO2pMD0MPLvCx4+5S9fHexezbFbq1d4kIQv6cO6crLd98zkmPJ1uwMlUy2EuRe0063rPCGDaPNTakCbS/08dthML8lPAMwyVb/OOuTy3LnN/+mqtAWGc1lGeKYADdrEDijDL7nL/ZSOOg68VdSjESGkWhBszeVrcIktHhDK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763101565; c=relaxed/simple; bh=8DPd9tS3AMopQCzcJAufCZKmmHfY1jfoFwOx99y8S5w=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Kr8G0j49A2MvCi6CjxPiHnubfpgGnujdaiEAg+wQi6GKdCdArI59SwzUEOsFrXuuvdHFWsuxRJ6Iohv41dP7dGLU2vPfhmgvyiPzUHiNeHoE3pk41qtEfT+fYhYR/gj9ruEef1iSz1geEPFp8tV7xDagR3Owg1SCTgpFV9SqQ5o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jlmynFB+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jlmynFB+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC414C113D0; Fri, 14 Nov 2025 06:26:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763101561; bh=8DPd9tS3AMopQCzcJAufCZKmmHfY1jfoFwOx99y8S5w=; h=From:To:Cc:Subject:Date:From; b=jlmynFB+czYelAYnLsg66sIouXTUaTzYCfUUxm7mXT+VRMkC1B/ks01kFxDTl6O3z JNJVmUTaQ8/AUZn41gWjoxMWyOpV6vbu+4w7/BG3e2teRftT5oJhSfRVzPTsQ7PE2G fZQ271w+S484MqVQpgxXQ/E5NV7ooF7jDJPAkI14+rOn34FqMMCcDp3i1DbvQqsRhe j+LcRgWe2Ku+15eYxtSwwQ77PhCNXoRBI7LnPR2SBBylDjYpuo46H8i+JZSBMDXbgq jzBtr98jlkGoPse1VDc69PSaX8DnJCOlmy9g0SHZAl3NQYjcHyH0zfgpZAT5+MkpUG bvhnsjU2C9VDg== From: Tzung-Bi Shih To: Kees Cook Cc: Arnd Bergmann , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, tzungbi@kernel.org Subject: [PATCH] lkdtm: Add lockdep related crash tests Date: Fri, 14 Nov 2025 06:25:35 +0000 Message-ID: <20251114062535.1827309-1-tzungbi@kernel.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce various lockdep related crash tests. Signed-off-by: Tzung-Bi Shih --- drivers/misc/lkdtm/Makefile | 1 + drivers/misc/lkdtm/core.c | 1 + drivers/misc/lkdtm/lkdtm.h | 1 + drivers/misc/lkdtm/lockdep.c | 98 ++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 drivers/misc/lkdtm/lockdep.c diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile index 03ebe33185f9..830b71c8e6a0 100644 --- a/drivers/misc/lkdtm/Makefile +++ b/drivers/misc/lkdtm/Makefile @@ -11,6 +11,7 @@ lkdtm-$(CONFIG_LKDTM) +=3D usercopy.o lkdtm-$(CONFIG_LKDTM) +=3D kstack_erase.o lkdtm-$(CONFIG_LKDTM) +=3D cfi.o lkdtm-$(CONFIG_LKDTM) +=3D fortify.o +lkdtm-$(CONFIG_LKDTM) +=3D lockdep.o lkdtm-$(CONFIG_PPC_64S_HASH_MMU) +=3D powerpc.o =20 KASAN_SANITIZE_stackleak.o :=3D n diff --git a/drivers/misc/lkdtm/core.c b/drivers/misc/lkdtm/core.c index 5732fd59a227..43e91388940f 100644 --- a/drivers/misc/lkdtm/core.c +++ b/drivers/misc/lkdtm/core.c @@ -96,6 +96,7 @@ static const struct crashtype_category *crashtype_categor= ies[] =3D { &stackleak_crashtypes, &cfi_crashtypes, &fortify_crashtypes, + &lockdep_crashtypes, #ifdef CONFIG_PPC_64S_HASH_MMU &powerpc_crashtypes, #endif diff --git a/drivers/misc/lkdtm/lkdtm.h b/drivers/misc/lkdtm/lkdtm.h index 015e0484026b..d2d97e6f323e 100644 --- a/drivers/misc/lkdtm/lkdtm.h +++ b/drivers/misc/lkdtm/lkdtm.h @@ -84,6 +84,7 @@ extern struct crashtype_category usercopy_crashtypes; extern struct crashtype_category stackleak_crashtypes; extern struct crashtype_category cfi_crashtypes; extern struct crashtype_category fortify_crashtypes; +extern struct crashtype_category lockdep_crashtypes; extern struct crashtype_category powerpc_crashtypes; =20 /* Each category's init/exit routines. */ diff --git a/drivers/misc/lkdtm/lockdep.c b/drivers/misc/lkdtm/lockdep.c new file mode 100644 index 000000000000..917e1d2cc633 --- /dev/null +++ b/drivers/misc/lkdtm/lockdep.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2025 Google LLC + * + * Tests related to lockdep warnings. + */ +#include "lkdtm.h" +#include +#include +#include +#include +#include + +static DEFINE_SPINLOCK(lock_A); +static DEFINE_SPINLOCK(lock_B); + +/* For "WARNING: possible circular locking dependency detected". */ +static void lkdtm_LOCKDEP_CIRCULAR_LOCK(void) +{ + scoped_guard(spinlock, &lock_A) + scoped_guard(spinlock, &lock_B); + scoped_guard(spinlock, &lock_B) + scoped_guard(spinlock, &lock_A); +} + +/* For "WARNING: possible recursive locking detected". */ +static void lkdtm_LOCKDEP_RECURSIVE_LOCK(void) +{ + guard(spinlock)(&lock_A); + guard(spinlock)(&lock_A); +} + +/* For "WARNING: inconsistent lock state". */ +static void lkdtm_LOCKDEP_INCONSISTENT_LOCK(void) +{ + lockdep_softirq_enter(); + scoped_guard(spinlock, &lock_A); + lockdep_softirq_exit(); + + scoped_guard(spinlock, &lock_A); +} + +/* For "WARNING: Nested lock was not taken". */ +static void lkdtm_LOCKDEP_NESTED_LOCK_NOT_HELD(void) +{ + spin_lock_nest_lock(&lock_B, &lock_A); +} + +/* For "WARNING: bad unlock balance detected!". */ +static void lkdtm_LOCKDEP_BAD_UNLOCK_BALANCE(void) +{ + spin_unlock(&lock_A); +} + +/* For "WARNING: held lock freed!". */ +static void lkdtm_LOCKDEP_HELD_LOCK_FREED(void) +{ + spin_lock(&lock_A); + spin_lock_init(&lock_A); +} + +/* For "WARNING: lock held when returning to user space!". */ +static void lkdtm_LOCKDEP_HELD_LOCK(void) +{ + spin_lock(&lock_A); +} + +/* For "WARNING: suspicious RCU usage". */ +static void lkdtm_LOCKDEP_SUSPICIOUS_RCU(void) +{ + struct srcu_struct srcu; + void __rcu *res =3D NULL; + int idx; + + init_srcu_struct(&srcu); + + idx =3D srcu_read_lock(&srcu); + rcu_dereference(res); + srcu_read_unlock(&srcu, idx); + + cleanup_srcu_struct(&srcu); +} + +static struct crashtype crashtypes[] =3D { + CRASHTYPE(LOCKDEP_CIRCULAR_LOCK), + CRASHTYPE(LOCKDEP_RECURSIVE_LOCK), + CRASHTYPE(LOCKDEP_INCONSISTENT_LOCK), + CRASHTYPE(LOCKDEP_NESTED_LOCK_NOT_HELD), + CRASHTYPE(LOCKDEP_BAD_UNLOCK_BALANCE), + CRASHTYPE(LOCKDEP_HELD_LOCK_FREED), + CRASHTYPE(LOCKDEP_HELD_LOCK), + CRASHTYPE(LOCKDEP_SUSPICIOUS_RCU), +}; + +struct crashtype_category lockdep_crashtypes =3D { + .crashtypes =3D crashtypes, + .len =3D ARRAY_SIZE(crashtypes), +}; --=20 2.52.0.rc1.455.g30608eb744-goog