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.
>
> --
> :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 04:39:27 -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;
you can remove rn_mkfreelist from the radix.h as well.
> 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, "rtmskpl",
> + NULL);
you don't really need the "pl" part in the string. you can go for "rtmask"
no problem. maybe we'll clean up other pool names at some point.
> for (dom = domains; dom; dom = dom->dom_next)
> if (dom->dom_maxrtkey > max_keylen)
> max_keylen = dom->dom_maxrtkey;
>
looks fine otherwise.