Skip to content

Commit

Permalink
kallsyms: refactor {,module_}kallsyms_on_each_symbol
Browse files Browse the repository at this point in the history
Require an explicit call to module_kallsyms_on_each_symbol to look
for symbols in modules instead of the call from kallsyms_on_each_symbol,
and acquire module_mutex inside of module_kallsyms_on_each_symbol instead
of leaving that up to the caller.  Note that this slightly changes the
behavior for the livepatch code in that the symbols from vmlinux are not
iterated anymore if objname is set, but that actually is the desired
behavior in this case.

Reviewed-by: Petr Mladek <[email protected]>
Acked-by: Miroslav Benes <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Jessica Yu <[email protected]>
  • Loading branch information
Christoph Hellwig authored and Jessica Yu committed Feb 8, 2021
1 parent a006050 commit 013c166
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 12 deletions.
6 changes: 5 additions & 1 deletion kernel/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,10 @@ unsigned long kallsyms_lookup_name(const char *name)
return module_kallsyms_lookup_name(name);
}

/*
* Iterate over all symbols in vmlinux. For symbols from modules use
* module_kallsyms_on_each_symbol instead.
*/
int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
unsigned long),
void *data)
Expand All @@ -192,7 +196,7 @@ int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
if (ret != 0)
return ret;
}
return module_kallsyms_on_each_symbol(fn, data);
return 0;
}

static unsigned long get_symbol_pos(unsigned long addr,
Expand Down
2 changes: 0 additions & 2 deletions kernel/livepatch/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,10 @@ static int klp_find_object_symbol(const char *objname, const char *name,
.pos = sympos,
};

mutex_lock(&module_mutex);
if (objname)
module_kallsyms_on_each_symbol(klp_find_callback, &args);
else
kallsyms_on_each_symbol(klp_find_callback, &args);
mutex_unlock(&module_mutex);

/*
* Ensure an address was found. If sympos is 0, ensure symbol is unique;
Expand Down
13 changes: 4 additions & 9 deletions kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,11 +255,6 @@ static void mod_update_bounds(struct module *mod)
struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
#endif /* CONFIG_KGDB_KDB */

static void module_assert_mutex(void)
{
lockdep_assert_held(&module_mutex);
}

static void module_assert_mutex_or_preempt(void)
{
#ifdef CONFIG_LOCKDEP
Expand Down Expand Up @@ -4501,8 +4496,7 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
unsigned int i;
int ret;

module_assert_mutex();

mutex_lock(&module_mutex);
list_for_each_entry(mod, &modules, list) {
/* We hold module_mutex: no need for rcu_dereference_sched */
struct mod_kallsyms *kallsyms = mod->kallsyms;
Expand All @@ -4518,10 +4512,11 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
ret = fn(data, kallsyms_symbol_name(kallsyms, i),
mod, kallsyms_symbol_value(sym));
if (ret != 0)
return ret;
break;
}
}
return 0;
mutex_unlock(&module_mutex);
return ret;
}
#endif /* CONFIG_KALLSYMS */

Expand Down

0 comments on commit 013c166

Please sign in to comment.