On Sun, Jan 19, 2014 at 06:37 +0100, Claudio Jeker wrote: > On Sun, Jan 19, 2014 at 06:15:06AM +0100, Mike Belopuhov wrote: > > On Sun, Jan 19, 2014 at 05:42 +0100, Claudio Jeker wrote: > > > Here is more cleanup. > > > > > > Kill the MKget MKfree madness and replace it with *drummrolls* > > > a pool(9). Makes the code a lot easier to digest. > > > > > Better? >
indeed! OK mikeb > -- > :wq Claudio > > Index: net/radix.c > =================================================================== > RCS file: /cvs/src/sys/net/radix.c,v > retrieving revision 1.35 > diff -u -p -r1.35 radix.c > --- net/radix.c 19 Jan 2014 04:04:36 -0000 1.35 > +++ net/radix.c 19 Jan 2014 05:32:43 -0000 > @@ -41,6 +41,7 @@ > #include <sys/malloc.h> > #include <sys/domain.h> > #include <sys/syslog.h> > +#include <sys/pool.h> > #include <net/radix.h> > > #ifndef SMALL_KERNEL > @@ -50,12 +51,13 @@ > #endif > > int max_keylen; > -struct radix_mask *rn_mkfreelist; > struct radix_node_head *mask_rnhead; > static char *addmask_key; > static char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, > -1}; > static char *rn_zeros, *rn_ones; > > +struct pool rtmask_pool; /* pool for radix_mask structures */ > + > #define rn_masktop (mask_rnhead->rnh_treetop) > > static int rn_satisfies_leaf(char *, struct radix_node *, int); > @@ -69,20 +71,6 @@ struct radix_node *rn_newpair(void *, in > struct radix_node *rn_search(void *, struct radix_node *); > struct radix_node *rn_search_m(void *, struct radix_node *, void *); > > -#define MKGet(m) do { \ > - if (rn_mkfreelist) { \ > - m = rn_mkfreelist; \ > - rn_mkfreelist = (m)->rm_mklist; \ > - } else \ > - m = malloc(sizeof (*(m)), M_RTABLE, M_NOWAIT); \ > -} while (0) > - > -#define MKFree(m) do { \ > - (m)->rm_mklist = rn_mkfreelist; \ > - rn_mkfreelist = (m); \ > -} while (0) > - > - > /* > * The data structure for the keys is a radix tree with one way > * branching removed. The index rn_b at an internal node n represents a bit > @@ -506,7 +494,7 @@ rn_new_radix_mask(struct radix_node *tt, > { > struct radix_mask *m; > > - MKGet(m); > + m = pool_get(&rtmask_pool, PR_NOWAIT | PR_ZERO); > if (m == NULL) { > log(LOG_ERR, "Mask for route not entered\n"); > return (0); > @@ -841,7 +829,7 @@ rn_delete(void *v_arg, void *netmask_arg > for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) > if (m == saved_m) { > *mp = m->rm_mklist; > - MKFree(m); > + pool_put(&rtmask_pool, m); > break; > } > if (m == NULL) { > @@ -928,7 +916,7 @@ on1: > struct radix_mask *mm = m->rm_mklist; > x->rn_mklist = 0; > if (--(m->rm_refs) < 0) > - MKFree(m); > + pool_put(&rtmask_pool, m); > else if (m->rm_flags & RNF_NORMAL) > /* > * don't progress because this > @@ -1046,11 +1034,13 @@ rn_inithead0(struct radix_node_head *rnh > } > > void > -rn_init() > +rn_init(void) > { > char *cp, *cplim; > struct domain *dom; > > + pool_init(&rtmask_pool, sizeof(struct radix_mask), 0, 0, 0, "rtmask", > + NULL); > for (dom = domains; dom; dom = dom->dom_next) > if (dom->dom_maxrtkey > max_keylen) > max_keylen = dom->dom_maxrtkey; > Index: net/radix.h > =================================================================== > RCS file: /cvs/src/sys/net/radix.h,v > retrieving revision 1.22 > diff -u -p -r1.22 radix.h > --- net/radix.h 10 Jan 2014 14:29:08 -0000 1.22 > +++ net/radix.h 19 Jan 2014 05:30:59 -0000 > @@ -78,7 +78,7 @@ struct radix_node { > * Annotations to tree concerning potential routes applying to subtrees. > */ > > -extern struct radix_mask { > +struct radix_mask { > short rm_b; /* bit offset; -1-index(netmask) */ > char rm_unused; /* cf. rn_bmask */ > u_char rm_flags; /* cf. rn_flags */ > @@ -88,7 +88,7 @@ extern struct radix_mask { > struct radix_node *rmu_leaf; /* for normal routes */ > } rm_rmu; > int rm_refs; /* # of references to this struct */ > -} *rn_mkfreelist; > +}; > > #define rm_mask rm_rmu.rmu_mask > #define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 > bytes */