forked from mirrors/linux
		
	locking/lockdep: Move sanity check to inside lockdep_print_held_locks()
Calling lockdep_print_held_locks() on a running thread is considered unsafe. Since all callers should follow that rule and the sanity check is not heavy, this patch moves the sanity check to inside lockdep_print_held_locks(). As a side effect of this patch, the number of locks held by running threads will be printed as well. This change will be preferable when we want to know which threads might be relevant to a problem but are unable to print any clues because that thread is running. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Matthew Wilcox <willy@infradead.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1523011279-8206-2-git-send-email-penguin-kernel@I-love.SAKURA.ne.jp Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									0f736a52e4
								
							
						
					
					
						commit
						8cc05c71ba
					
				
					 1 changed files with 13 additions and 16 deletions
				
			
		|  | @ -561,20 +561,24 @@ static void print_lock(struct held_lock *hlock) | |||
| 	printk(KERN_CONT ", at: %pS\n", (void *)hlock->acquire_ip); | ||||
| } | ||||
| 
 | ||||
| static void lockdep_print_held_locks(struct task_struct *curr) | ||||
| static void lockdep_print_held_locks(struct task_struct *p) | ||||
| { | ||||
| 	int i, depth = curr->lockdep_depth; | ||||
| 	int i, depth = READ_ONCE(p->lockdep_depth); | ||||
| 
 | ||||
| 	if (!depth) { | ||||
| 		printk("no locks held by %s/%d.\n", curr->comm, task_pid_nr(curr)); | ||||
| 	if (!depth) | ||||
| 		printk("no locks held by %s/%d.\n", p->comm, task_pid_nr(p)); | ||||
| 	else | ||||
| 		printk("%d lock%s held by %s/%d:\n", depth, | ||||
| 		       depth > 1 ? "s" : "", p->comm, task_pid_nr(p)); | ||||
| 	/*
 | ||||
| 	 * It's not reliable to print a task's held locks if it's not sleeping | ||||
| 	 * and it's not the current task. | ||||
| 	 */ | ||||
| 	if (p->state == TASK_RUNNING && p != current) | ||||
| 		return; | ||||
| 	} | ||||
| 	printk("%d lock%s held by %s/%d:\n", | ||||
| 		depth, depth > 1 ? "s" : "", curr->comm, task_pid_nr(curr)); | ||||
| 
 | ||||
| 	for (i = 0; i < depth; i++) { | ||||
| 		printk(" #%d: ", i); | ||||
| 		print_lock(curr->held_locks + i); | ||||
| 		print_lock(p->held_locks + i); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -4460,13 +4464,6 @@ void debug_show_all_locks(void) | |||
| 
 | ||||
| 	rcu_read_lock(); | ||||
| 	for_each_process_thread(g, p) { | ||||
| 		/*
 | ||||
| 		 * It's not reliable to print a task's held locks | ||||
| 		 * if it's not sleeping (or if it's not the current | ||||
| 		 * task): | ||||
| 		 */ | ||||
| 		if (p->state == TASK_RUNNING && p != current) | ||||
| 			continue; | ||||
| 		if (!p->lockdep_depth) | ||||
| 			continue; | ||||
| 		lockdep_print_held_locks(p); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tetsuo Handa
						Tetsuo Handa