diff options
author | jhb <jhb@FreeBSD.org> | 2006-06-26 18:34:45 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-06-26 18:34:45 +0000 |
commit | 2afb03cfd25ce5dd75eaf1cacbf498899600a4ec (patch) | |
tree | 6956b818699ae90a13394be5467f52d58a43aea9 /sys/kern/kern_module.c | |
parent | d7b0de5b872888470d605126b1157c13ce1b54ed (diff) | |
download | FreeBSD-src-2afb03cfd25ce5dd75eaf1cacbf498899600a4ec.zip FreeBSD-src-2afb03cfd25ce5dd75eaf1cacbf498899600a4ec.tar.gz |
Address a problem I missed in removing Giant from the kernel linker. Not
all of the module event handlers are MP safe yet, so always acquire Giant
for now when invoking module event handlers. Eventually we can add an
MPSAFE flag or some such and add appropriate locking to all module event
handlers.
Diffstat (limited to 'sys/kern/kern_module.c')
-rw-r--r-- | sys/kern/kern_module.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c index 9731717..fc6a3d3 100644 --- a/sys/kern/kern_module.c +++ b/sys/kern/kern_module.c @@ -99,10 +99,12 @@ module_shutdown(void *arg1, int arg2) if (arg2 & RB_NOSYNC) return; + mtx_lock(&Giant); MOD_SLOCK; TAILQ_FOREACH(mod, &modules, link) MOD_EVENT(mod, MOD_SHUTDOWN); MOD_SUNLOCK; + mtx_unlock(&Giant); } void @@ -112,6 +114,7 @@ module_register_init(const void *arg) int error; module_t mod; + mtx_lock(&Giant); MOD_SLOCK; mod = module_lookupbyname(data->name); if (mod == NULL) @@ -128,6 +131,7 @@ module_register_init(const void *arg) " %d\n", data->name, (void *)data->evhand, data->priv, error); } + mtx_unlock(&Giant); } int @@ -232,12 +236,14 @@ module_unload(module_t mod, int flags) { int error; + mtx_lock(&Giant); error = MOD_EVENT(mod, MOD_QUIESCE); if (error == EOPNOTSUPP || error == EINVAL) error = 0; - if (flags == LINKER_UNLOAD_NORMAL && error != 0) - return (error); - return (MOD_EVENT(mod, MOD_UNLOAD)); + if (error == 0 || flags == LINKER_UNLOAD_FORCE) + error = MOD_EVENT(mod, MOD_UNLOAD); + mtx_unlock(&Giant); + return (error); } int |