Thanks.  I applied this change.

On Mon, Oct 06, 2014 at 04:01:57PM -0700, Jarno Rajahalme wrote:
> Ben,
> 
> This is much cleaner, thanks!
> 
> Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>
> 
> 
> On Oct 6, 2014, at 2:17 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> > On Wed, Oct 01, 2014 at 04:02:36PM -0700, Jarno Rajahalme wrote:
> >> Depending on the CPU, count_1bits() may be more or less expensive, so
> >> it is better to avoid unnecessary calls to it.  When the map has
> >> consecutive 1-bits, those can be cleared without counting.
> >> 
> >> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
> >> ---
> >> lib/flow.h |    3 ++-
> >> 1 file changed, 2 insertions(+), 1 deletion(-)
> >> 
> >> diff --git a/lib/flow.h b/lib/flow.h
> >> index 9bb9a58..a6e75c7 100644
> >> --- a/lib/flow.h
> >> +++ b/lib/flow.h
> >> @@ -507,7 +507,8 @@ mf_get_next_in_map(uint64_t *fmap, uint64_t rm1bit, 
> >> const uint32_t **fp,
> >>             *fmap -= trash;
> >>             *fp += count_1bits(trash);
> >>         }
> >> -        *value = **fp;
> >> +        *fmap -= rm1bit;
> >> +        *value = *(*fp)++;
> >>     }
> >>     return rm1bit != 0;
> >> }
> > 
> > I think that MINIFLOW_FOR_EACH_IN_MAP can be improved in other ways.
> > rm1bit_ seems unnecessary: it is always rightmost_1bit(map_) at point
> > of use, so it could be calculated inside mf_get_next_in_map() if &map
> > were passed in instead.  Also, it seems a bit awkward to have
> > declarations outside the for loop.
> > 
> > What do you think of this version?  It incorporates your improvement
> > but avoids the out-of-for-statement declarations and moves the rm1bit
> > calculation inside the function.  It passes the unit tests for me.
> > 
> > struct mf_for_each_in_map_aux {
> >    const uint32_t *values;
> >    uint64_t fmap;
> >    uint64_t map;
> > };
> > 
> > static inline bool
> > mf_get_next_in_map(struct mf_for_each_in_map_aux *aux, uint32_t *value)
> > {
> >    if (aux->map) {
> >        uint64_t rm1bit = rightmost_1bit(aux->map);
> >        aux->map -= rm1bit;
> > 
> >        if (aux->fmap & rm1bit) {
> >            /* Advance 'aux->values' to point to the value for 'rm1bit'. */
> >            uint64_t trash = aux->fmap & (rm1bit - 1);
> >            if (trash) {
> >                aux->fmap -= trash;
> >                aux->values += count_1bits(trash);
> >            }
> > 
> >            /* Retrieve the value for 'rm1bit' then advance past it. */
> >            aux->fmap -= rm1bit;
> >            *value = *aux->values++;
> >        } else {
> >            *value = 0;
> >        }
> >        return true;
> >    } else {
> >        return false;
> >    }
> > }
> > 
> > /* Iterate through all miniflow u32 values specified by 'MAP'. */
> > #define MINIFLOW_FOR_EACH_IN_MAP(VALUE, FLOW, MAP)                      \
> >    for (struct mf_for_each_in_map_aux aux__                            \
> >             = { miniflow_get_u32_values(FLOW), (FLOW)->map, MAP };     \
> >         mf_get_next_in_map(&aux__, &(VALUE));                          \
> >        )
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to