forked from Minki/linux
module: Unlink module with RCU synchronizing instead of stop_machine
Unlink module from module list with RCU synchronizing instead of using stop_machine(). Since module list is already protected by rcu, we don't need stop_machine() anymore. Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
4f48795b61
commit
461e34aed0
@ -1697,18 +1697,6 @@ static void mod_sysfs_teardown(struct module *mod)
|
||||
mod_sysfs_fini(mod);
|
||||
}
|
||||
|
||||
/*
|
||||
* unlink the module with the whole machine is stopped with interrupts off
|
||||
* - this defends against kallsyms not taking locks
|
||||
*/
|
||||
static int __unlink_module(void *_mod)
|
||||
{
|
||||
struct module *mod = _mod;
|
||||
list_del(&mod->list);
|
||||
module_bug_cleanup(mod);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
||||
/*
|
||||
* LKM RO/NX protection: protect module's text/ro-data
|
||||
@ -1860,7 +1848,11 @@ static void free_module(struct module *mod)
|
||||
|
||||
/* Now we can delete it from the lists */
|
||||
mutex_lock(&module_mutex);
|
||||
stop_machine(__unlink_module, mod, NULL);
|
||||
/* Unlink carefully: kallsyms could be walking list. */
|
||||
list_del_rcu(&mod->list);
|
||||
/* Wait for RCU synchronizing before releasing mod->list. */
|
||||
synchronize_rcu();
|
||||
module_bug_cleanup(mod);
|
||||
mutex_unlock(&module_mutex);
|
||||
|
||||
/* This may be NULL, but that's OK */
|
||||
|
Loading…
Reference in New Issue
Block a user