From owner-p4-projects@FreeBSD.ORG Thu Jul 24 08:21:14 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7445637B404; Thu, 24 Jul 2003 08:21:13 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 263C837B401 for ; Thu, 24 Jul 2003 08:21:13 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id A246343F3F for ; Thu, 24 Jul 2003 08:21:12 -0700 (PDT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h6OFLC0U016246 for ; Thu, 24 Jul 2003 08:21:12 -0700 (PDT) (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h6OFLCPQ016243 for perforce@freebsd.org; Thu, 24 Jul 2003 08:21:12 -0700 (PDT) Date: Thu, 24 Jul 2003 08:21:12 -0700 (PDT) Message-Id: <200307241521.h6OFLCPQ016243@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Subject: PERFORCE change 34941 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Jul 2003 15:21:14 -0000 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 #include #include +#include +#include #include #include #include @@ -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)