mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	unwind: Add USED bit to only have one conditional on way back to user space
On the way back to user space, the function unwind_reset_info() is called unconditionally (but always inlined). It currently has two conditionals. One that checks the unwind_mask which is set whenever a deferred trace is called and is used to know that the mask needs to be cleared. The other checks if the cache has been allocated, and if so, it resets the nr_entries so that the unwinder knows it needs to do the work to get a new user space stack trace again (it only does it once per entering the kernel). Use one of the bits in the unwind mask as a "USED" bit that gets set whenever a trace is created. This will make it possible to only check the unwind_mask in the unwind_reset_info() to know if it needs to do work or not and eliminates a conditional that happens every time the task goes back to user space. Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Josh Poimboeuf <jpoimboe@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Andrii Nakryiko <andrii@kernel.org> Cc: Indu Bhagat <indu.bhagat@oracle.com> Cc: "Jose E. Marchesi" <jemarch@gnu.org> Cc: Beau Belgrave <beaub@linux.microsoft.com> Cc: Jens Remus <jremus@linux.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Florian Weimer <fweimer@redhat.com> Cc: Sam James <sam@gentoo.org> Link: https://lore.kernel.org/20250729182406.155422551@kernel.org Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									4c75133e74
								
							
						
					
					
						commit
						858fa8a3b0
					
				
					 2 changed files with 13 additions and 10 deletions
				
			
		|  | @ -20,10 +20,14 @@ struct unwind_work { | |||
| 
 | ||||
| enum { | ||||
| 	UNWIND_PENDING_BIT = 0, | ||||
| 	UNWIND_USED_BIT, | ||||
| }; | ||||
| 
 | ||||
| enum { | ||||
| 	UNWIND_PENDING		= BIT(UNWIND_PENDING_BIT), | ||||
| 
 | ||||
| 	/* Set if the unwinding was used (directly or deferred) */ | ||||
| 	UNWIND_USED		= BIT(UNWIND_USED_BIT) | ||||
| }; | ||||
| 
 | ||||
| void unwind_task_init(struct task_struct *task); | ||||
|  | @ -49,15 +53,11 @@ static __always_inline void unwind_reset_info(void) | |||
| 				return; | ||||
| 		} while (!try_cmpxchg(&info->unwind_mask, &bits, 0UL)); | ||||
| 		current->unwind_info.id.id = 0; | ||||
| 	} | ||||
| 	/*
 | ||||
| 	 * As unwind_user_faultable() can be called directly and | ||||
| 	 * depends on nr_entries being cleared on exit to user, | ||||
| 	 * this needs to be a separate conditional. | ||||
| 	 */ | ||||
| 	if (unlikely(info->cache)) { | ||||
| 		info->cache->nr_entries = 0; | ||||
| 		info->cache->unwind_completed = 0; | ||||
| 
 | ||||
| 		if (unlikely(info->cache)) { | ||||
| 			info->cache->nr_entries = 0; | ||||
| 			info->cache->unwind_completed = 0; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ static inline bool try_assign_cnt(struct unwind_task_info *info, u32 cnt) | |||
| static DEFINE_MUTEX(callback_mutex); | ||||
| static LIST_HEAD(callbacks); | ||||
| 
 | ||||
| #define RESERVED_BITS	(UNWIND_PENDING) | ||||
| #define RESERVED_BITS	(UNWIND_PENDING | UNWIND_USED) | ||||
| 
 | ||||
| /* Zero'd bits are available for assigning callback users */ | ||||
| static unsigned long unwind_mask = RESERVED_BITS; | ||||
|  | @ -140,6 +140,9 @@ int unwind_user_faultable(struct unwind_stacktrace *trace) | |||
| 
 | ||||
| 	cache->nr_entries = trace->nr; | ||||
| 
 | ||||
| 	/* Clear nr_entries on way back to user space */ | ||||
| 	set_bit(UNWIND_USED_BIT, &info->unwind_mask); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Steven Rostedt
						Steven Rostedt