Module Name:    src
Committed By:   pooka
Date:           Wed May 27 17:46:50 UTC 2009

Modified Files:
        src/sys/net: radix.c radix.h
        src/sys/netinet: ip_encap.c

Log Message:
Make it possible to register delayed radix tree head inits which
will be processed when the radix "subsystem" is initialized -- all
users must be attached before any inits to know the max keylength.
Use of link sets is no longer required, and only attached domains
need to be considered.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/net/radix.c
cvs rdiff -u -r1.21 -r1.22 src/sys/net/radix.h
cvs rdiff -u -r1.37 -r1.38 src/sys/netinet/ip_encap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/radix.c
diff -u src/sys/net/radix.c:1.42 src/sys/net/radix.c:1.43
--- src/sys/net/radix.c:1.42	Sun Mar 15 20:30:05 2009
+++ src/sys/net/radix.c	Wed May 27 17:46:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: radix.c,v 1.42 2009/03/15 20:30:05 cegger Exp $	*/
+/*	$NetBSD: radix.c,v 1.43 2009/05/27 17:46:50 pooka Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1993
@@ -36,10 +36,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radix.c,v 1.42 2009/03/15 20:30:05 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radix.c,v 1.43 2009/05/27 17:46:50 pooka Exp $");
 
 #ifndef _NET_RADIX_H_
 #include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/kmem.h>
 #ifdef	_KERNEL
 #include "opt_inet.h"
 
@@ -1002,6 +1004,31 @@
 	/* NOTREACHED */
 }
 
+struct delayinit {
+	void **head;
+	int off;
+	SLIST_ENTRY(delayinit) entries;
+};
+static SLIST_HEAD(, delayinit) delayinits = SLIST_HEAD_INITIALIZER(delayheads);
+static int radix_initialized;
+
+/*
+ * Initialize a radix tree once radix is initialized.  Only for bootstrap.
+ * Assume that no concurrency protection is necessary at this stage.
+ */
+void
+rn_delayedinit(void **head, int off)
+{
+	struct delayinit *di;
+
+	KASSERT(radix_initialized == 0);
+
+	di = kmem_alloc(sizeof(*di), KM_SLEEP);
+	di->head = head;
+	di->off = off;
+	SLIST_INSERT_HEAD(&delayinits, di, entries);
+}
+
 int
 rn_inithead(void **head, int off)
 {
@@ -1045,18 +1072,17 @@
 rn_init(void)
 {
 	char *cp, *cplim;
+	struct delayinit *di;
 #ifdef _KERNEL
-	static int initialized;
-	__link_set_decl(domains, struct domain);
-	struct domain *const *dpp;
-
-	if (initialized)
-		return;
-	initialized = 1;
+	struct domain *dp;
 
-	__link_set_foreach(dpp, domains) {
-		if ((*dpp)->dom_maxrtkey > max_keylen)
-			max_keylen = (*dpp)->dom_maxrtkey;
+	if (radix_initialized)
+		panic("radix already initialized");
+	radix_initialized = 1;
+
+	DOMAIN_FOREACH(dp) {
+		if (dp->dom_maxrtkey > max_keylen)
+			max_keylen = dp->dom_maxrtkey;
 	}
 #endif
 	if (max_keylen == 0) {
@@ -1064,6 +1090,7 @@
 		    "rn_init: radix functions require max_keylen be set\n");
 		return;
 	}
+
 	R_Malloc(rn_zeros, char *, 3 * max_keylen);
 	if (rn_zeros == NULL)
 		panic("rn_init");
@@ -1074,4 +1101,11 @@
 		*cp++ = -1;
 	if (rn_inithead((void *)&mask_rnhead, 0) == 0)
 		panic("rn_init 2");
+
+	while ((di = SLIST_FIRST(&delayinits)) != NULL) {
+		if (!rn_inithead(di->head, di->off))
+			panic("delayed rn_inithead failed");
+		SLIST_REMOVE_HEAD(&delayinits, entries);
+		kmem_free(di, sizeof(*di));
+	}
 }

Index: src/sys/net/radix.h
diff -u src/sys/net/radix.h:1.21 src/sys/net/radix.h:1.22
--- src/sys/net/radix.h:1.21	Thu Feb  5 21:45:36 2009
+++ src/sys/net/radix.h	Wed May 27 17:46:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: radix.h,v 1.21 2009/02/05 21:45:36 dyoung Exp $	*/
+/*	$NetBSD: radix.h,v 1.22 2009/05/27 17:46:50 pooka Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1993
@@ -133,6 +133,7 @@
 
 void	rn_init(void);
 int	rn_inithead(void **, int);
+void	rn_delayedinit(void **, int);
 int	rn_inithead0(struct radix_node_head *, int);
 int	rn_refines(const void *, const void *);
 int	rn_walktree(struct radix_node_head *,

Index: src/sys/netinet/ip_encap.c
diff -u src/sys/netinet/ip_encap.c:1.37 src/sys/netinet/ip_encap.c:1.38
--- src/sys/netinet/ip_encap.c:1.37	Sat Apr 18 14:58:05 2009
+++ src/sys/netinet/ip_encap.c	Wed May 27 17:46:49 2009
@@ -74,7 +74,7 @@
 #define USE_RADIX
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.37 2009/04/18 14:58:05 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_encap.c,v 1.38 2009/05/27 17:46:49 pooka Exp $");
 
 #include "opt_mrouting.h"
 #include "opt_inet.h"
@@ -162,13 +162,13 @@
 
 #ifdef USE_RADIX
 	/*
-	 * initialize radix lookup table.
-	 * max_keylen initialization happen in the rn_init().
+	 * initialize radix lookup table when the radix subsystem is inited.
 	 */
-	rn_init();
-	rn_inithead((void *)&encap_head[0], sizeof(struct sockaddr_pack) << 3);
+	rn_delayedinit((void *)&encap_head[0],
+	    sizeof(struct sockaddr_pack) << 3);
 #ifdef INET6
-	rn_inithead((void *)&encap_head[1], sizeof(struct sockaddr_pack) << 3);
+	rn_delayedinit((void *)&encap_head[1],
+	    sizeof(struct sockaddr_pack) << 3);
 #endif
 #endif
 }

Reply via email to