static_call: Fix static_call_text_reserved() vs __init
It turns out that static_call_text_reserved() was reporting __init
text as being reserved past the time when the __init text was freed
and re-used.
This is mostly harmless and will at worst result in refusing a kprobe.
Fixes: 6333e8f73b ("static_call: Avoid kprobes on inline static_call()s")
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Link: https://lore.kernel.org/r/20210628113045.106211657@infradead.org
			
			
This commit is contained in:
		
							parent
							
								
									9e667624c2
								
							
						
					
					
						commit
						2bee6d16e4
					
				| @ -292,13 +292,15 @@ static int addr_conflict(struct static_call_site *site, void *start, void *end) | ||||
| 
 | ||||
| static int __static_call_text_reserved(struct static_call_site *iter_start, | ||||
| 				       struct static_call_site *iter_stop, | ||||
| 				       void *start, void *end) | ||||
| 				       void *start, void *end, bool init) | ||||
| { | ||||
| 	struct static_call_site *iter = iter_start; | ||||
| 
 | ||||
| 	while (iter < iter_stop) { | ||||
| 		if (addr_conflict(iter, start, end)) | ||||
| 			return 1; | ||||
| 		if (init || !static_call_is_init(iter)) { | ||||
| 			if (addr_conflict(iter, start, end)) | ||||
| 				return 1; | ||||
| 		} | ||||
| 		iter++; | ||||
| 	} | ||||
| 
 | ||||
| @ -324,7 +326,7 @@ static int __static_call_mod_text_reserved(void *start, void *end) | ||||
| 
 | ||||
| 	ret = __static_call_text_reserved(mod->static_call_sites, | ||||
| 			mod->static_call_sites + mod->num_static_call_sites, | ||||
| 			start, end); | ||||
| 			start, end, mod->state == MODULE_STATE_COMING); | ||||
| 
 | ||||
| 	module_put(mod); | ||||
| 
 | ||||
| @ -459,8 +461,9 @@ static inline int __static_call_mod_text_reserved(void *start, void *end) | ||||
| 
 | ||||
| int static_call_text_reserved(void *start, void *end) | ||||
| { | ||||
| 	bool init = system_state < SYSTEM_RUNNING; | ||||
| 	int ret = __static_call_text_reserved(__start_static_call_sites, | ||||
| 			__stop_static_call_sites, start, end); | ||||
| 			__stop_static_call_sites, start, end, init); | ||||
| 
 | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user