summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_module.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-06-26 18:34:45 +0000
committerjhb <jhb@FreeBSD.org>2006-06-26 18:34:45 +0000
commit2afb03cfd25ce5dd75eaf1cacbf498899600a4ec (patch)
tree6956b818699ae90a13394be5467f52d58a43aea9 /sys/kern/kern_module.c
parentd7b0de5b872888470d605126b1157c13ce1b54ed (diff)
downloadFreeBSD-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.c12
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
OpenPOWER on IntegriCloud