summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_eiface.c
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2005-02-05 08:28:36 +0000
committerru <ru@FreeBSD.org>2005-02-05 08:28:36 +0000
commit690fdeacb33ba6e423217f4f5304034ef686e14f (patch)
treebfef15bd02ae3fbb3862287846c919bc7439e24a /sys/netgraph/ng_eiface.c
parent7fde123e3aaa0702eb5ae71dc1a8b48e04f7e654 (diff)
downloadFreeBSD-src-690fdeacb33ba6e423217f4f5304034ef686e14f.zip
FreeBSD-src-690fdeacb33ba6e423217f4f5304034ef686e14f.tar.gz
Create a per-module mutex on MOD_LOAD, and destroy it on MOD_UNLOAD.
(This fixes witness_destroy() panic after module unload.) OK'ed by: rwatson, julian
Diffstat (limited to 'sys/netgraph/ng_eiface.c')
-rw-r--r--sys/netgraph/ng_eiface.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/netgraph/ng_eiface.c b/sys/netgraph/ng_eiface.c
index 6a711ca..e4f2198 100644
--- a/sys/netgraph/ng_eiface.c
+++ b/sys/netgraph/ng_eiface.c
@@ -92,6 +92,7 @@ static void ng_eiface_print_ioctl(struct ifnet *ifp, int cmd, caddr_t data);
#endif
/* Netgraph methods */
+static int ng_eiface_mod_event(module_t, int, void *);
static ng_constructor_t ng_eiface_constructor;
static ng_rcvmsg_t ng_eiface_rcvmsg;
static ng_shutdown_t ng_eiface_rmnode;
@@ -104,6 +105,7 @@ static ng_disconnect_t ng_eiface_disconnect;
static struct ng_type typestruct = {
.version = NG_ABI_VERSION,
.name = NG_EIFACE_NODE_TYPE,
+ .mod_event = ng_eiface_mod_event,
.constructor = ng_eiface_constructor,
.rcvmsg = ng_eiface_rcvmsg,
.shutdown = ng_eiface_rmnode,
@@ -124,7 +126,6 @@ static int ng_units_in_use = 0;
#define UNITS_BITSPERWORD (sizeof(*ng_eiface_units) * NBBY)
static struct mtx ng_eiface_mtx;
-MTX_SYSINIT(ng_eiface, &ng_eiface_mtx, "ng_eiface", MTX_DEF);
/************************************************************************
HELPER STUFF
@@ -665,3 +666,25 @@ ng_eiface_disconnect(hook_p hook)
priv->ether = NULL;
return (0);
}
+
+/*
+ * Handle loading and unloading for this node type.
+ */
+static int
+ng_eiface_mod_event(module_t mod, int event, void *data)
+{
+ int error = 0;
+
+ switch (event) {
+ case MOD_LOAD:
+ mtx_init(&ng_eiface_mtx, "ng_eiface", NULL, MTX_DEF);
+ break;
+ case MOD_UNLOAD:
+ mtx_destroy(&ng_eiface_mtx);
+ break;
+ default:
+ error = EOPNOTSUPP;
+ break;
+ }
+ return (error);
+}
OpenPOWER on IntegriCloud