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