[ovs-dev] [ovn-controller-vtep V6 6/7] ovn-controller-vtep: Extend vtep module to install Ucast_Macs_Remote.
Russell Bryant
rbryant at redhat.com
Mon Aug 17 16:43:16 UTC 2015
On 08/17/2015 09:06 AM, Alex Wang wrote:
>
>
> On Mon, Aug 17, 2015 at 6:37 AM, Russell Bryant <rbryant at redhat.com
> <mailto:rbryant at redhat.com>> wrote:
>
> On 08/16/2015 07:24 PM, Alex Wang wrote:
> >
> >
> > On Sun, Aug 16, 2015 at 3:26 PM, Russell Bryant <rbryant at redhat.com <mailto:rbryant at redhat.com>
> > <mailto:rbryant at redhat.com <mailto:rbryant at redhat.com>>> wrote:
> >
> > On 08/09/2015 10:50 PM, Alex Wang wrote:
> > > + tnl_key = port_binding_rec->datapath->tunnel_key;
> > > + HMAP_FOR_EACH_WITH_HASH (ls_node, hmap_node,
> > > + hash_uint64((uint64_t) tnl_key),
> > > + &ls_map) {
> > > + if (ls_node->vtep_ls->tunnel_key[0] == tnl_key) {
> > > + break;
> > > + }
> > > + }
> > > + /* If 'ls_node' is NULL, that means no vtep logical switch is
> > > + * attached to the corresponding ovn logical datapath, so pass. */
> > > + if (!ls_node) {
> > > + continue;
> > > + }
> >
> > I don't think ls_node is guaranteed to be NULL here, even when the loop
> > ends normally (without a break).
> >
> >
> > Could you explain more about this concern? From the comments in
> > lib/hmap.h, this looks okay to me.
>
> Ah, you're right. It's fine since hmap_node is the first member in the
> struct. Thanks.
>
> It might be worth a comment in your struct definition saying that
> hmap_node must remain the first struct member.
>
>
> Yeah, I really should do that! Thx,
I wonder if we can remove the requirement to hvae hmap_node as the first
element. This patch at least compiles and the tests pass. What do you
think?
> diff --git a/lib/hmap.h b/lib/hmap.h
> index 345bf7f..9cb3ad4 100644
> --- a/lib/hmap.h
> +++ b/lib/hmap.h
> @@ -136,12 +136,12 @@ struct hmap_node *hmap_random_node(const struct hmap *);
> */
> #define HMAP_FOR_EACH_WITH_HASH(NODE, MEMBER, HASH, HMAP) \
> for (INIT_CONTAINER(NODE, hmap_first_with_hash(HMAP, HASH), MEMBER); \
> - NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER); \
> + (NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER)) || (NODE = NULL); \
> ASSIGN_CONTAINER(NODE, hmap_next_with_hash(&(NODE)->MEMBER), \
> MEMBER))
> #define HMAP_FOR_EACH_IN_BUCKET(NODE, MEMBER, HASH, HMAP) \
> for (INIT_CONTAINER(NODE, hmap_first_in_bucket(HMAP, HASH), MEMBER); \
> - NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER); \
> + (NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER)) || (NODE = NULL); \
> ASSIGN_CONTAINER(NODE, hmap_next_in_bucket(&(NODE)->MEMBER), MEMBER))
>
> static inline struct hmap_node *hmap_first_with_hash(const struct hmap *,
> @@ -158,14 +158,14 @@ bool hmap_contains(const struct hmap *, const struct hmap_node *);
> /* Iterates through every node in HMAP. */
> #define HMAP_FOR_EACH(NODE, MEMBER, HMAP) \
> for (INIT_CONTAINER(NODE, hmap_first(HMAP), MEMBER); \
> - NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER); \
> + (NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER)) || (NODE = NULL); \
> ASSIGN_CONTAINER(NODE, hmap_next(HMAP, &(NODE)->MEMBER), MEMBER))
>
> /* Safe when NODE may be freed (not needed when NODE may be removed from the
> * hash map but its members remain accessible and intact). */
> #define HMAP_FOR_EACH_SAFE(NODE, NEXT, MEMBER, HMAP) \
> for (INIT_CONTAINER(NODE, hmap_first(HMAP), MEMBER); \
> - (NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER) \
> + ((NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER)) || (NODE = NULL) \
> ? INIT_CONTAINER(NEXT, hmap_next(HMAP, &(NODE)->MEMBER), MEMBER), 1 \
> : 0); \
> (NODE) = (NEXT))
> @@ -173,7 +173,7 @@ bool hmap_contains(const struct hmap *, const struct hmap_node *);
> /* Continues an iteration from just after NODE. */
> #define HMAP_FOR_EACH_CONTINUE(NODE, MEMBER, HMAP) \
> for (ASSIGN_CONTAINER(NODE, hmap_next(HMAP, &(NODE)->MEMBER), MEMBER); \
> - NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER); \
> + (NODE != OBJECT_CONTAINING(NULL, NODE, MEMBER)) || (NODE = NULL); \
> ASSIGN_CONTAINER(NODE, hmap_next(HMAP, &(NODE)->MEMBER), MEMBER))
>
> static inline struct hmap_node *hmap_first(const struct hmap *);
--
Russell Bryant
More information about the dev
mailing list