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 }