diff options
author | Simon Horman <simon.horman@netronome.com> | 2014-11-10 13:47:48 +0900 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2014-11-10 08:30:07 -0800 |
commit | c3bd4bfc7120a16d3e3604985e9c607705ef594d (patch) | |
tree | 59ec2d346716934ea961afd88cebf55eff931499 /ofproto/ofproto-dpif-rid.c | |
parent | 7d16c8478e0bd17f63d4e6459e5d8f8dc6fcece2 (diff) | |
download | openvswitch-c3bd4bfc7120a16d3e3604985e9c607705ef594d.tar.gz |
id-pool: Re-factor recirculation id allocator into standalone id pool.
Refactor the lock-free portion of the recirculation id allocator
into stand-alone id pool. This is in preparation for re-using
that portion to allocate bucket ids which are part of (draft)
OpenFlow 1.5 groups.
ONF-JIRA: EXT-350
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'ofproto/ofproto-dpif-rid.c')
-rw-r--r-- | ofproto/ofproto-dpif-rid.c | 128 |
1 files changed, 6 insertions, 122 deletions
diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c index 236de4d7f..55d5c2bef 100644 --- a/ofproto/ofproto-dpif-rid.c +++ b/ofproto/ofproto-dpif-rid.c @@ -16,46 +16,25 @@ #include <config.h> -#include "hmap.h" -#include "hash.h" +#include "id-pool.h" #include "ovs-thread.h" #include "ofproto-dpif-rid.h" -struct rid_node { - struct hmap_node node; - uint32_t recirc_id; -}; - -struct rid_pool { - struct hmap map; - uint32_t base; /* IDs in the range of [base, base + n_ids). */ - uint32_t n_ids; /* Total number of ids in the pool. */ - uint32_t next_free_id; /* Possible next free id. */ -}; - struct recirc_id_pool { struct ovs_mutex lock; - struct rid_pool rids; + struct id_pool *rids; }; #define RECIRC_ID_BASE 300 #define RECIRC_ID_N_IDS 1024 -static void rid_pool_init(struct rid_pool *rids, - uint32_t base, uint32_t n_ids); -static void rid_pool_uninit(struct rid_pool *pool); -static uint32_t rid_pool_alloc_id(struct rid_pool *pool); -static void rid_pool_free_id(struct rid_pool *rids, uint32_t rid); -static struct rid_node *rid_pool_find(struct rid_pool *rids, uint32_t id); -static void rid_pool_add(struct rid_pool *rids, uint32_t id); - struct recirc_id_pool * recirc_id_pool_create(void) { struct recirc_id_pool *pool; pool = xmalloc(sizeof *pool); - rid_pool_init(&pool->rids, RECIRC_ID_BASE, RECIRC_ID_N_IDS); + pool->rids = id_pool_create(RECIRC_ID_BASE, RECIRC_ID_N_IDS); ovs_mutex_init(&pool->lock); return pool; @@ -64,7 +43,7 @@ recirc_id_pool_create(void) void recirc_id_pool_destroy(struct recirc_id_pool *pool) { - rid_pool_uninit(&pool->rids); + id_pool_destroy(pool->rids); ovs_mutex_destroy(&pool->lock); free(pool); } @@ -75,7 +54,7 @@ recirc_id_alloc(struct recirc_id_pool *pool) uint32_t id; ovs_mutex_lock(&pool->lock); - id = rid_pool_alloc_id(&pool->rids); + id = id_pool_alloc_id(pool->rids); ovs_mutex_unlock(&pool->lock); return id; @@ -85,101 +64,6 @@ void recirc_id_free(struct recirc_id_pool *pool, uint32_t id) { ovs_mutex_lock(&pool->lock); - rid_pool_free_id(&pool->rids, id); + id_pool_free_id(pool->rids, id); ovs_mutex_unlock(&pool->lock); } - -static void -rid_pool_init(struct rid_pool *rids, uint32_t base, uint32_t n_ids) -{ - rids->base = base; - rids->n_ids = n_ids; - rids->next_free_id = base; - hmap_init(&rids->map); -} - -static void -rid_pool_uninit(struct rid_pool *rids) -{ - struct rid_node *rid, *next; - - HMAP_FOR_EACH_SAFE(rid, next, node, &rids->map) { - hmap_remove(&rids->map, &rid->node); - free(rid); - } - - hmap_destroy(&rids->map); -} - -static struct rid_node * -rid_pool_find(struct rid_pool *rids, uint32_t id) -{ - size_t hash; - struct rid_node *rid; - - hash = hash_int(id, 0); - HMAP_FOR_EACH_WITH_HASH(rid, node, hash, &rids->map) { - if (id == rid->recirc_id) { - return rid; - } - } - return NULL; -} - -static void -rid_pool_add(struct rid_pool *rids, uint32_t id) -{ - struct rid_node *rid = xmalloc(sizeof *rid); - size_t hash; - - rid->recirc_id = id; - hash = hash_int(id, 0); - hmap_insert(&rids->map, &rid->node, hash); -} - -static uint32_t -rid_pool_alloc_id(struct rid_pool *rids) -{ - uint32_t id; - - if (rids->n_ids == 0) { - return 0; - } - - if (!(rid_pool_find(rids, rids->next_free_id))) { - id = rids->next_free_id; - goto found_free_id; - } - - for(id = rids->base; id < rids->base + rids->n_ids; id++) { - if (!rid_pool_find(rids, id)) { - goto found_free_id; - } - } - - /* Not available. */ - return 0; - -found_free_id: - rid_pool_add(rids, id); - - if (id < rids->base + rids->n_ids) { - rids->next_free_id = id + 1; - } else { - rids->next_free_id = rids->base; - } - - return id; -} - -static void -rid_pool_free_id(struct rid_pool *rids, uint32_t id) -{ - struct rid_node *rid; - if (id > rids->base && (id <= rids->base + rids->n_ids)) { - rid = rid_pool_find(rids, id); - if (rid) { - hmap_remove(&rids->map, &rid->node); - } - } -} |