Commit 0db6e373 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

jump_label,module: Fix module lifetime for __jump_label_mod_text_reserved()

Nothing ensures the module exists while we're iterating
mod->jump_entries in __jump_label_mod_text_reserved(), take a module
reference to ensure the module sticks around.
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Reviewed-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Link: https://lore.kernel.org/r/20200818135804.504501338@infradead.org
parent 59cc8e0a
...@@ -539,19 +539,25 @@ static void static_key_set_mod(struct static_key *key, ...@@ -539,19 +539,25 @@ static void static_key_set_mod(struct static_key *key,
static int __jump_label_mod_text_reserved(void *start, void *end) static int __jump_label_mod_text_reserved(void *start, void *end)
{ {
struct module *mod; struct module *mod;
int ret;
preempt_disable(); preempt_disable();
mod = __module_text_address((unsigned long)start); mod = __module_text_address((unsigned long)start);
WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod); WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod);
if (!try_module_get(mod))
mod = NULL;
preempt_enable(); preempt_enable();
if (!mod) if (!mod)
return 0; return 0;
ret = __jump_label_text_reserved(mod->jump_entries,
return __jump_label_text_reserved(mod->jump_entries,
mod->jump_entries + mod->num_jump_entries, mod->jump_entries + mod->num_jump_entries,
start, end); start, end);
module_put(mod);
return ret;
} }
static void __jump_label_mod_update(struct static_key *key) static void __jump_label_mod_update(struct static_key *key)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment