Date: Thu, 24 Jul 2003 08:21:12 -0700 (PDT) From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 34941 for review Message-ID: <200307241521.h6OFLCPQ016243@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=34941 Change 34941 by sam@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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307241521.h6OFLCPQ016243>