Commit 7d9dda6f authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Petr Pavlu
Browse files

module: Allow __module_address() to be called from RCU section.



mod_find() uses either the modules list to find a module or a tree
lookup (CONFIG_MODULES_TREE_LOOKUP). The list and the tree can both be
iterated under RCU assumption (as well as RCU-sched).

Remove module_assert_mutex_or_preempt() from __module_address() and
entirely since __module_address() is the last user.
Update comments.

Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250108090457.512198-13-bigeasy@linutronix.de


Signed-off-by: default avatarPetr Pavlu <petr.pavlu@suse.com>
parent 2bee0177
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -124,17 +124,6 @@ char *module_next_tag_pair(char *string, unsigned long *secsize);
#define for_each_modinfo_entry(entry, info, name) \
	for (entry = get_modinfo(info, name); entry; entry = get_next_modinfo(info, name, entry))

static inline void module_assert_mutex_or_preempt(void)
{
#ifdef CONFIG_LOCKDEP
	if (unlikely(!debug_locks))
		return;

	WARN_ON_ONCE(!rcu_read_lock_sched_held() &&
		     !lockdep_is_held(&module_mutex));
#endif
}

static inline unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
{
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+1 −3
Original line number Diff line number Diff line
@@ -3749,7 +3749,7 @@ bool is_module_address(unsigned long addr)
 * __module_address() - get the module which contains an address.
 * @addr: the address.
 *
 * Must be called with preempt disabled or module mutex held so that
 * Must be called within RCU read section or module mutex held so that
 * module doesn't get freed during this.
 */
struct module *__module_address(unsigned long addr)
@@ -3767,8 +3767,6 @@ struct module *__module_address(unsigned long addr)
	return NULL;

lookup:
	module_assert_mutex_or_preempt();

	mod = mod_find(addr, &mod_tree);
	if (mod) {
		BUG_ON(!within_module(addr, mod));