PERFORCE change 34941 for review
Sam Leffler
sam at FreeBSD.org
Thu Jul 24 08:21:14 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=34941
Change 34941 by sam at sam_ebb on 2003/07/24 08:20:12
lock domain table (when socket refs are properly handled
we'll need this to be able to remove/unload domains)
Affected files ...
.. //depot/projects/netperf/sys/kern/subr_mbuf.c#2 edit
.. //depot/projects/netperf/sys/kern/uipc_domain.c#2 edit
.. //depot/projects/netperf/sys/kern/vfs_export.c#2 edit
.. //depot/projects/netperf/sys/net/radix.c#2 edit
.. //depot/projects/netperf/sys/net/route.c#2 edit
.. //depot/projects/netperf/sys/sys/domain.h#2 edit
Differences ...
==== //depot/projects/netperf/sys/kern/subr_mbuf.c#2 (text+ko) ====
@@ -1035,10 +1035,12 @@
mbstat.m_drain++; /* XXX: No consistency. */
+ DOMAIN_LOCK();
for (dp = domains; dp != NULL; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_drain != NULL)
(*pr->pr_drain)();
+ DOMAIN_UNLOCK();
}
/******************************************************************************
==== //depot/projects/netperf/sys/kern/uipc_domain.c#2 (text+ko) ====
@@ -42,6 +42,8 @@
#include <sys/domain.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
#include <sys/socketvar.h>
#include <sys/systm.h>
#include <vm/uma.h>
@@ -67,7 +69,8 @@
static void pffasttimo(void *);
static void pfslowtimo(void *);
-struct domain *domains;
+struct domain *domains; /* registered protocol domains */
+struct mtx dom_mtx; /* domain list lock */
/*
* Add a new protocol domain to the list of supported domains
@@ -78,9 +81,7 @@
net_init_domain(struct domain *dp)
{
register struct protosw *pr;
- int s;
- s = splnet();
if (dp->dom_init)
(*dp->dom_init)();
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++){
@@ -94,9 +95,8 @@
/*
* update global information about maximums
*/
- max_hdr = max_linkhdr + max_protohdr;
+ max_hdr = max_linkhdr + max_protohdr; /** XXX locking */
max_datalen = MHLEN - max_hdr;
- splx(s);
}
/*
@@ -107,14 +107,13 @@
void
net_add_domain(void *data)
{
- int s;
struct domain *dp;
dp = (struct domain *)data;
- s = splnet();
+ DOMAIN_LOCK();
dp->dom_next = domains;
domains = dp;
- splx(s);
+ DOMAIN_UNLOCK();
net_init_domain(dp);
}
@@ -131,11 +130,13 @@
NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
uma_zone_set_max(socket_zone, maxsockets);
+ mtx_init(&dom_mtx, "domain list lock", NULL, MTX_DEF);
+
if (max_linkhdr < 16) /* XXX */
max_linkhdr = 16;
- callout_init(&pffast_callout, 0);
- callout_init(&pfslow_callout, 0);
+ callout_init(&pffast_callout, CALLOUT_MPSAFE);
+ callout_init(&pfslow_callout, CALLOUT_MPSAFE);
callout_reset(&pffast_callout, 1, pffasttimo, NULL);
callout_reset(&pfslow_callout, 1, pfslowtimo, NULL);
@@ -150,11 +151,14 @@
register struct domain *dp;
register struct protosw *pr;
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next)
if (dp->dom_family == family)
goto found;
+ DOMAIN_UNLOCK();
return (0);
found:
+ DOMAIN_UNLOCK();
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_type && pr->pr_type == type)
return (pr);
@@ -173,11 +177,14 @@
if (family == 0)
return (0);
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next)
if (dp->dom_family == family)
goto found;
+ DOMAIN_UNLOCK();
return (0);
found:
+ DOMAIN_UNLOCK();
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
return (pr);
@@ -197,10 +204,12 @@
register struct domain *dp;
register struct protosw *pr;
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_ctlinput)
(*pr->pr_ctlinput)(cmd, sa, (void *)0);
+ DOMAIN_UNLOCK();
}
void
@@ -214,6 +223,7 @@
if (!sa)
return;
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next) {
/*
* the check must be made by xx_ctlinput() anyways, to
@@ -227,6 +237,7 @@
if (pr->pr_ctlinput)
(*pr->pr_ctlinput)(cmd, sa, ctlparam);
}
+ DOMAIN_UNLOCK();
}
static void
@@ -236,10 +247,13 @@
register struct domain *dp;
register struct protosw *pr;
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_slowtimo)
(*pr->pr_slowtimo)();
+ DOMAIN_UNLOCK();
+
callout_reset(&pfslow_callout, hz/2, pfslowtimo, NULL);
}
@@ -250,9 +264,12 @@
register struct domain *dp;
register struct protosw *pr;
+ DOMAIN_LOCK();
for (dp = domains; dp; dp = dp->dom_next)
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_fasttimo)
(*pr->pr_fasttimo)();
+ DOMAIN_UNLOCK();
+
callout_reset(&pffast_callout, hz/5, pffasttimo, NULL);
}
==== //depot/projects/netperf/sys/kern/vfs_export.c#2 (text+ko) ====
@@ -144,12 +144,14 @@
* Seems silly to initialize every AF when most are not used,
* do so on demand here
*/
+ DOMAIN_LOCK();
for (dom = domains; dom; dom = dom->dom_next)
if (dom->dom_family == i && dom->dom_rtattach) {
dom->dom_rtattach((void **) &nep->ne_rtable[i],
dom->dom_rtoffset);
break;
}
+ DOMAIN_UNLOCK();
if ((rnh = nep->ne_rtable[i]) == NULL) {
error = ENOBUFS;
goto out;
==== //depot/projects/netperf/sys/net/radix.c#2 (text+ko) ====
@@ -1059,9 +1059,11 @@
#ifdef _KERNEL
struct domain *dom;
+ DOMAIN_LOCK();
for (dom = domains; dom; dom = dom->dom_next)
if (dom->dom_maxrtkey > max_keylen)
max_keylen = dom->dom_maxrtkey;
+ DOMAIN_UNLOCK();
#endif
if (max_keylen == 0) {
log(LOG_ERR,
==== //depot/projects/netperf/sys/net/route.c#2 (text+ko) ====
@@ -68,10 +68,12 @@
void **table;
{
struct domain *dom;
+ DOMAIN_LOCK();
for (dom = domains; dom; dom = dom->dom_next)
if (dom->dom_rtattach)
dom->dom_rtattach(&table[dom->dom_family],
dom->dom_rtoffset);
+ DOMAIN_UNLOCK();
}
void
==== //depot/projects/netperf/sys/sys/domain.h#2 (text+ko) ====
@@ -67,6 +67,10 @@
extern struct domain *domains;
extern struct domain localdomain;
extern void net_add_domain(void *);
+extern struct mtx dom_mtx;
+
+#define DOMAIN_LOCK() mtx_lock(&dom_mtx)
+#define DOMAIN_UNLOCK() mtx_unlock(&dom_mtx)
#define DOMAIN_SET(name) \
SYSINIT(domain_ ## name, SI_SUB_PROTO_DOMAIN, SI_ORDER_SECOND, net_add_domain, & name ## domain)
More information about the p4-projects
mailing list