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 */

Reply via email to