mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	module: Use RCU in find_module_all().
The modules list and module::kallsyms can be accessed under RCU assumption. Remove module_assert_mutex_or_preempt() from find_module_all() so it can be used under RCU protection without warnings. Update its callers to use RCU protection instead of preempt_disable(). Cc: Jiri Kosina <jikos@kernel.org> Cc: Joe Lawrence <joe.lawrence@redhat.com> Cc: Josh Poimboeuf <jpoimboe@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Miroslav Benes <mbenes@suse.cz> Cc: Petr Mladek <pmladek@suse.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: linux-trace-kernel@vger.kernel.org Cc: live-patching@vger.kernel.org Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/20250108090457.512198-7-bigeasy@linutronix.de Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
This commit is contained in:
		
							parent
							
								
									c4fadf38de
								
							
						
					
					
						commit
						febaa65c94
					
				
					 5 changed files with 8 additions and 14 deletions
				
			
		|  | @ -666,7 +666,7 @@ static inline bool within_module(unsigned long addr, const struct module *mod) | |||
| 	return within_module_init(addr, mod) || within_module_core(addr, mod); | ||||
| } | ||||
| 
 | ||||
| /* Search for module by name: must be in a RCU-sched critical section. */ | ||||
| /* Search for module by name: must be in a RCU critical section. */ | ||||
| struct module *find_module(const char *name); | ||||
| 
 | ||||
| extern void __noreturn __module_put_and_kthread_exit(struct module *mod, | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ static void klp_find_object_module(struct klp_object *obj) | |||
| 	if (!klp_is_module(obj)) | ||||
| 		return; | ||||
| 
 | ||||
| 	rcu_read_lock_sched(); | ||||
| 	guard(rcu)(); | ||||
| 	/*
 | ||||
| 	 * We do not want to block removal of patched modules and therefore | ||||
| 	 * we do not take a reference here. The patches are removed by | ||||
|  | @ -75,8 +75,6 @@ static void klp_find_object_module(struct klp_object *obj) | |||
| 	 */ | ||||
| 	if (mod && mod->klp_alive) | ||||
| 		obj->mod = mod; | ||||
| 
 | ||||
| 	rcu_read_unlock_sched(); | ||||
| } | ||||
| 
 | ||||
| static bool klp_initialized(void) | ||||
|  |  | |||
|  | @ -450,6 +450,7 @@ unsigned long module_kallsyms_lookup_name(const char *name) | |||
| 	unsigned long ret; | ||||
| 
 | ||||
| 	/* Don't lock: we're in enough trouble already. */ | ||||
| 	guard(rcu)(); | ||||
| 	preempt_disable(); | ||||
| 	ret = __module_kallsyms_lookup_name(name); | ||||
| 	preempt_enable(); | ||||
|  |  | |||
|  | @ -374,16 +374,14 @@ bool find_symbol(struct find_symbol_arg *fsa) | |||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Search for module by name: must hold module_mutex (or preempt disabled | ||||
|  * for read-only access). | ||||
|  * Search for module by name: must hold module_mutex (or RCU for read-only | ||||
|  * access). | ||||
|  */ | ||||
| struct module *find_module_all(const char *name, size_t len, | ||||
| 			       bool even_unformed) | ||||
| { | ||||
| 	struct module *mod; | ||||
| 
 | ||||
| 	module_assert_mutex_or_preempt(); | ||||
| 
 | ||||
| 	list_for_each_entry_rcu(mod, &modules, list, | ||||
| 				lockdep_is_held(&module_mutex)) { | ||||
| 		if (!even_unformed && mod->state == MODULE_STATE_UNFORMED) | ||||
|  |  | |||
|  | @ -124,9 +124,8 @@ static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) | |||
| 	if (!p) | ||||
| 		return true; | ||||
| 	*p = '\0'; | ||||
| 	rcu_read_lock_sched(); | ||||
| 	scoped_guard(rcu) | ||||
| 		ret = !!find_module(tk->symbol); | ||||
| 	rcu_read_unlock_sched(); | ||||
| 	*p = ':'; | ||||
| 
 | ||||
| 	return ret; | ||||
|  | @ -796,12 +795,10 @@ static struct module *try_module_get_by_name(const char *name) | |||
| { | ||||
| 	struct module *mod; | ||||
| 
 | ||||
| 	rcu_read_lock_sched(); | ||||
| 	guard(rcu)(); | ||||
| 	mod = find_module(name); | ||||
| 	if (mod && !try_module_get(mod)) | ||||
| 		mod = NULL; | ||||
| 	rcu_read_unlock_sched(); | ||||
| 
 | ||||
| 	return mod; | ||||
| } | ||||
| #else | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Sebastian Andrzej Siewior
						Sebastian Andrzej Siewior