diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/module.c b/kernel/module.c index 3e0e19763d24..b86b7bf1be38 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -602,13 +602,16 @@ const struct kernel_symbol *find_symbol(const char *name, | |||
602 | } | 602 | } |
603 | EXPORT_SYMBOL_GPL(find_symbol); | 603 | EXPORT_SYMBOL_GPL(find_symbol); |
604 | 604 | ||
605 | /* Search for module by name: must hold module_mutex. */ | 605 | /* |
606 | * Search for module by name: must hold module_mutex (or preempt disabled | ||
607 | * for read-only access). | ||
608 | */ | ||
606 | static struct module *find_module_all(const char *name, size_t len, | 609 | static struct module *find_module_all(const char *name, size_t len, |
607 | bool even_unformed) | 610 | bool even_unformed) |
608 | { | 611 | { |
609 | struct module *mod; | 612 | struct module *mod; |
610 | 613 | ||
611 | module_assert_mutex(); | 614 | module_assert_mutex_or_preempt(); |
612 | 615 | ||
613 | list_for_each_entry(mod, &modules, list) { | 616 | list_for_each_entry(mod, &modules, list) { |
614 | if (!even_unformed && mod->state == MODULE_STATE_UNFORMED) | 617 | if (!even_unformed && mod->state == MODULE_STATE_UNFORMED) |
@@ -621,6 +624,7 @@ static struct module *find_module_all(const char *name, size_t len, | |||
621 | 624 | ||
622 | struct module *find_module(const char *name) | 625 | struct module *find_module(const char *name) |
623 | { | 626 | { |
627 | module_assert_mutex(); | ||
624 | return find_module_all(name, strlen(name), false); | 628 | return find_module_all(name, strlen(name), false); |
625 | } | 629 | } |
626 | EXPORT_SYMBOL_GPL(find_module); | 630 | EXPORT_SYMBOL_GPL(find_module); |
@@ -3557,6 +3561,7 @@ static int load_module(struct load_info *info, const char __user *uargs, | |||
3557 | mutex_lock(&module_mutex); | 3561 | mutex_lock(&module_mutex); |
3558 | /* Unlink carefully: kallsyms could be walking list. */ | 3562 | /* Unlink carefully: kallsyms could be walking list. */ |
3559 | list_del_rcu(&mod->list); | 3563 | list_del_rcu(&mod->list); |
3564 | mod_tree_remove(mod); | ||
3560 | wake_up_all(&module_wq); | 3565 | wake_up_all(&module_wq); |
3561 | /* Wait for RCU-sched synchronizing before releasing mod->list. */ | 3566 | /* Wait for RCU-sched synchronizing before releasing mod->list. */ |
3562 | synchronize_sched(); | 3567 | synchronize_sched(); |