]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
locking/lockdep: Use lockdep_init_task for task initiation consistently
authorYuyang Du <duyuyang@gmail.com>
Mon, 6 May 2019 08:19:23 +0000 (16:19 +0800)
committerIngo Molnar <mingo@kernel.org>
Mon, 3 Jun 2019 09:55:42 +0000 (11:55 +0200)
Despite that there is a lockdep_init_task() which does nothing, lockdep
initiates tasks by assigning lockdep fields and does so inconsistently. Fix
this by using lockdep_init_task().

Signed-off-by: Yuyang Du <duyuyang@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: bvanassche@acm.org
Cc: frederic@kernel.org
Cc: ming.lei@redhat.com
Cc: will.deacon@arm.com
Link: https://lkml.kernel.org/r/20190506081939.74287-8-duyuyang@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/linux/lockdep.h
init/init_task.c
kernel/fork.c
kernel/locking/lockdep.c

index 851d44fa5457e017287bdeb02bb7b497a97d57d9..5d05b8149f19aff93c304e5a438de0c3345ec7a4 100644 (file)
@@ -287,6 +287,8 @@ 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_init_task(struct task_struct *task);
+
 extern void lockdep_off(void);
 extern void lockdep_on(void);
 
@@ -411,6 +413,10 @@ extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie);
 
 #else /* !CONFIG_LOCKDEP */
 
+static inline void lockdep_init_task(struct task_struct *task)
+{
+}
+
 static inline void lockdep_off(void)
 {
 }
@@ -503,7 +509,6 @@ enum xhlock_context_t {
        { .name = (_name), .key = (void *)(_key), }
 
 static inline void lockdep_invariant_state(bool force) {}
-static inline void lockdep_init_task(struct task_struct *task) {}
 static inline void lockdep_free_task(struct task_struct *task) {}
 
 #ifdef CONFIG_LOCK_STAT
index c70ef656d0f40cf4fc603d0a7dbb70ba1820af73..1b15cb90d64fab3abfaa1deadc1738df40906453 100644 (file)
@@ -166,6 +166,8 @@ struct task_struct init_task
        .softirqs_enabled = 1,
 #endif
 #ifdef CONFIG_LOCKDEP
+       .lockdep_depth = 0, /* no locks held yet */
+       .curr_chain_key = 0,
        .lockdep_recursion = 0,
 #endif
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
index 75675b9bf6dfd36066336c384e007de312f54004..735d0b4a89e2c31b1a062acd2c444ac890000f88 100644 (file)
@@ -1984,9 +1984,6 @@ static __latent_entropy struct task_struct *copy_process(
        p->pagefault_disabled = 0;
 
 #ifdef CONFIG_LOCKDEP
-       p->lockdep_depth = 0; /* no locks held yet */
-       p->curr_chain_key = 0;
-       p->lockdep_recursion = 0;
        lockdep_init_task(p);
 #endif
 
index bc1efc12a8c51f2c59863a726cc8b5e3052ca5d7..b7d9c28ecf3b789e1ed53a08579645d511f8bc1c 100644 (file)
@@ -359,6 +359,13 @@ static inline u64 iterate_chain_key(u64 key, u32 idx)
        return k0 | (u64)k1 << 32;
 }
 
+void lockdep_init_task(struct task_struct *task)
+{
+       task->lockdep_depth = 0; /* no locks held yet */
+       task->curr_chain_key = 0;
+       task->lockdep_recursion = 0;
+}
+
 void lockdep_off(void)
 {
        current->lockdep_recursion++;
@@ -4589,9 +4596,7 @@ void lockdep_reset(void)
        int i;
 
        raw_local_irq_save(flags);
-       current->curr_chain_key = 0;
-       current->lockdep_depth = 0;
-       current->lockdep_recursion = 0;
+       lockdep_init_task(current);
        memset(current->held_locks, 0, MAX_LOCK_DEPTH*sizeof(struct held_lock));
        nr_hardirq_chains = 0;
        nr_softirq_chains = 0;