locking/lockdep: Make it easy to detect whether or not inside a selftest
authorBart Van Assche <bvanassche@acm.org>
Thu, 14 Feb 2019 23:00:44 +0000 (15:00 -0800)
committerIngo Molnar <mingo@kernel.org>
Thu, 28 Feb 2019 06:55:43 +0000 (07:55 +0100)
The patch that frees unused lock classes will modify the behavior of
lockdep_free_key_range() and lockdep_reset_lock() depending on whether
or not these functions are called from the context of the lockdep
selftests. Hence make it easy to detect whether or not lockdep code
is called from the context of a lockdep selftest.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Waiman Long <longman@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: johannes.berg@intel.com
Cc: tj@kernel.org
Link: https://lkml.kernel.org/r/20190214230058.196511-10-bvanassche@acm.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/linux/lockdep.h
kernel/locking/lockdep.c
lib/locking-selftest.c

index b5e6bfe0ae4a70cac69fc0ef4348c8671b56288e..66eee1ba0f2a6488dadd9e49e8afe813bee77421 100644 (file)
@@ -265,6 +265,7 @@ extern void lockdep_reset(void);
 extern void lockdep_reset_lock(struct lockdep_map *lock);
 extern void lockdep_free_key_range(void *start, unsigned long size);
 extern asmlinkage void lockdep_sys_exit(void);
+extern void lockdep_set_selftest_task(struct task_struct *task);
 
 extern void lockdep_off(void);
 extern void lockdep_on(void);
@@ -395,6 +396,10 @@ static inline void lockdep_on(void)
 {
 }
 
+static inline void lockdep_set_selftest_task(struct task_struct *task)
+{
+}
+
 # define lock_acquire(l, s, t, r, c, n, i)     do { } while (0)
 # define lock_release(l, n, i)                 do { } while (0)
 # define lock_downgrade(l, i)                  do { } while (0)
index 2d4c21a02546ea52e81acc2c77b788c532c11db6..34cd87c65f5d659a75d4ffe9943d8a2256fe5288 100644 (file)
@@ -81,6 +81,7 @@ module_param(lock_stat, int, 0644);
  * code to recurse back into the lockdep code...
  */
 static arch_spinlock_t lockdep_lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;
+static struct task_struct *lockdep_selftest_task_struct;
 
 static int graph_lock(void)
 {
@@ -331,6 +332,11 @@ void lockdep_on(void)
 }
 EXPORT_SYMBOL(lockdep_on);
 
+void lockdep_set_selftest_task(struct task_struct *task)
+{
+       lockdep_selftest_task_struct = task;
+}
+
 /*
  * Debugging switches:
  */
index 1e1bbf171eca4076a39383d51b75224dbb4099d0..a1705545e6ac3474df78e131aed0bdd8fcbd38db 100644 (file)
@@ -1989,6 +1989,7 @@ void locking_selftest(void)
 
        init_shared_classes();
        debug_locks_silent = !debug_locks_verbose;
+       lockdep_set_selftest_task(current);
 
        DO_TESTCASE_6R("A-A deadlock", AA);
        DO_TESTCASE_6R("A-B-B-A deadlock", ABBA);
@@ -2097,5 +2098,6 @@ void locking_selftest(void)
                printk("---------------------------------\n");
                debug_locks = 1;
        }
+       lockdep_set_selftest_task(NULL);
        debug_locks_silent = 0;
 }