On 21/01/14(Tue) 05:05, Claudio Jeker wrote:
> Cleanup the abuse of x as the rn_addmask radix node. Since in most
> cases x is just used as a temp variable. Main offender is rn_addmask()
> which sets x once at the top uses it then late in the function and then
> starts reuing it for various other stuff. While there fix some for loops
> to while ones and fix one strange do { } while() loop.
> And since rn_search() can not return NULL remove one extra check.
> 
> OK?

ok mpi@,

I was about to comment on the few "return (0)" surrounding the code you
touched but since there's still a lot of possible improvements, that
might be for another diff :)


> -- 
> :wq Claudio
> 
> Index: radix.c
> ===================================================================
> RCS file: /cvs/src/sys/net/radix.c,v
> retrieving revision 1.37
> diff -u -p -r1.37 radix.c
> --- radix.c   20 Jan 2014 22:42:06 -0000      1.37
> +++ radix.c   21 Jan 2014 03:44:20 -0000
> @@ -109,10 +109,10 @@ struct radix_node *rn_search_m(void *, s
>  static inline struct radix_node *
>  rn_search(void *v_arg, struct radix_node *head)
>  {
> -     struct radix_node *x;
> +     struct radix_node *x = head;
>       caddr_t v = v_arg;
>  
> -     for (x = head; x->rn_b >= 0;) {
> +     while (x->rn_b >= 0) {
>               if (x->rn_bmask & v[x->rn_off])
>                       x = x->rn_r;
>               else
> @@ -124,11 +124,11 @@ rn_search(void *v_arg, struct radix_node
>  struct radix_node *
>  rn_search_m(void *v_arg, struct radix_node *head, void *m_arg)
>  {
> -     struct radix_node *x;
> +     struct radix_node *x = head;
>       caddr_t v = v_arg;
>       caddr_t m = m_arg;
>  
> -     for (x = head; x->rn_b >= 0;) {
> +     while (x->rn_b >= 0) {
>               if ((x->rn_bmask & m[x->rn_off]) &&
>                   (x->rn_bmask & v[x->rn_off]))
>                       x = x->rn_r;
> @@ -170,14 +170,14 @@ rn_refines(void *m_arg, void *n_arg)
>  struct radix_node *
>  rn_lookup(void *v_arg, void *m_arg, struct radix_node_head *head)
>  {
> -     struct radix_node *x;
> +     struct radix_node *x, *tm;
>       caddr_t netmask = 0;
>  
>       if (m_arg) {
> -             x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off);
> -             if (x == NULL)
> -                     return (0);
> -             netmask = x->rn_key;
> +             tm = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off);
> +             if (tm == NULL)
> +                     return (NULL);
> +             netmask = tm->rn_key;
>       }
>       x = rn_match(v_arg, head);
>       if (x && netmask) {
> @@ -278,28 +278,26 @@ on1:
>               struct radix_mask *m;
>               t = t->rn_p;
>               m = t->rn_mklist;
> -             if (m) {
> +             while (m) {
>                       /*
>                        * If non-contiguous masks ever become important
>                        * we can restore the masking and open coding of
>                        * the search and satisfaction test and put the
>                        * calculation of "off" back before the "do".
>                        */
> -                     do {
> -                             if (m->rm_flags & RNF_NORMAL) {
> -                                     if (rn_b <= m->rm_b)
> -                                             return (m->rm_leaf);
> -                             } else {
> -                                     struct radix_node *x;
> -                                     off = min(t->rn_off, matched_off);
> -                                     x = rn_search_m(v, t, m->rm_mask);
> -                                     while (x && x->rn_mask != m->rm_mask)
> -                                             x = x->rn_dupedkey;
> -                                     if (x && rn_satisfies_leaf(v, x, off))
> -                                             return x;
> -                             }
> -                             m = m->rm_mklist;
> -                     } while (m);
> +                     if (m->rm_flags & RNF_NORMAL) {
> +                             if (rn_b <= m->rm_b)
> +                                     return (m->rm_leaf);
> +                     } else {
> +                             struct radix_node *x;
> +                             off = min(t->rn_off, matched_off);
> +                             x = rn_search_m(v, t, m->rm_mask);
> +                             while (x && x->rn_mask != m->rm_mask)
> +                                     x = x->rn_dupedkey;
> +                             if (x && rn_satisfies_leaf(v, x, off))
> +                                     return x;
> +                     }
> +                     m = m->rm_mklist;
>               }
>       } while (t != top);
>       return NULL;
> @@ -408,7 +406,7 @@ struct radix_node *
>  rn_addmask(void *n_arg, int search, int skip)
>  {
>       caddr_t netmask = n_arg;
> -     struct radix_node *x, *saved_x;
> +     struct radix_node *tm, *saved_tm;
>       caddr_t cp, cplim;
>       int b = 0, mlen, j;
>       int maskduplicated, m0, isnormal;
> @@ -438,21 +436,22 @@ rn_addmask(void *n_arg, int search, int 
>       if (m0 < last_zeroed)
>               memset(addmask_key + m0, 0, last_zeroed - m0);
>       *addmask_key = last_zeroed = mlen;
> -     x = rn_search(addmask_key, rn_masktop);
> -     if (memcmp(addmask_key, x->rn_key, mlen) != 0)
> -             x = 0;
> -     if (x || search)
> -             return (x);
> -     x = malloc(max_keylen + 2 * sizeof (*x), M_RTABLE, M_NOWAIT | M_ZERO);
> -     if ((saved_x = x) == NULL)
> +     tm = rn_search(addmask_key, rn_masktop);
> +     if (memcmp(addmask_key, tm->rn_key, mlen) != 0)
> +             tm = NULL;
> +     if (tm || search)
> +             return (tm);
> +     tm = malloc(max_keylen + 2 * sizeof (*tm), M_RTABLE, M_NOWAIT | M_ZERO);
> +     if (tm == NULL)
>               return (0);
> -     netmask = cp = (caddr_t)(x + 2);
> +     saved_tm = tm;
> +     netmask = cp = (caddr_t)(tm + 2);
>       memcpy(cp, addmask_key, mlen);
> -     x = rn_insert(cp, mask_rnhead, &maskduplicated, x);
> +     tm = rn_insert(cp, mask_rnhead, &maskduplicated, tm);
>       if (maskduplicated) {
>               log(LOG_ERR, "rn_addmask: mask impossibly already in tree\n");
> -             free(saved_x, M_RTABLE);
> -             return (x);
> +             free(saved_tm, M_RTABLE);
> +             return (tm);
>       }
>       /*
>        * Calculate index of mask, and check for normalcy.
> @@ -468,10 +467,10 @@ rn_addmask(void *n_arg, int search, int 
>                       isnormal = 0;
>       }
>       b += (cp - netmask) << 3;
> -     x->rn_b = -1 - b;
> +     tm->rn_b = -1 - b;
>       if (isnormal)
> -             x->rn_flags |= RNF_NORMAL;
> -     return (x);
> +             tm->rn_flags |= RNF_NORMAL;
> +     return (tm);
>  }
>  
>  /* rn_lexobetter: return a arbitrary ordering for non-contiguous masks */
> @@ -525,7 +524,7 @@ rn_addroute(void *v_arg, void *n_arg, st
>       caddr_t v = v_arg;
>       caddr_t netmask = n_arg;
>       struct radix_node *top = head->rnh_treetop;
> -     struct radix_node *t, *x = NULL, *tt;
> +     struct radix_node *t, *tt, *tm = NULL, *x;
>       struct radix_node *saved_tt;
>       short b = 0, b_leaf = 0;
>       int keyduplicated, prioinv = -1;
> @@ -540,16 +539,18 @@ rn_addroute(void *v_arg, void *n_arg, st
>        * nodes and possibly save time in calculating indices.
>        */
>       if (netmask)  {
> -             if ((x = rn_addmask(netmask, 0, top->rn_off)) == 0)
> +             if ((tm = rn_addmask(netmask, 0, top->rn_off)) == 0)
>                       return (0);
> -             b_leaf = x->rn_b;
> -             b = -1 - x->rn_b;
> -             netmask = x->rn_key;
> +             b_leaf = tm->rn_b;
> +             b = -1 - tm->rn_b;
> +             netmask = tm->rn_key;
>       }
> +
> +     saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes);
> +
>       /*
>        * Deal with duplicated keys: attach node to previous instance
>        */
> -     saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes);
>       if (keyduplicated) {
>               for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) {
>  #ifndef SMALL_KERNEL
> @@ -651,13 +655,14 @@ rn_addroute(void *v_arg, void *n_arg, st
>               tt->rn_b = -1;
>               tt->rn_flags = RNF_ACTIVE;
>       }
> +
>       /*
>        * Put mask in tree.
>        */
>       if (netmask) {
>               tt->rn_mask = netmask;
> -             tt->rn_b = x->rn_b;
> -             tt->rn_flags |= x->rn_flags & RNF_NORMAL;
> +             tt->rn_b = tm->rn_b;
> +             tt->rn_flags |= tm->rn_flags & RNF_NORMAL;
>       }
>       t = saved_tt->rn_p;
>       if (keyduplicated)
> @@ -762,7 +767,7 @@ rn_delete(void *v_arg, void *netmask_arg
>       caddr_t v = v_arg;
>       caddr_t netmask = netmask_arg;
>       struct radix_node *top = head->rnh_treetop;
> -     struct radix_node *t, *p, *x, *tt;
> +     struct radix_node *t, *p, *tm, *x, *tt;
>       struct radix_mask *m, *saved_m, **mp;
>       struct radix_node *dupedkey, *saved_tt;
>       int off = top->rn_off;
> @@ -771,16 +776,15 @@ rn_delete(void *v_arg, void *netmask_arg
>       vlen =  *(u_char *)v;
>       tt = rn_search(v, top);
>       saved_tt = tt;
> -     if (tt == NULL ||
> -         memcmp(v + off, tt->rn_key + off, vlen - off))
> +     if (memcmp(v + off, tt->rn_key + off, vlen - off))
>               return (0);
>       /*
>        * Delete our route from mask lists.
>        */
>       if (netmask) {
> -             if ((x = rn_addmask(netmask, 1, off)) == NULL)
> +             if ((tm = rn_addmask(netmask, 1, off)) == NULL)
>                       return (0);
> -             netmask = x->rn_key;
> +             netmask = tm->rn_key;
>               while (tt->rn_mask != netmask)
>                       if ((tt = tt->rn_dupedkey) == NULL)
>                               return (0);
> 

Reply via email to