[ovs-dev] [PATCH 33/41] hash: New helper functions hash_bytes32() and hash_bytes64().

Ben Pfaff blp at ovn.org
Wed Jan 20 18:05:09 UTC 2016


Thanks, all patches now applied up to this point.

On Tue, Jan 19, 2016 at 05:22:44PM -0800, Jarno Rajahalme wrote:
> Acked-by: Jarno Rajahalme <jarno at ovn.org>
> 
> > On Jan 18, 2016, at 11:27 PM, Ben Pfaff <blp at ovn.org> wrote:
> > 
> > All of the callers of hash_words() and hash_words64() actually find it
> > easier to pass in the number of bytes instead of the number of 32-bit
> > or 64-bit words.  These new functions allow the callers to be a little
> > simpler.
> > 
> > Signed-off-by: Ben Pfaff <blp at ovn.org>
> > ---
> > lib/flow.h                 |  5 ++---
> > lib/hash.h                 | 14 +++++++++++++-
> > lib/odp-util.c             |  5 ++---
> > lib/ofp-msgs.c             |  6 +++---
> > ofproto/ofproto-dpif-rid.c | 19 ++++++++-----------
> > 5 files changed, 28 insertions(+), 21 deletions(-)
> > 
> > diff --git a/lib/flow.h b/lib/flow.h
> > index 5d78615..dc7130d 100644
> > --- a/lib/flow.h
> > +++ b/lib/flow.h
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
> > + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -263,8 +263,7 @@ flow_equal(const struct flow *a, const struct flow *b)
> > static inline size_t
> > flow_hash(const struct flow *flow, uint32_t basis)
> > {
> > -    return hash_words64((const uint64_t *)flow,
> > -                        sizeof *flow / sizeof(uint64_t), basis);
> > +    return hash_bytes64((const uint64_t *)flow, sizeof *flow, basis);
> > }
> > 
> > static inline uint16_t
> > diff --git a/lib/hash.h b/lib/hash.h
> > index 65c52b9..114a419 100644
> > --- a/lib/hash.h
> > +++ b/lib/hash.h
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc.
> > + * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014, 2016 Nicira, Inc.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -323,6 +323,18 @@ hash_words64(const uint64_t p[], size_t n_words, uint32_t basis)
> > }
> > #endif
> > 
> > +static inline uint32_t
> > +hash_bytes32(const uint32_t p[], size_t n_bytes, uint32_t basis)
> > +{
> > +    return hash_words(p, n_bytes / 4, basis);
> > +}
> > +
> > +static inline uint32_t
> > +hash_bytes64(const uint64_t p[], size_t n_bytes, uint32_t basis)
> > +{
> > +    return hash_words64(p, n_bytes / 8, basis);
> > +}
> > +
> > static inline uint32_t hash_string(const char *s, uint32_t basis)
> > {
> >     return hash_bytes(s, strlen(s), basis);
> > diff --git a/lib/odp-util.c b/lib/odp-util.c
> > index f16e113..6271601 100644
> > --- a/lib/odp-util.c
> > +++ b/lib/odp-util.c
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
> > + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -4532,8 +4532,7 @@ uint32_t
> > odp_flow_key_hash(const struct nlattr *key, size_t key_len)
> > {
> >     BUILD_ASSERT_DECL(!(NLA_ALIGNTO % sizeof(uint32_t)));
> > -    return hash_words(ALIGNED_CAST(const uint32_t *, key),
> > -                      key_len / sizeof(uint32_t), 0);
> > +    return hash_bytes32(ALIGNED_CAST(const uint32_t *, key), key_len, 0);
> > }
> > 
> > static void
> > diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c
> > index cb27f79..944ab33 100644
> > --- a/lib/ofp-msgs.c
> > +++ b/lib/ofp-msgs.c
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2012, 2013, 2014, 2015 Nicira, Inc.
> > + * Copyright (c) 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -118,8 +118,8 @@ alloc_xid(void)
> > static uint32_t
> > ofphdrs_hash(const struct ofphdrs *hdrs)
> > {
> > -    BUILD_ASSERT_DECL(sizeof *hdrs == 12);
> > -    return hash_words((const uint32_t *) hdrs, 3, 0);
> > +    BUILD_ASSERT_DECL(sizeof *hdrs % 4 == 0);
> > +    return hash_bytes32((const uint32_t *) hdrs, sizeof *hdrs, 0);
> > }
> > 
> > static bool
> > diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c
> > index d142933..cb00301 100644
> > --- a/ofproto/ofproto-dpif-rid.c
> > +++ b/ofproto/ofproto-dpif-rid.c
> > @@ -135,25 +135,22 @@ recirc_metadata_hash(const struct recirc_state *state)
> >     if (flow_tnl_dst_is_set(state->metadata.tunnel)) {
> >         /* We may leave remainder bytes unhashed, but that is unlikely as
> >          * the tunnel is not in the datapath format. */
> > -        hash = hash_words64((const uint64_t *) state->metadata.tunnel,
> > -                            flow_tnl_size(state->metadata.tunnel)
> > -                            / sizeof(uint64_t), hash);
> > +        hash = hash_bytes64((const uint64_t *) state->metadata.tunnel,
> > +                            flow_tnl_size(state->metadata.tunnel), hash);
> >     }
> >     hash = hash_boolean(state->conntracked, hash);
> > -    hash = hash_words64((const uint64_t *) &state->metadata.metadata,
> > -                        (sizeof state->metadata - sizeof state->metadata.tunnel)
> > -                        / sizeof(uint64_t),
> > +    hash = hash_bytes64((const uint64_t *) &state->metadata.metadata,
> > +                        sizeof state->metadata - sizeof state->metadata.tunnel,
> >                         hash);
> >     if (state->stack && state->stack->size != 0) {
> > -        hash = hash_words64((const uint64_t *) state->stack->data,
> > -                            state->stack->size / sizeof(uint64_t), hash);
> > +        hash = hash_bytes64((const uint64_t *) state->stack->data,
> > +                            state->stack->size, hash);
> >     }
> >     hash = hash_int(state->mirrors, hash);
> >     hash = hash_int(state->action_set_len, hash);
> >     if (state->ofpacts_len) {
> > -        hash = hash_words64(ALIGNED_CAST(const uint64_t *, state->ofpacts),
> > -                            state->ofpacts_len / sizeof(uint64_t),
> > -                            hash);
> > +        hash = hash_bytes64(ALIGNED_CAST(const uint64_t *, state->ofpacts),
> > +                            state->ofpacts_len, hash);
> >     }
> >     return hash;
> > }
> > -- 
> > 2.1.3
> > 
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 



More information about the dev mailing list