From: Ben Pfaff Date: Tue, 23 Apr 2013 22:03:57 +0000 (-0700) Subject: packets: Make eth_addr_is_reserved() thread-safe. X-Git-Tag: sliver-openvswitch-2.0.90-1~34^2~57 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=8c45d00f567159f9b7bf31fcc0862eabbd190b3a;p=sliver-openvswitch.git packets: Make eth_addr_is_reserved() thread-safe. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- diff --git a/lib/packets.c b/lib/packets.c index 7fe651305..9c30b95c9 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -27,6 +27,7 @@ #include "hmap.h" #include "dynamic-string.h" #include "ofpbuf.h" +#include "ovs-thread.h" const struct in6_addr in6addr_exact = IN6ADDR_EXACT_INIT; @@ -54,7 +55,7 @@ eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN]) { struct eth_addr_node { struct hmap_node hmap_node; - uint64_t ea64; + const uint64_t ea64; }; static struct eth_addr_node nodes[] = { @@ -100,15 +101,18 @@ eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN]) { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc7ULL }, }; - static struct hmap addrs = HMAP_INITIALIZER(&addrs); + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; struct eth_addr_node *node; + static struct hmap addrs; uint64_t ea64; - if (hmap_is_empty(&addrs)) { + if (ovsthread_once_start(&once)) { + hmap_init(&addrs); for (node = nodes; node < &nodes[ARRAY_SIZE(nodes)]; node++) { hmap_insert(&addrs, &node->hmap_node, hash_2words(node->ea64, node->ea64 >> 32)); } + ovsthread_once_done(&once); } ea64 = eth_addr_to_uint64(ea);