PERFORCE change 49903 for review
Robert Watson
rwatson at FreeBSD.org
Mon Mar 29 10:57:18 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=49903
Change 49903 by rwatson at rwatson_tislabs on 2004/03/29 10:57:14
Integrate netperf_socket:
- Adopt conditional CALLOUT_MPSAFE initialization in UNIX domain
sockets looped back from rwatson_netperf.
- Conditionally assert Giant in UNIX domain socket callouts (looped
back from rwatson_netperf).
- Loop back structural/style changes in socket kqueue functions.
- Loop back if_tun global mutex locking from rwatson_netperf.
Affected files ...
.. //depot/projects/netperf_socket/sys/kern/uipc_domain.c#4 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#7 integrate
.. //depot/projects/netperf_socket/sys/net/if_tun.c#6 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/kern/uipc_domain.c#4 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_domain.c,v 1.34 2003/09/02 20:59:23 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_domain.c,v 1.35 2004/03/29 17:00:05 rwatson Exp $");
#include <sys/param.h>
#include <sys/socket.h>
@@ -134,8 +134,13 @@
if (max_linkhdr < 16) /* XXX */
max_linkhdr = 16;
- callout_init(&pffast_callout, CALLOUT_MPSAFE);
- callout_init(&pfslow_callout, CALLOUT_MPSAFE);
+ if (debug_mpsafenet) {
+ callout_init(&pffast_callout, CALLOUT_MPSAFE);
+ callout_init(&pfslow_callout, CALLOUT_MPSAFE);
+ } else {
+ callout_init(&pffast_callout, 0);
+ callout_init(&pfslow_callout, 0);
+ }
callout_reset(&pffast_callout, 1, pffasttimo, NULL);
callout_reset(&pfslow_callout, 1, pfslowtimo, NULL);
@@ -236,6 +241,8 @@
register struct domain *dp;
register struct protosw *pr;
+ NET_ASSERT_GIANT();
+
for (dp = domains; dp; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_slowtimo)
@@ -250,6 +257,8 @@
register struct domain *dp;
register struct protosw *pr;
+ NET_ASSERT_GIANT();
+
for (dp = domains; dp; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_fasttimo)
==== //depot/projects/netperf_socket/sys/kern/uipc_socket.c#7 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.165 2004/03/01 03:14:21 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.167 2004/03/29 18:06:15 rwatson Exp $");
#include "opt_inet.h"
#include "opt_mac.h"
@@ -1880,13 +1880,12 @@
kn->kn_flags |= EV_EOF;
kn->kn_fflags = so->so_error;
result = 1;
- } else if (so->so_error) { /* temporary udp error */
+ } else if (so->so_error) /* temporary udp error */
result = 1;
- } else if (kn->kn_sfflags & NOTE_LOWAT) {
+ else if (kn->kn_sfflags & NOTE_LOWAT)
result = (kn->kn_data >= kn->kn_sdata);
- } else {
+ else
result = (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat);
- }
SOCKBUF_UNLOCK(&so->so_rcv);
return (result);
}
@@ -1916,16 +1915,15 @@
kn->kn_flags |= EV_EOF;
kn->kn_fflags = so->so_error;
result = 1;
- } else if (so->so_error) { /* temporary udp error */
+ } else if (so->so_error) /* temporary udp error */
result = 1;
- } else if (((so->so_state & SS_ISCONNECTED) == 0) &&
- (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
+ else if (((so->so_state & SS_ISCONNECTED) == 0) &&
+ (so->so_proto->pr_flags & PR_CONNREQUIRED))
result = 0;
- } else if (kn->kn_sfflags & NOTE_LOWAT) {
+ else if (kn->kn_sfflags & NOTE_LOWAT)
result = (kn->kn_data >= kn->kn_sdata);
- } else {
+ else
result = (kn->kn_data >= so->so_snd.sb_lowat);
- }
SOCKBUF_UNLOCK(&so->so_snd);
return (result);
}
==== //depot/projects/netperf_socket/sys/net/if_tun.c#6 (text+ko) ====
@@ -13,7 +13,7 @@
* UCL. This driver is based much more on read/write/poll mode of
* operation though.
*
- * $FreeBSD: src/sys/net/if_tun.c,v 1.137 2004/03/17 01:12:09 rwatson Exp $
+ * $FreeBSD: src/sys/net/if_tun.c,v 1.138 2004/03/29 18:42:51 rwatson Exp $
*/
#include "opt_atalk.h"
@@ -87,6 +87,12 @@
#define TUNDEBUG if (tundebug) if_printf
#define TUNNAME "tun"
+/*
+ * All mutable global variables in if_tun are locked using tunmtx, with
+ * the exception of tundebug, which is used unlocked, and tunclones,
+ * which is static after setup.
+ */
+static struct mtx tunmtx;
static MALLOC_DEFINE(M_TUN, TUNNAME, "Tunnel Interface");
static int tundebug = 0;
static struct clonedevs *tunclones;
@@ -147,15 +153,30 @@
}
}
+static void
+tun_destroy(struct tun_softc *tp)
+{
+ dev_t dev;
+
+ KASSERT((tp->tun_flags & TUN_OPEN) == 0,
+ ("tununits is out of sync - unit %d", tp->tun_if.if_dunit));
+
+ dev = tp->tun_dev;
+ bpfdetach(&tp->tun_if);
+ if_detach(&tp->tun_if);
+ destroy_dev(dev);
+ free(tp, M_TUN);
+}
+
static int
tunmodevent(module_t mod, int type, void *data)
{
static eventhandler_tag tag;
struct tun_softc *tp;
- dev_t dev;
switch (type) {
case MOD_LOAD:
+ mtx_init(&tunmtx, "tunmtx", NULL, MTX_DEF);
clone_setup(&tunclones);
tag = EVENTHANDLER_REGISTER(dev_clone, tunclone, 0, 1000);
if (tag == NULL)
@@ -164,19 +185,16 @@
case MOD_UNLOAD:
EVENTHANDLER_DEREGISTER(dev_clone, tag);
- while (!TAILQ_EMPTY(&tunhead)) {
- tp = TAILQ_FIRST(&tunhead);
- KASSERT((tp->tun_flags & TUN_OPEN) == 0,
- ("tununits is out of sync - unit %d",
- tp->tun_if.if_dunit));
+ mtx_lock(&tunmtx);
+ while ((tp = TAILQ_FIRST(&tunhead)) != NULL) {
TAILQ_REMOVE(&tunhead, tp, tun_list);
- dev = tp->tun_dev;
- bpfdetach(&tp->tun_if);
- if_detach(&tp->tun_if);
- destroy_dev(dev);
- free(tp, M_TUN);
+ mtx_unlock(&tunmtx);
+ tun_destroy(tp);
+ mtx_lock(&tunmtx);
}
+ mtx_unlock(&tunmtx);
clone_cleanup(&tunclones);
+ mtx_destroy(&tunmtx);
break;
}
return 0;
@@ -215,7 +233,9 @@
MALLOC(sc, struct tun_softc *, sizeof(*sc), M_TUN, M_WAITOK | M_ZERO);
sc->tun_flags = TUN_INITED;
sc->tun_dev = dev;
+ mtx_lock(&tunmtx);
TAILQ_INSERT_TAIL(&tunhead, sc, tun_list);
+ mtx_unlock(&tunmtx);
ifp = &sc->tun_if;
if_initname(ifp, TUNNAME, dev2unit(dev));
More information about the p4-projects
mailing list