mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	lockdep,trace: Expose tracepoints
The lockdep tracepoints are under the lockdep recursion counter, this has a bunch of nasty side effects: - TRACE_IRQFLAGS doesn't work across the entire tracepoint - RCU-lockdep doesn't see the tracepoints either, hiding numerous "suspicious RCU usage" warnings. Pull the trace_lock_*() tracepoints completely out from under the lockdep recursion handling and completely rely on the trace level recusion handling -- also, tracing *SHOULD* not be taking locks in any case. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Marco Elver <elver@google.com> Link: https://lkml.kernel.org/r/20200821085348.782688941@infradead.org
This commit is contained in:
		
							parent
							
								
									044d0d6de9
								
							
						
					
					
						commit
						eb1f00237a
					
				
					 1 changed files with 9 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -4977,6 +4977,8 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
 | 
			
		|||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip);
 | 
			
		||||
 | 
			
		||||
	if (unlikely(current->lockdep_recursion)) {
 | 
			
		||||
		/* XXX allow trylock from NMI ?!? */
 | 
			
		||||
		if (lockdep_nmi() && !trylock) {
 | 
			
		||||
| 
						 | 
				
			
			@ -5001,7 +5003,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
 | 
			
		|||
	check_flags(flags);
 | 
			
		||||
 | 
			
		||||
	current->lockdep_recursion++;
 | 
			
		||||
	trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip);
 | 
			
		||||
	__lock_acquire(lock, subclass, trylock, read, check,
 | 
			
		||||
		       irqs_disabled_flags(flags), nest_lock, ip, 0, 0);
 | 
			
		||||
	lockdep_recursion_finish();
 | 
			
		||||
| 
						 | 
				
			
			@ -5013,13 +5014,15 @@ void lock_release(struct lockdep_map *lock, unsigned long ip)
 | 
			
		|||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	trace_lock_release(lock, ip);
 | 
			
		||||
 | 
			
		||||
	if (unlikely(current->lockdep_recursion))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	raw_local_irq_save(flags);
 | 
			
		||||
	check_flags(flags);
 | 
			
		||||
 | 
			
		||||
	current->lockdep_recursion++;
 | 
			
		||||
	trace_lock_release(lock, ip);
 | 
			
		||||
	if (__lock_release(lock, ip))
 | 
			
		||||
		check_chain_key(current);
 | 
			
		||||
	lockdep_recursion_finish();
 | 
			
		||||
| 
						 | 
				
			
			@ -5205,8 +5208,6 @@ __lock_acquired(struct lockdep_map *lock, unsigned long ip)
 | 
			
		|||
		hlock->holdtime_stamp = now;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	trace_lock_acquired(lock, ip);
 | 
			
		||||
 | 
			
		||||
	stats = get_lock_stats(hlock_class(hlock));
 | 
			
		||||
	if (waittime) {
 | 
			
		||||
		if (hlock->read)
 | 
			
		||||
| 
						 | 
				
			
			@ -5225,6 +5226,8 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)
 | 
			
		|||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	trace_lock_acquired(lock, ip);
 | 
			
		||||
 | 
			
		||||
	if (unlikely(!lock_stat || !debug_locks))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5234,7 +5237,6 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)
 | 
			
		|||
	raw_local_irq_save(flags);
 | 
			
		||||
	check_flags(flags);
 | 
			
		||||
	current->lockdep_recursion++;
 | 
			
		||||
	trace_lock_contended(lock, ip);
 | 
			
		||||
	__lock_contended(lock, ip);
 | 
			
		||||
	lockdep_recursion_finish();
 | 
			
		||||
	raw_local_irq_restore(flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -5245,6 +5247,8 @@ void lock_acquired(struct lockdep_map *lock, unsigned long ip)
 | 
			
		|||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	trace_lock_contended(lock, ip);
 | 
			
		||||
 | 
			
		||||
	if (unlikely(!lock_stat || !debug_locks))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue