[PATCH] lkdtm: Add lockdep related crash tests

Tzung-Bi Shih posted 1 patch 2 months, 3 weeks ago
There is a newer version of this series
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
[PATCH] lkdtm: Add lockdep related crash tests
Posted by Tzung-Bi Shih 2 months, 3 weeks ago
Introduce various lockdep related crash tests.

Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
---
 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)		+= usercopy.o
 lkdtm-$(CONFIG_LKDTM)		+= kstack_erase.o
 lkdtm-$(CONFIG_LKDTM)		+= cfi.o
 lkdtm-$(CONFIG_LKDTM)		+= fortify.o
+lkdtm-$(CONFIG_LKDTM)		+= lockdep.o
 lkdtm-$(CONFIG_PPC_64S_HASH_MMU)	+= powerpc.o
 
 KASAN_SANITIZE_stackleak.o	:= 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_categories[] = {
 	&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;
 
 /* 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 <linux/cleanup.h>
+#include <linux/irqflags.h>
+#include <linux/mutex.h>
+#include <linux/spinlock.h>
+#include <linux/srcu.h>
+
+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 = NULL;
+	int idx;
+
+	init_srcu_struct(&srcu);
+
+	idx = srcu_read_lock(&srcu);
+	rcu_dereference(res);
+	srcu_read_unlock(&srcu, idx);
+
+	cleanup_srcu_struct(&srcu);
+}
+
+static struct crashtype crashtypes[] = {
+	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 = {
+	.crashtypes = crashtypes,
+	.len	    = ARRAY_SIZE(crashtypes),
+};
-- 
2.52.0.rc1.455.g30608eb744-goog
Re: [PATCH] lkdtm: Add lockdep related crash tests
Posted by kernel test robot 2 months, 3 weeks ago
Hi Tzung-Bi,

kernel test robot noticed the following build warnings:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on char-misc/char-misc-next char-misc/char-misc-linus kees/for-next/pstore kees/for-next/kspp soc/for-next linus/master v6.18-rc5 next-20251114]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Tzung-Bi-Shih/lkdtm-Add-lockdep-related-crash-tests/20251114-142702
base:   char-misc/char-misc-testing
patch link:    https://lore.kernel.org/r/20251114062535.1827309-1-tzungbi%40kernel.org
patch subject: [PATCH] lkdtm: Add lockdep related crash tests
config: parisc-defconfig (https://download.01.org/0day-ci/archive/20251115/202511152240.uaKhTU6M-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251115/202511152240.uaKhTU6M-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511152240.uaKhTU6M-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/misc/lkdtm/lockdep.c: In function 'lkdtm_LOCKDEP_CIRCULAR_LOCK':
>> drivers/misc/lkdtm/lockdep.c:21:48: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
      21 |                 scoped_guard(spinlock, &lock_B);
         |                                                ^
   drivers/misc/lkdtm/lockdep.c:23:48: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
      23 |                 scoped_guard(spinlock, &lock_A);
         |                                                ^
   drivers/misc/lkdtm/lockdep.c: In function 'lkdtm_LOCKDEP_INCONSISTENT_LOCK':
   drivers/misc/lkdtm/lockdep.c:37:40: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
      37 |         scoped_guard(spinlock, &lock_A);
         |                                        ^
   drivers/misc/lkdtm/lockdep.c:40:40: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
      40 |         scoped_guard(spinlock, &lock_A);
         |                                        ^


vim +/else +21 drivers/misc/lkdtm/lockdep.c

    16	
    17	/* For "WARNING: possible circular locking dependency detected". */
    18	static void lkdtm_LOCKDEP_CIRCULAR_LOCK(void)
    19	{
    20		scoped_guard(spinlock, &lock_A)
  > 21			scoped_guard(spinlock, &lock_B);
    22		scoped_guard(spinlock, &lock_B)
    23			scoped_guard(spinlock, &lock_A);
    24	}
    25	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki