]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
lockdep/lib/tests: Test dynamic key registration
authorBart Van Assche <bvanassche@acm.org>
Thu, 14 Feb 2019 23:00:58 +0000 (15:00 -0800)
committerIngo Molnar <mingo@kernel.org>
Thu, 28 Feb 2019 06:55:48 +0000 (07:55 +0100)
Make sure that the lockdep_register_key() and lockdep_unregister_key()
code is tested when running the lockdep tests.

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-24-bvanassche@acm.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
tools/lib/lockdep/include/liblockdep/common.h
tools/lib/lockdep/include/liblockdep/mutex.h
tools/lib/lockdep/tests/ABBA.c

index d640a9761f09c87894bbc9fac3f6e24935c523e9..a81d91d4fc788677acbbdee1f26fdb06148b2e14 100644 (file)
@@ -45,6 +45,8 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
 void lock_release(struct lockdep_map *lock, int nested,
                        unsigned long ip);
 void lockdep_reset_lock(struct lockdep_map *lock);
+void lockdep_register_key(struct lock_class_key *key);
+void lockdep_unregister_key(struct lock_class_key *key);
 extern void debug_check_no_locks_freed(const void *from, unsigned long len);
 
 #define STATIC_LOCKDEP_MAP_INIT(_name, _key) \
index 2073d4e1f2f08fc8966a9a57fa31a64d7430e823..783dd0df06f9b1a4f89cf992c0aea7ee8ac61b4d 100644 (file)
@@ -7,6 +7,7 @@
 
 struct liblockdep_pthread_mutex {
        pthread_mutex_t mutex;
+       struct lock_class_key key;
        struct lockdep_map dep_map;
 };
 
@@ -27,11 +28,10 @@ static inline int __mutex_init(liblockdep_pthread_mutex_t *lock,
        return pthread_mutex_init(&lock->mutex, __mutexattr);
 }
 
-#define liblockdep_pthread_mutex_init(mutex, mutexattr)                \
-({                                                             \
-       static struct lock_class_key __key;                     \
-                                                               \
-       __mutex_init((mutex), #mutex, &__key, (mutexattr));     \
+#define liblockdep_pthread_mutex_init(mutex, mutexattr)                        \
+({                                                                     \
+       lockdep_register_key(&(mutex)->key);                            \
+       __mutex_init((mutex), #mutex, &(mutex)->key, (mutexattr));      \
 })
 
 static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock)
@@ -55,6 +55,7 @@ static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *l
 static inline int liblockdep_pthread_mutex_destroy(liblockdep_pthread_mutex_t *lock)
 {
        lockdep_reset_lock(&lock->dep_map);
+       lockdep_unregister_key(&lock->key);
        return pthread_mutex_destroy(&lock->mutex);
 }
 
index 623313f5472095b302f6a0f3ce787f127ec65ab6..543789bc3e375c1f40d49c5027ad922f44b86ea9 100644 (file)
@@ -14,4 +14,13 @@ void main(void)
 
        pthread_mutex_destroy(&b);
        pthread_mutex_destroy(&a);
+
+       pthread_mutex_init(&a, NULL);
+       pthread_mutex_init(&b, NULL);
+
+       LOCK_UNLOCK_2(a, b);
+       LOCK_UNLOCK_2(b, a);
+
+       pthread_mutex_destroy(&b);
+       pthread_mutex_destroy(&a);
 }